web-dev-qa-db-ja.com

Sklearn:LemmatizerをCountVectorizerに追加

この 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 
_
4
Rens

そのはず:

tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer(),
# NOTE:                        ---------------------->  ^^

の代わりに:

tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer,
7
MaxU