4

類似性プログラムにストップ ワードを入れてから、ステマーを入れようと考えています (ポーター 1 または 2 を使用するかどうかは、実装が最も簡単かどうかによって異なります)。

ファイルからテキストを行全体として読み取り、それらを長い文字列として保存するので、2つの文字列を取得した場合、ex.

String one = "I decided buy something from the shop.";
String two = "Nevertheless I decidedly bought something from a shop.";

その弦を手に入れた今

ステミング: ステマー アルゴリズムを直接使用し、文字列として保存してから、プログラムにステマーを実装する前に行ったように、one.stem(); を実行するなどして、類似性に関する作業を続けることはできますか? ものの種類?

ストップ ワード: これはどのように機能しますか? 私はただ使っていますか?one.replaceall("私", ""); または、このプロセスに使用する特定の方法はありますか? 類似性アルゴリズムを使用して類似性を取得する前に、文字列の操作を続けて文字列を取得したいと考えています。ウィキは多くを語らない。

あなたが私を助けてくれることを願っています!ありがとう。

編集:学校関連のプロジェクトで、異なるアルゴリズム間の類似性に関する論文を書いているため、lucene や他のライブラリを使用することは許可されていないと思います。さらに、Lucene などのライブラリを使い始める前に、それがどのように機能するかを試して理解したいと思います。あまりご迷惑をお掛けしませんように(^^)

4

3 に答える 3

11

学術的な理由でこれを実装していない場合は、Luceneライブラリの使用を検討する必要があります。いずれにせよ参考になると思います。トークン化、ストップ ワード フィルタリング、ステミング、および類似性のためのクラスがあります。Lucene 3.0 を使用してストップ ワードを削除し、入力文字列をステミングする簡単な例を次に示します。

public static String removeStopWordsAndStem(String input) throws IOException {
    Set<String> stopWords = new HashSet<String>();
    stopWords.add("a");
    stopWords.add("I");
    stopWords.add("the");

    TokenStream tokenStream = new StandardTokenizer(
            Version.LUCENE_30, new StringReader(input));
    tokenStream = new StopFilter(true, tokenStream, stopWords);
    tokenStream = new PorterStemFilter(tokenStream);

    StringBuilder sb = new StringBuilder();
    TermAttribute termAttr = tokenStream.getAttribute(TermAttribute.class);
    while (tokenStream.incrementToken()) {
        if (sb.length() > 0) {
            sb.append(" ");
        }
        sb.append(termAttr.term());
    }
    return sb.toString();
}

次のように文字列で使用すると、次のようになります。

public static void main(String[] args) throws IOException {
    String one = "I decided buy something from the shop.";
    String two = "Nevertheless I decidedly bought something from a shop.";
    System.out.println(removeStopWordsAndStem(one));
    System.out.println(removeStopWordsAndStem(two));
}

次の出力が得られます。

decid bui someth from shop
Nevertheless decidedli bought someth from shop
于 2011-05-25T10:50:08.703 に答える
0

はい、ステマーをラップして、次のようなものを書くことができます

String stemmedString = stemmer.stemAndRemoveStopwords(inputString, stopWordList);

内部的には、stemAndRemoveStopwordsは

  • すばやく参照できるように、すべてのストップワードをマップに配置します
  • 空のStringBuilderを初期化して、出力文字列を保持します
  • 入力文字列内のすべての単語を繰り返し、各単語について
    • stopWordListで検索します。見つかった場合は、ループの先頭に進みます
    • それ以外の場合は、好みのステマーを使用してステミングし、出力文字列に追加します
  • 出力文字列を返します
于 2011-05-25T10:38:28.317 に答える
0

全文を扱う必要はありません。それを分割し、ストップワード フィルターとステミング アルゴリズムを適用してから、次を使用して文字列を再度作成しますStringBuilder

StrinBuilder builder = new StringBuilder(text.length());
String[] words = text.split("\\s+");
for (String word : words) {
    if (stopwordFilter.check(word)) { // Apply stopword filter.
        word = stemmer.stem(word); // Apply stemming algorithm.
        builder.append(word);
    }
}
text = builder.toString();
于 2011-05-25T11:22:48.063 に答える