Python scikit-learn 从演讲者的句子中选择最佳单词

Posted

技术标签:

【中文标题】Python scikit-learn 从演讲者的句子中选择最佳单词【英文标题】:Python scikit-learn SelectKBest words from sentences by speakers 【发布时间】:2019-05-10 18:49:41 【问题描述】:

我正在尝试在包含来自两个说话者的句子的数据库上使用 scikit-learn 函数 SelectKBest。 我的目标是找到 30 个可以作为区分这两个扬声器的特征的最佳单词,我想将它们打印到屏幕上。

句子存储在列表sentences[] 中,我知道每个句子的说话者是谁(存储在另一个列表speakers[] 中)

我还需要为这 K 个最佳特征创建向量,并能够在这些向量上使用分类器。

当前代码:(sentences 包含每个说话者 10000 个句子,已排序)

speakers = [0] * 10000 + [1] * 10000
vectorizer = TfidfVectorizer()
vectors = vectorizer.fit_transform(sentences)

kbest = SelectKBest(chi2, k=30).fit(vectors, speakers)
outcome = kbest.get_support()
for i in range(0,len(sentences)):
    if outcome[i]:
        print (sentences[i])

我不确定它是否找到了正确的单词或选择了整个句子,我也不确定如何打印它找到的单词。 (目前,它显然会打印整个句子,因为我正在直接打印一个与 SelectKBest 找到的具有匹配索引的句子)。

我可能需要在特征向量的第 i 个位置找到单词,但我不知道该怎么做。

【问题讨论】:

如果您的问题包含一个最小、完整和可验证的示例会更好***.com/help/mcve 谢谢@HenriqueAndrade,我已经添加了我当前代码的示例。 【参考方案1】:

可以得到SelectKBest给出的top k词

print([vectorizer.get_feature_names()[idx] for idx,flag in enumerate(outcome) if flag])

【讨论】:

【参考方案2】:

您的代码错误。你正在这样做:

outcome = kbest.get_support()
for i in range(0,len(sentences)):
    if outcome[i]:
        print (sentences[i])

kbest.get_support() 将返回数据特征的布尔数组,而不是句子。但是您在句子数组上比较(迭代)它们,这没有任何意义。

SelectKBest 将根据传入的实际功能决定保留或不保留哪些功能。并且这些特征作为来自TfidfVectorizer 的单词(而不是句子)的形式传递给它。

另外,SelectKBestchi2 只会过滤掉(删除)那些被发现独立于类的特性。所以剩下的特性对类有一些影响。但是要确定这种影响是积极的还是消极的(找到 30 个可以作为区分这两个说话者的特征的最佳单词),这还不够。为此,您将需要一个分类模型,该模型可以为与该类对应的那些词(特征)分配权重。

更多详情请参见此处的示例:

https://eli5.readthedocs.io/en/latest/tutorials/sklearn-text.html#baseline-model

【讨论】:

以上是关于Python scikit-learn 从演讲者的句子中选择最佳单词的主要内容,如果未能解决你的问题,请参考以下文章

如何从 python (ModuleNotFoundError) 运行带有 scikit-learn 0.24 版的“spherecluster”包?

将经过训练的 SVM 从 scikit-learn 导入到 OpenCV

将 PMML 模型导入 Python (Scikit-learn)

python 和 scikit-learn 实现垃圾邮件过滤

scikit-learn python的线性回归模拟

从 Python 控制 Libreoffice Impress