CountVectorizer 方法 get_feature_names() 生成代码但不生成单词
Posted
技术标签:
【中文标题】CountVectorizer 方法 get_feature_names() 生成代码但不生成单词【英文标题】:CountVectorizer method get_feature_names() produces codes but not words 【发布时间】:2018-05-05 07:15:36 【问题描述】:我正在尝试使用 sklearn CountVectorizer 对一些文本进行矢量化。之后,我想看看生成矢量化器的特征。但相反,我得到了一个代码列表,而不是单词。这是什么意思以及如何处理这个问题?这是我的代码:
vectorizer = CountVectorizer(min_df=1, stop_words='english')
X = vectorizer.fit_transform(df['message_encoding'])
vectorizer.get_feature_names()
我得到以下输出:
[u'00',
u'000',
u'0000',
u'00000',
u'000000000000000000',
u'00001',
u'000017',
u'00001_copy_1',
u'00002',
u'000044392000001',
u'0001',
u'00012',
u'0004',
u'0005',
u'00077d3',
等等。
我需要真实的特征名称(单词),而不是这些代码。有人可以帮帮我吗?
更新: 我设法处理了这个问题,但是现在当我想查看我的单词时,我看到许多实际上不是单词的单词,而是毫无意义的字母集(见附件截图)。在我使用 CountVectorizer 之前,有人知道如何过滤这个词吗?
【问题讨论】:
显示你的 data.head() 整个数据框? 事实上,我的许多词(特征)都变得相连(没有空格)。我认为它降低了我的模型的预测准确性。什么会导致这个问题? 这个问题值得scikit-learn
社区更多关注。这个问题仍然存在,我浪费了一整天试图找出我的代码有什么问题!这应该已经修复了!
【参考方案1】:
您正在使用 min_df = 1 ,它将包括在至少一个文档中找到的所有单词,即。所有的话。 min_df 本身可以被认为是一个超参数来删除最常用的单词。我建议使用 spacy 来标记单词并将它们作为字符串加入,然后再将其作为 Count Vectorizer 的输入。
注意:您看到的功能名称实际上是您的词汇表的一部分。这只是噪音。如果要删除它们,请设置 min_df >1。
【讨论】:
我已经把它改成了min_df=2,但这并没有解决问题。恐怕当我尝试更多地增加这个超参数时,我会丢失一些重要的单词,这对文本的进一步分类非常有用。我想我需要以某种方式对文本进行预处理,但我不知道该怎么做。 您可以尝试使用 Spacy 对文本进行预处理吗? Spacy 是一个 NLP 工具包,非常适合命名实体识别和依赖解析等。您可以做的是,您可以使用 Spacy 标记文本,并使用依赖解析仅选择名词短语/单词并将其用作您的词汇表。 好的,如何在 Spacy 中使用依赖解析只选择名词词?你知道一些关于这方面的好教程吗? 我有 32 位 Windows 7,可以在上面安装 Spacy 吗?在 Spacy 网站上,他们说它与 64 位 Python 兼容... 或者我可以用 NLTK 做类似的事情吗?【参考方案2】:您可以通过以下方式得到您想要的:
vectorizer=CountVectorizer()
vectorizer.fit_transform(df['message_encoding'])
feat_dict=vectorizer.vocabulary_.keys()
【讨论】:
@Dmitrij Burlaj 如果有用的话,别忘了给我一点 不要忘记使用sorted(vectorizer.vocabulary_.keys())
以保持与vectorizer.get_feature_names()
相同的顺序返回功能名称已经排序!!!以上是关于CountVectorizer 方法 get_feature_names() 生成代码但不生成单词的主要内容,如果未能解决你的问题,请参考以下文章
CountVectorizer:transform 方法在单个文本行上返回多维数组
CountVectorizer 方法 get_feature_names() 生成代码但不生成单词
是否可以为 CountVectorizer 创建与 Scikit-learn 中的 DictVectorizer 可用的等效“限制”方法?