gpt4 book ai didi

python - TfIdfVectorizer 未正确标记

转载 作者:行者123 更新时间:2023-11-30 08:42:06 28 4
gpt4 key购买 nike

就我而言,不存在这样的问题。我正在 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来获取每个集群的主题并获取标点符号作为“主题”。我希望我没有重复另一篇文章。我很乐意提供任何需要提供的信息。预先感谢您!

最佳答案

如果您传递自定义标记生成器,则正则表达式模式将被忽略。文档中没有提到这一点,但是您可以在此处的源代码中清楚地看到它:

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,您将不会对 token 模式执行任何操作。

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

关于python - TfIdfVectorizer 未正确标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59096174/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com