2017-11-21 14 views
0

Sklearn page에서 설명한대로 내 countvectorizer에 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) 

그러나, 나는 (이 중 내가 이해를 할 수 없습니다) 아래의 오류가 발생합니다. leymatization을 벡터 라이저에 추가하기 전에 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 비활성 상태가 된 것입니다 : 여기 결과입니다.

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 자 미만의 단어 : 여기에 업데이트 token_pattern없이 작업 코드 (난 그냥 'PUNKT'먼저 '워드 넷'패키지를 설치하는 데 필요한)입니다 여기 팬더 dataframe에서 작업 할 때 나를 위해 그것을 않는 한 가지 방법은, (하지만 어떻게 아무 생각이 없음)

# 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:      ----------------------> ^^ 

대신 :

tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer, 
+0

귀하의 조언에 감사드립니다. 코드는 실제로 오류없이 실행됩니다. 그러나'LemmaTokenizer() '이후의 함수는 더 이상 작동하지 않습니다. 가장 중요한 점은'token_pattern = r '\ b [a-zA-Z] {3,} \ b''이 비활성 상태가되어서 내 주제가 숫자와 구두점으로 가득 찼다는 것입니다. 한 단계에 모든 것을 통합 할 수 있습니까? 아니면 둘을 분리할까요? (그리고 숫자와 구두점을 미리 제거하십시오). – Rens

+0

@Rens, 새 질문을 열고 작은 (3-5 행) 재현 가능한 샘플 데이터 세트와 코드를 제공하십시오. – MaxU