Finde mest forekommende ord i en tekst i et string[] array
Jeg har et en sætning: string saetning; saetning = "Der var et lille egern som kravlede op i et stort trae, for at spise en noed; Jeg har brugt Split metoden for string til at dele saetningen op i et array af ord.
string [] opsplittetSaetningIOrd = satning.Split(new char {' ', '.', ','}) Men så er mit problem, hvordan finder jeg det ord som forekommer flest gange i sætningen. Jeg har også brug for at finde den vokal der optræder flest gange i sætningen. Hvordan gør jeg det?
lytter lige med :), skal bruge noget til automatisk at generere keywords til meta :).. spytter gerne 200 points til den der kan splitte en streng til et array i ord, og sortere efter antal forekomster og til sidst kun indeholde de 25 vigtigste ord :)..
De sidste 25 ord skal minimum være på 4 bogstaver og ikke forekomme i et andet array :)
du kan overføre til en hashtable, hvor du bruger ordet som ID og value til tæller, og så bagefter sortere på den.
eks.
foreach(string ord in sætning) {´ if(hashtable.Contains(ord)¨ { HashTable[ord]++; } else { HashTable.Add(Ord, 1); } } Nu virker dette her ikke helt, men det giver en ide om hvordan, du kunne gøre.
public class WordCount : IComparable { string word; int count; public WordCount(string word) { this.word = word; this.count = 1; } public string Word { get { return word; } } public int Count { get { return count; } } public void Increment() { count++; } public int CompareTo(object o) { return ((WordCount)o).Count - count; } }
public class WordCountList { private Hashtable list; private int minlen; public WordCountList(int minlen) { this.list = new Hashtable(); this.minlen = minlen; } public void AddWord(string word) { if(word.Length >= minlen) { if(list.ContainsKey(word)) { ((WordCount)list[word]).Increment(); } else { list.Add(word, new WordCount(word)); } } } public void AddText(string text) { string[] words = text.Split(" ".ToCharArray()); for(int i = 0; i < words.Length; i++) { AddWord(words[i]); } } public ICollection GetTop(int n) { ArrayList temp = new ArrayList(); temp.AddRange(list.Values); temp.Sort(); temp.RemoveRange(n, temp.Count - n); return temp; } }
class TestClass { public static void Test(string s) { WordCountList proc = new WordCountList(1); proc.AddText(s); ICollection top = proc.GetTop(3); foreach(WordCount wc in top) { Console.WriteLine(wc.Word + " : " + wc.Count); } } public static void Main(string[] args) { Test(@"Dette er en lille test - er en en"); } }
Er der nogen speciel grund til at du også laver en klasse til Count af ord, er det for at kunne lave en Sort på den at den kommer i en klasse for sig selv?
Må se om jeg kan huske det her link til en anden gang, der bruger du jo nogle smarte teknikker :-P
Jeg overvejede også andre modeller, men jeg syntes ikke lige at jeg kunne se de andre hænge sammen på samme måde, 2 arrays string[] og int[] er hverken så OO pænt eller så nemt at håndtere (sorteringen er nem nok, men både hente ud fra Hashtable og returnereing fra GetTop bliver grimmere)
okay, sjovt nok også at vide hvad en proff programmør tænker på, men jeg synes også helt klart at det her en en pæn og nok også meget pænere end den måde jeg ville have lavet det på :-P
Keep up the good work
// ouT
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.