2017-11-21 4 views
0

Sklearn pageで説明されているように、私のカウントベクトルにlemmatizationを追加しました。 fit_transformを使用してDTMを作成するときにSklearn:CountVectorizerにlemmatizerを追加する

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) 

はしかし、私は(うち、私は意味がありません)以下のエラーが発生します。字句解析を私のベクタライザに追加する前に、dtmコードは常に有効でした。私はマニュアルに深く入り、コードでいくつか試しましたが、解決策は見つかりませんでした。

dtm_tf = tf_vectorizer.fit_transform(articles) 

アップデート:以下MaxUのアドバイス、エラーのないコードの実行@以下の後

、しかし、数字や句読点は私の出力からommitedされませんでした。私は個々のテストを実行して、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 

Appearantly、それだけでtoken_pattern非アクティブになった次のとおりです。ここでの結果です。ここで更新され、動作するコードは(私は最初の「PUNKT」と「WordNetの」パッケージをインストールするために必要な)token_patternなしです:数字を削除したい人のための

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文字の句読点や単語ここパンダデータフレームから作業するとき私のためにそれを行う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 

答えて

1

それは次のようになります。

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

の代わり:

+0

ご迷惑をおかけして申し訳ありませんが、コードは実際にエラーなく実行されます。しかし、 'LemmaTokenizer()'の後の関数はもう働きません。最も重要なのは、 'token_pattern = r '\ b [a-zA-Z] {3、} \ b''が非アクティブになりました(私の話題は数字と句読点がいっぱいです)。 1つのステップですべてを統合することは可能ですか?または、私は2つを分離するか? (そして数字と句読点を事前に削除する)。 – Rens

+0

@Rens、新しい質問を開き、小さな(3〜5行)再現可能なサンプルデータセットとコードを提供してください – MaxU

関連する問題