Python scikit-学习SelectKB演讲者句子中的最佳单词

时间:2018-12-09 19:47:00

标签: python scikit-learn

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

这些句子存储在列表sentences[]中,我了解到每个句子的讲话者是谁(存储在另一个列表speakers[]中)

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

当前代码:(每个演讲者的句子包含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个位置找到单词,但是我不确定该怎么做。

2 个答案:

答案 0 :(得分:0)

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

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

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

SelectKBest将根据传递给它的实际功能来决定保留或不保留哪些功能。这些功能以TfidfVectorizer中单词(不是句子)的形式传递给它。

此外,SelectKBestchi2只会过滤掉(删除)那些与类无关的功能。因此,其余功能会对类产生一些影响。但是要找出影响是希望的是正面的还是负面的(找到30个可以充当分隔这两个说话者的功能的最佳单词),这还不够。为此,您将需要一个分类模型,该模型可以为与该类相对应的那些单词(特征)分配权重。

有关更多详细信息,请参见此处的示例:

答案 1 :(得分:0)

您可以获得SelectKBest给出的前k个单词

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