15

我在我的 countvectorizer 中添加了词形还原,正如这个Sklearn 页面中所解释的那样。

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)

但是,在使用 创建dtmfit_transform,我收到以下错误(我无法理解)。在将词形还原添加到我的矢量化器之前,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 数据框时为我完成的一种方法

# 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

2 回答 2

14

它应该是:

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

代替:

tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer,
于 2017-11-21T23:59:38.420 回答
1

感谢您的代码,它对我有帮助。这是处理 inactive 的另一种方法token_pattern

import re
class LemmaTokenizer:
    def __init__(self):
        self.wnl = WordNetLemmatizer()
    def __call__(self, doc):
        regex_num_ponctuation = '(\d+)|([^\w\s])'
        regex_little_words = r'(\b\w{1,2}\b)'
        return [self.wnl.lemmatize(t) for t in word_tokenize(doc) 
                if not re.search(regex_num_ponctuation, t) and not re.search(regex_little_words, t)]

用 Regex 进入类 LemmaTokenizer。

于 2021-12-24T13:36:31.973 回答