1

我正在尝试以下词干类:

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

4 回答 4

2

我不会从头开始创建自己的课程(除非这是家庭作业),我会明确地使用现有的库。这个答案提供了一个实现波特词干算法的代码示例:

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

于 2012-05-09T18:14:36.710 回答
0

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

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

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

一个问题是词干提取不如词形还原准确。Lematization 将需要 POS 标记以确保准确性。例如,如果 dove 是名词,您不希望在dove后添加-ing后缀。

另一个问题是一些后缀也需要前缀。例如,您必须将en-添加到-rich-以在en-rich-ment中添加-ment后缀- 不像-govern-这样的根,您可以在不添加任何前缀的情况下添加后缀。

于 2014-09-25T23:54:01.713 回答
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
于 2012-05-09T18:12:23.117 回答
0

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

List<string> suffixes = ...;
for (suffix in suffixes)
    if (str.EndsWith(suffix))
        str = str.Remove(str.Length - suffix.Length, suffix.Length);
于 2012-05-09T18:13:06.413 回答