我们如何使用任何词干算法在C#中执行反向词干?

时间:2017-06-14 13:24:26

标签: c# algorithm stemming porter-stemmer

是否有任何算法执行任何Stemmers算法的反转。也就是说,如果有一个词干“ 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));
        }
    }
    }

1 个答案:

答案 0 :(得分:0)

我建议使用词典。想象一下,你有一系列英文单词:

  // 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 } 您可以轻松找到原始字词:

@Component.InvokeAsync("WFActivities")