web-dev-qa-db-ja.com

NLTKとscikit-learnでのテキストのステミングと句読点の削除の組み合わせ

NLTKとscikit-learnCountVectorizerの組み合わせを使用して、単語のステミングとトークン化を行っています。

以下は、CountVectorizerの単純な使用例です。

from sklearn.feature_extraction.text import CountVectorizer

vocab = ['The swimmer likes swimming so he swims.']
vec = CountVectorizer().fit(vocab)

sentence1 = vec.transform(['The swimmer likes swimming.'])
sentence2 = vec.transform(['The swimmer swims.'])

print('Vocabulary: %s' %vec.get_feature_names())
print('Sentence 1: %s' %sentence1.toarray())
print('Sentence 2: %s' %sentence2.toarray())

印刷する

Vocabulary: ['he', 'likes', 'so', 'swimmer', 'swimming', 'swims', 'the']
Sentence 1: [[0 1 0 1 1 0 1]]
Sentence 2: [[0 0 0 1 0 1 1]]

ここで、ストップワードを削除して、そのワードをステミングしたいとします。 1つのオプションは、次のようにすることです。

from nltk import Word_tokenize          
from nltk.stem.porter import PorterStemmer

#######
# based on http://www.cs.duke.edu/courses/spring14/compsci290/assignments/lab02.html
stemmer = PorterStemmer()
def stem_tokens(tokens, stemmer):
    stemmed = []
    for item in tokens:
        stemmed.append(stemmer.stem(item))
    return stemmed

def tokenize(text):
    tokens = nltk.Word_tokenize(text)
    stems = stem_tokens(tokens, stemmer)
    return stems
######## 

vect = CountVectorizer(tokenizer=tokenize, stop_words='english') 

vect.fit(vocab)

sentence1 = vect.transform(['The swimmer likes swimming.'])
sentence2 = vect.transform(['The swimmer swims.'])

print('Vocabulary: %s' %vect.get_feature_names())
print('Sentence 1: %s' %sentence1.toarray())
print('Sentence 2: %s' %sentence2.toarray())

どの印刷:

Vocabulary: ['.', 'like', 'swim', 'swimmer']
Sentence 1: [[1 1 1 1]]
Sentence 2: [[1 0 1 1]]

しかし、この2番目のバージョンで句読文字を取り除くにはどうすればよいでしょうか?

20
user2489252

いくつかのオプションがあります。トークン化の前に句読点を削除してみてください。しかし、これはdon't-> dont

import string

def tokenize(text):
    text = "".join([ch for ch in text if ch not in string.punctuation])
    tokens = nltk.Word_tokenize(text)
    stems = stem_tokens(tokens, stemmer)
    return stems

または、トークン化後に句読点を削除してみてください。

def tokenize(text):
    tokens = nltk.Word_tokenize(text)
    tokens = [i for i in tokens if i not in string.punctuation]
    stems = stem_tokens(tokens, stemmer)
    return stems

編集済み

上記のコードは動作しますが、同じテキストを複数回ループするため、かなり遅いです:

  • 句読点を削除するには
  • トークン化する2回目
  • ステムする3回目。

数字の削除、ストップワードの削除、小文字化などのステップがある場合.

ステップを可能な限りまとめておくことをお勧めします。データにさらに多くの前処理ステップが必要な場合は、より効率的ないくつかの回答を次に示します。

26
alvas