首页 文章

Python scikit-learn从发言者的句子中选择单词

提问于
浏览
1

我正在尝试在包含两个发言者的句子的数据库上使用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 probably need to find the word in the i'th position of the feature vector, but I'm not sure how to do that.

2 回答

  • 0

    你的代码错了 . 你这样做:

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

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

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

    此外,带有 chi2SelectKBest 将仅过滤掉(删除)那些被发现独立于类的功能 . 所以剩下的功能对类有一些影响 . 但要想知道这种影响是正面还是负面(找到30个可以作为分隔这两个发言者的特征的最佳单词),这还不够 . 为此,您需要有一个分类模型,可以为与该类对应的单词(特征)分配权重 .

    有关详细信息,请参阅此处的示例:

  • 0

    你可以得到 SelectKBest 给出的前k个单词

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

相关问题