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;
    }
}

このクラスは、1 つのプレフィックスまたはサフィックスで機能します。プレフィックスまたはサフィックスのリストがクラスを通過し、それぞれ (str) と比較できるようにするための提案はありますか。あなたの親切な行動は本当に感謝しています。

4

4 に答える 4

2

独自のクラスをゼロから作成する代わりに (これが宿題でない限り)、既存のライブラリを決定的に使用します。この回答は、Porter Stemming Algorithm を実装するコードの例を提供します。

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)?$'

問題の 1 つは、ステミングがレンマタイゼーションほど正確ではないことです。Lematization には、正確性のために POS タグ付けが必要です。たとえば、doveが名詞の場合、 -ing接尾辞を追加したくありません。

もう 1 つの問題は、一部のサフィックスにはプレフィックスも必要であることです。たとえば、 en-rich-mentに-mentサフィックスを追加するには、 en--rich-を追加する必要があります。これは、接頭辞なしでサフィックスを追加できる-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

サフィックス/プレフィックスをコレクション ( など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 に答える