我正在尝试以下词干类:
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)进行比较。你的善意行动真的很感激。
答案 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 - 之类的根不同,你可以添加后缀,不带任何前缀。