この Sklearnページ で説明されているように、countvectorizerにレンマ化を追加しました。
_from nltk import Word_tokenize
from nltk.stem import WordNetLemmatizer
class LemmaTokenizer(object):
def __init__(self):
self.wnl = WordNetLemmatizer()
def __call__(self, articles):
return [self.wnl.lemmatize(t) for t in Word_tokenize(articles)]
tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer,
strip_accents = 'unicode',
stop_words = 'english',
lowercase = True,
token_pattern = r'\b[a-zA-Z]{3,}\b', # keeps words of 3 or more characters
max_df = 0.5,
min_df = 10)
_
ただし、_fit_transform
_を使用してdtmを作成すると、以下のエラーが発生します(意味がわかりません)。レンマ化をベクトライザーに追加する前は、dtmコードは常に機能していました。マニュアルを深く掘り下げて、コードでいくつかのことを試しましたが、解決策が見つかりませんでした。
_dtm_tf = tf_vectorizer.fit_transform(articles)
_
更新:
以下の@MaxUのアドバイスに従った後、コードはエラーなしで実行されましたが、数値と句読点は出力から省略されませんでした。個々のテストを実行して、LemmaTokenizer()
の後の他の関数のどれが機能するか機能しないかを確認します。結果は次のとおりです。
_strip_accents = 'unicode', # works
stop_words = 'english', # works
lowercase = True, # works
token_pattern = r'\b[a-zA-Z]{3,}\b', # does not work
max_df = 0.5, # works
min_df = 10 # works
_
どうやら、非アクティブになったのは_token_pattern
_だけです。 _token_pattern
_なしで更新され動作するコードは次のとおりです(最初に「punkt」および「wordnet」パッケージをインストールする必要がありました)。
_from nltk import Word_tokenize
from nltk.stem import WordNetLemmatizer
class LemmaTokenizer(object):
def __init__(self):
self.wnl = WordNetLemmatizer()
def __call__(self, articles):
return [self.wnl.lemmatize(t) for t in Word_tokenize(articles)]
tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer(),
strip_accents = 'unicode', # works
stop_words = 'english', # works
lowercase = True, # works
max_df = 0.5, # works
min_df = 10) # works
_
3文字未満の数字、句読点、単語を削除したい(ただし、その方法がわからない)場合は、Pandas dataframe)から作業するときにこれを行う1つの方法があります。
_# when working from Pandas dataframe
df['TEXT'] = df['TEXT'].str.replace('\d+', '') # for digits
df['TEXT'] = df['TEXT'].str.replace(r'(\b\w{1,2}\b)', '') # for words
df['TEXT'] = df['TEXT'].str.replace('[^\w\s]', '') # for punctuation
_
そのはず:
tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer(),
# NOTE: ----------------------> ^^
の代わりに:
tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer,