6

string があるとしますtext = "A compiler translates code from a source language"。私は2つのことをしたい:

  1. NLTKライブラリを使用して、各単語とステムを反復処理する必要があります。ステミングの機能はPorterStemmer().stem_word(word). 引数 'word' を渡す必要があります。各単語をステム処理して、ステム処理された文を戻すにはどうすればよいですか?

  2. 文字列から特定のストップ ワードを削除する必要がありtextます。ストップ ワードを含むリストは、テキスト ファイルに保存されます (スペース区切り)。

    stopwordsfile = open('c:/stopwordlist.txt','r+')
    stopwordslist=stopwordsfile.read()
    

    textこれらのストップワードを削除して、きれいな新しい文字列を取得するにはどうすればよいですか?

4

2 に答える 2

9

私はこれをコメントとして投稿しましたが、いくつかの説明を付けて完全な答えに具体化したほうがよいと思いました。

を使用str.split()して文字列を単語に分割し、各単語を語幹にします。

for word in text.split(" "):
    PorterStemmer().stem_word(word)

語幹のあるすべての単語の文字列をまとめたいので、これらの語幹を結合して戻すのは簡単です。これを簡単かつ効率的に行うためstr.join()に、ジェネレータ式を使用します。

" ".join(PorterStemmer().stem_word(word) for word in text.split(" "))

編集:

あなたの他の問題のために:

with open("/path/to/file.txt") as f:
    words = set(f)

ここではwithステートメントを使用してファイルを開き(例外が発生した場合でもファイルを正しく閉じることができ、読みやすくなるため、ファイルを開くのに最適な方法です)、内容をセットに読み込みます。単語の順序や重複を気にしないのでセットを使用しますが、後で効率的になります。1行に1語と推測しています。そうでない場合は、コンマで区切るか、空白で区切ってから、str.split()以前と同じように(適切な引数を使用して)使用することをお勧めします。

stems = (PorterStemmer().stem_word(word) for word in text.split(" "))
" ".join(stem for stem in stems if stem not in words)

ここでは、ジェネレータ式のif句を使用して、ファイルからロードした単語のセットに含まれる単語を無視します。セットのメンバーシップチェックはO(1)であるため、これは比較的効率的です。

編集2:

語幹に入る前に単語を削除するには、さらに簡単です。

" ".join(PorterStemmer().stem_word(word) for word in text.split(" ") if word not in words)

与えられた単語の削除は単純です:

filtered_words = [word for word in unfiltered_words if not in set_of_words_to_filter]
于 2012-05-08T20:22:50.097 に答える
4

文字列内の各単語を調べるには:

for word in text.split():
    PorterStemmer().stem_word(word)

文字列の結合方法 (Lattyware が推奨) を使用して、断片を 1 つの大きな文字列に連結します。

" ".join(PorterStemmer().stem_word(word) for word in text.split(" "))
于 2012-05-08T20:12:37.917 に答える