2017-06-14 24 views
0

是否有任何算法執行任何Stemmers算法的逆向算法。也就是說,假設詞幹「要求」,如何找到詞幹「要求」的所有單詞?我們如何使用任何詞幹算法在C#中執行反向詞幹?

總是我們發現相同單詞的變體,例如要求,要求,要求,要求。所有人都有「共同需要」。如果我們可以結合一個特徵來識別所有詞幹「需要」的話,那將是非常好的。

我們試圖詞幹的算法,這使得結果是這樣的:

  • 例外 - 除了
  • 沒有 - 諾斯
  • 防止 - 防止
  • 臨牀 - 臨牀
  • 披露, - 披露
  • 收集, - 收集,

而且我們已經嘗試下面的代碼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string strStemPhrase = @"generate generates generated generating generously"; 

     string result = Regex.Replace(strStemPhrase, @"[\W_]+", " "); 

     string[] strStemmedWords = result.Split(new[] { " " }, StringSplitOptions.None); 

     TestStemmer(new EnglishStemmer(), strStemmedWords); 

     Console.ReadKey(); 
     return;   
    } 

    private static void TestStemmer(IStemmer stemmer, params string[] words) 
    { 
     Console.WriteLine("Stemmer: " + stemmer); 

     foreach (string word in words) 
     { 
      Console.WriteLine(word + " --> " + stemmer.Stem(word)); 
     } 
    } 
    } 
+2

「我們已經嘗試了下面的代碼:「...但是?你有什麼問題?代碼是否工作? – HimBromBeere

+0

是的這個代碼是工作......但我的問題是「如何找到所有詞幹」需要「?」 –

回答

0

我建議使用字典。試想一下,你的英語單詞的集合:

string[] EnglishWords = new string[] { 
    "a", 
    "abacus", 
    ... 
    "generate", 
    "generated", 
    "generates", 
    "generating", 
    "generously", 
    ... 
    "zymotic", 
    }; 

那麼你就可以構建一個字典:

// key: stem 
    // value: array of the original words 
    Dictionary<string, string[]> reversed = EnglishWords 
    .GroupBy(word => Stem(word)) //TODO: put stemming here 
    .ToDictionary(chunk => chunk.Key, 
        chunk => chunk.ToArray(), 
        StringComparer.OrdinalIgnoreCase); 

有一個stem,你可以很容易地找到原話:

string stem = "require"; 

    string[] words; 

    if (reversed.TryGetValue(stem, out words)) { 
    //TODO: put relevant code here 
    } 
+0

謝謝@Dmitry Bychenko它爲我工作...... :) –