单词词干类c#

时间:2012-05-09 18:08:47

标签: c#

我正在尝试以下词干类:

static class StemmerSteps
{
    public static string stepSufixremover(this string str, string suffex)
    {
        if (str.EndsWith(suffex))
        {
            ................
        }
        return str;
    } 

    public static string stepPrefixemover(this string str, string prefix)
    {
        if (str.StartsWith(prefix) 
        {
            .....................
        }
        return str;
    }
}

此类使用一个前缀或后缀。是否有任何建议允许前缀或后缀列表通过该类并与每个(str)进行比较。你的善意行动真的很感激。

4 个答案:

答案 0 :(得分:2)

不是从头开始创建自己的类(除非这是家庭作业),我肯定会使用现有的库。这个答案提供了一个实现Porter Stemming算法的代码示例:

https://stackoverflow.com/questions/7611455/how-to-perform-stemming-in-c

答案 1 :(得分:0)

修改

考虑您的评论:

“只想查看字符串是否以任何传递的字符串开始/结束”

可能是这样的,可以满足您的需求:

public static string stepSufixremover(this string str, IEnumerable<string> suffex)
{           
   string suf = suffex.Where(x=>str.EndsWith(x)).SingleOrDefault();
   if(!string.IsNullOrEmpty(suf))
   {            
    str = str.Remove(str.Length - suf.Length, suf.Length);
   }
   return str;
} 

如果您使用它:

"hello".stepone(new string[]{"lo","l"}).Dump();

它产生:

hel

答案 2 :(得分:0)

将后缀/前缀放在集合中(如List<>),然后循环并应用每个可能的前缀/前缀。这个集合需要传递给方法。

List<string> suffixes = ...;
for (suffix in suffixes)
    if (str.EndsWith(suffix))
        str = str.Remove(str.Length - suffix.Length, suffix.Length);

答案 3 :(得分:0)

最简单的代码涉及正则表达式。

例如,这会识别一些英文后缀:

'^(.*?)(ing|ly|ed|ious|ies|ive|es|s|ment)?$'

一个问题是词干化不如词形还原那么准确。 Lematization将要求POS标记的准确性。例如,如果它是名词,您不希望将 -ing 后缀添加到 dove

另一个问题是某些后缀也需要前缀。例如,您必须将 en - 添加到 -rich - 以在 en-rich-ment中添加 -ment 后缀 - 与 -govern - 之类的根不同,你可以添加后缀,不带任何前缀。