Nltkツールキットを使用してストップワードを削除することにより、ユーザーが入力したテキストを処理しようとしていますが、ストップワードを削除すると、「and」、「or」、「not」などの単語が削除されます。これらの単語は、後でテキストをクエリとして処理するために必要な演算子であるため、ストップワード削除プロセス後に存在するようにします。テキストクエリで演算子になる可能性のある単語がどれなのかわかりません。また、テキストから不要な単語を削除したいです。
ストップワードリストから除外する演算子語の独自のリストを作成することをお勧めします。セットは簡単に減算できるため、次のようになります。
operators = set(('and', 'or', 'not'))
stop = set(stopwords...) - operators
その後、演算子がストップワードリストの一部であるかどうかに依存することなく、Wordがin
またはnot in
セットであるかどうかを簡単にテストできます。その後、別のストップワードリストに切り替えるか、演算子を追加できます。
if Word.lower() not in stop:
# use Word
NLTK
には、11言語の2,400個のストップワードで構成される組み込みのストップワードリストがあります(Porter et al)、 http://nltk.org/book/ch02.html を参照してください
>>> from nltk import Word_tokenize
>>> from nltk.corpus import stopwords
>>> stop = set(stopwords.words('english'))
>>> sentence = "this is a foo bar sentence"
>>> print([i for i in sentence.lower().split() if i not in stop])
['foo', 'bar', 'sentence']
>>> [i for i in Word_tokenize(sentence.lower()) if i not in stop]
['foo', 'bar', 'sentence']
Tf-idfを使用してストップワードを削除することをお勧めします。 用語頻度のステミングの効果?
@alvasの答えは仕事をしますが、もっと速く行うことができます。 documents
:文字列のリストがあると仮定します。
from nltk.corpus import stopwords
from nltk.tokenize import wordpunct_tokenize
stop_words = set(stopwords.words('english'))
stop_words.update(['.', ',', '"', "'", '?', '!', ':', ';', '(', ')', '[', ']', '{', '}']) # remove it if you need punctuation
for doc in documents:
list_of_words = [i.lower() for i in wordpunct_tokenize(doc) if i.lower() not in stop_words]
ここでは(リストではなく)セットで検索しているという事実により、速度は理論的にはlen(stop_words)/2
倍速くなります。これは、多くのドキュメントを操作する必要がある場合に重要です。
それぞれ約300ワードの5000ドキュメントの場合、違いは私の例では1.8秒、@ alvasの場合は20秒です。
追伸ほとんどの場合、tf-idfが使用されている他の分類タスクを実行するには、テキストを単語に分割する必要があります。したがって、おそらくステム機能も使用することをお勧めします。
from nltk.stem.porter import PorterStemmer
porter = PorterStemmer()
そして、ループ内で[porter.stem(i.lower()) for i in wordpunct_tokenize(doc) if i.lower() not in stop_words]
を使用します。
@alvasには良い答えがあります。ただし、これもタスクの性質に依存します。たとえば、アプリケーションでは、すべてのconjunction
を考慮する必要があります。 andまたはor、but、if、whileおよびすべてのdeterminer
例: the、a、some、most、every、no他のすべての品詞を正当なものとみなすストップワードとして、このソリューションを検討することをお勧めします品詞タグセットを使用して単語を破棄します 表5.1を確認 :
import nltk
STOP_TYPES = ['DET', 'CNJ']
text = "some data here "
tokens = nltk.pos_tag(nltk.Word_tokenize(text))
good_words = [w for w, wtype in tokens if wtype not in STOP_TYPES]
string.punctuation を組み込みのNLTKストップワードリストで使用できます。
from nltk.tokenize import Word_tokenize, sent_tokenize
from nltk.corpus import stopwords
from string import punctuation
words = tokenize(text)
wordsWOStopwords = removeStopWords(words)
def tokenize(text):
sents = sent_tokenize(text)
return [Word_tokenize(sent) for sent in sents]
def removeStopWords(words):
customStopWords = set(stopwords.words('english')+list(punctuation))
return [Word for Word in words if Word not in customStopWords]
NLTKストップワード完了 リスト