2016-02-19 59 views
1

香港專業教育學院得到了以下的C#代碼:C#比較關鍵字輸入

string textBoxInput = richTextBox1.Text; 
       StreamReader SentencesFile = new StreamReader(@"C:\Users\Jeroen\Desktop\School\C#\opwegmetcsharp\answersSen.txt"); 
       string Sentence = SentencesFile.ReadLine(); 
       List<List<string>> keywordsList = new List<List<string>>(); 
       List<string> outputSentence = new List<string>(); 

       while (Sentence != null) 
       { 
        string keywords = Sentence.Substring(0, Sentence.IndexOf(' ')); 
        string sentenceString = Sentence.Substring(0, Sentence.IndexOf(' ') +1); 
        List<string> splitKeyword = keywords.Split(',').ToList(); 
        keywordsList.Add(splitKeyword); 
        outputSentence.Add(sentenceString); 
       } 
       int similar = 0; 
       int totalSimilar = 0; 
       List<string> SplitUserInput = textBoxInput.Split(' ').ToList(); 

幷包含以下內容的.txt文件:

car,bmw Do you own a BMW? 
car,Tesla Do you own a Tesla? 
new,house Did you buy a new house? 
snow,outside Is it snowing outside? 
internet,down Is your internet down? 

我無法弄清楚如何我可以比較每用戶在輸入(richTextBox1.Text)中鍵入.txt文件中的關鍵字(如第一句話的汽車和寶馬) 而且它還必須記住具有最高「命中」數量的句子。 我真的被卡住和搜查了很多,但不知何故,我無法找到我如何做到這一點。

很多預先感謝!

+0

還有一個當前的問題。由於以下原因,內存不足:列表 splitKeyword = keywords.Split(',')。ToList(); – JeroenM

+0

實現這樣的搜索算法並不容易。請參考谷歌搜索設備(GSA)的第三方算法 –

+0

呃...你不需要一種先進的算法來簡單地比較列表中的單詞...... – Gabe

回答

1

您可以使用LINQ Contains來檢查是否在列表中找到一個單詞。但要小心,因爲它是密碼區分大小寫的。使用這樣的:

​​

然後對每個句子,在這種形式假設:

string sentence1 = "Hi, this keYWord1 present! But quite malformed"; 
string sentence2 = "keywoRD2 and keyWOrd1 also present here, malformed"; 

注:以上的句子可以從RichTextBox或文件文本,它並不重要。這裏我只展示了這個概念。

你可以這樣做:

string[] words = sentence1.ToLower().Split(new char[] { ' ', ',', '.' }); 
int counter = 0; 
for (int i = 0; i < words.Length; ++i){ 
    counter += keywords.Contains(words[i]) ? 1 : 0; 
} 

而且你可以爲sentence2也這樣做。誰獲得最高點counter的點擊率最高。

1

對於第一年的學生來說這可能太過先進,但這段代碼可以滿足您的需求。使用Regex類爲您做匹配。性能方面更快(AFAIK)。我使用了一個控制檯應用程序來處理這個問題,因爲我認爲在WinForms/WPF應用程序中使用它不會很難。

  string textBoxInput = "car test do bmw"; // Just a sample as I am using a console app 
      string[] sentences = File.ReadAllLines("sentences.txt"); // Read all lines of a text file and assign it to a string array 
      string[] keywords = textBoxInput.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); // Split textBoxInput by space 
      int[] matchArray = new int[sentences.Length]; 

      for(int i = 0; i < sentences.Length; i++) 
      { 
       Regex regex = new Regex(@"\b(" + string.Join("|", keywords.Select(Regex.Escape).ToArray()) + @"+\b)", RegexOptions.IgnoreCase); 
       MatchCollection matches = regex.Matches(sentences[i]); 
       matchArray[i] = matches.Count; 
      } 

      int highesMatchIndex = Array.IndexOf(matchArray, matchArray.OrderByDescending(item => item).First()); 

      Console.WriteLine("User input: " + textBoxInput); 
      Console.WriteLine("Matching sentence: " + sentences[highesMatchIndex]); 
      Console.WriteLine("Match count: " + matchArray[highesMatchIndex]); 

      Console.ReadLine();