0

是否有任何算法可以执行任何 Stemmers 算法的逆运算。也就是说,给定一个词干“ require ”,如何找到词干“require”的所有词?

我们总是会发现相同单词的变体,例如要求、要求、要求、要求。都有“要求”的共同点。如果我们可以合并一个功能来识别所有带有“require”的词,那就太好了。

我们尝试了 Stemmers 算法,它给出的结果如下:

  • 例外 - 除了
  • 没有 - 没有
  • 防止 - 防止
  • 临床 - 诊所
  • 披露,- 披露
  • 收集,-收集,

我们已经尝试了如下代码:

 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));
        }
    }
    }
4

1 回答 1

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 
  } 
于 2017-06-14T13:37:42.890 回答