TfIdfVectorizer无法正确分词

问题描述 投票:0回答:1

就我而言,毫无疑问。我正在Kaggle从事NLP和情感分析项目,首先我正在准备数据。数据框是一个文本列,后跟一个从0到9的数字,该数字对行(文档)所属的群集进行分类。我在sklearn中使用TF-IDF Vectorizer。我想摆脱不是英语单词的任何东西,所以我使用以下内容:

class LemmaTokenizer(object):
    def __init__(self):
        self.wnl = WordNetLemmatizer()
    def __call__(self, doc):
        return [self.wnl.lemmatize(t) for t in word_tokenize(doc)]

s_words = list(nltk.corpus.stopwords.words("english"))

c = TfidfVectorizer(sublinear_tf=False,
                    stop_words=s_words,
                    token_pattern =r"(?ui)\\b\\w*[a-z]+\\w*\\b",
                    tokenizer = LemmaTokenizer(),
                    analyzer = "word",
                    strip_accents = "unicode")

#a_df is the original dataframe
X = a_df['Text']
X_text = c.fit_transform(X)

据我所知,在调用c.get_feature_names()时,应仅返回属于正确单词的标记,而没有数字或标点符号。我在StackOverflow的一篇博文中找到了正则表达式,但是使用更简单的正则表达式(如[a-zA-Z]+)将完全相同(这没什么)。当我调用功能名称时,会得到类似

的信息
["''abalone",
"#",
"?",
"$",
"'",
"'0",
"'01",
"'accidentally",
...]

这些只是示例,但是它代表了我得到的输出,而不仅仅是文字。我一直在尝试不同的正则表达式或方法来使用它。甚至对停用词上的某些功能的输出进行了硬编码。我之所以这样问是因为稍后我要使用LDA来获取每个聚类的主题,并获得标点符号作为“主题”。希望我不要重复其他帖子。我需要提供的信息会很高兴。预先谢谢!

python machine-learning scikit-learn nlp kaggle
1个回答
0
投票

如果您传递自定义标记器,则将忽略正则表达式模式。文档中未提及,但是您可以在源代码中清楚地看到它:

https://github.com/scikit-learn/scikit-learn/blob/9e5819aa413ce907134ee5704abba43ad8a61827/sklearn/feature_extraction/text.py#L333

def build_tokenizer(self):
    """Return a function that splits a string into a sequence of tokens.
    Returns
    -------
    tokenizer: callable
          A function to split a string into a sequence of tokens.
    """
    if self.tokenizer is not None:
        return self.tokenizer
    token_pattern = re.compile(self.token_pattern)
    return token_pattern.findall

如果self.tokenizer不是None,则不会对令牌模式执行任何操作。

解决这个问题很简单,只需将正则表达式令牌模式放入自定义令牌生成器中,然后使用它来选择令牌。

© www.soinside.com 2019 - 2024. All rights reserved.