Lucene里面的分词器里面有一个PorterStemFilter类,里就用到了著名的词干提取算法。所谓Stemming,就是词干,在英语中单词有多种变形。比如单复数加s,进行时加ing等等。在分词的时候,如果能够把这些变形单词的词根找出了,对搜索结果是很有帮助的。Stemming算法有很多了,三大主流算法是Porter stemming algorithmLovins stemming algorithmLancaster (Paice/Husk) stemming algorithm,还有一些改进的或其它的算法。这个PorterStemFilter里面调用的一个PorterStemmer就是Porter Stemming algorithm的一个实现。 其主页为http://tartarus.org/~martin/PorterStemmer/,也可查看其论文http://tartarus.org/~martin/PorterStemmer/def.txt。通过以下网页可以进行简单的测试:Porter's Stemming Algorithm Online[http://facweb.cs.depaul.edu/mobasher/classes/csc575/porter.html]。

     网上找了好久,才找到一个对此算法解释的文章,它用的是Java版的代码,这里我改成用.net版的。主要是把里面的函数作了一下注释,个人没做什么分析,本身是想的,结果看着就头痛。下面的东西都是来自这篇博文波特词干算法,我只是把这里的代码改成了.net的。

     接下来,是一系列工具函数。首先先介绍一下它们:

  • cons(i):参数i:int型;返回值bool型。当i为辅音时,返回真;否则为假。
/// <summary>
/// cons(i) 为真 <=> b[i] 是一个辅音 
/// </summary>
private bool cons(int i)
{
    switch (b[i])
    {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
            return false;
        case 'y':
            return (i == k0) ? true : !cons(i - 1);//y开头,为辅;否则看i-1位,如果i-1位为辅,y为元,反之亦然。 
        default:
            return true;
    }
}

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-01
  • 2021-12-22
  • 2021-12-26
  • 2021-11-26
猜你喜欢
  • 2021-06-17
  • 2022-12-23
  • 2022-12-23
  • 2021-12-22
  • 2021-10-13
  • 2022-01-24
相关资源
相似解决方案