TfidfVectorizer赋予停用词很高的权重

3

给定以下代码:

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
import urllib.request  # the lib that handles the url stuff
from bs4 import BeautifulSoup
import unicodedata

def remove_control_characters(s):
    base = ""
    for ch in s:
        if unicodedata.category(ch)[0]!="C":
            base = base + ch.lower()
        else:
            base = base + " "
    return base 

moby_dick_url='http://www.gutenberg.org/files/2701/2701-0.txt'

soul_of_japan = 'http://www.gutenberg.org/files/12096/12096-0.txt'

def extract_body(url):
    with urllib.request.urlopen(url) as s:
        data = BeautifulSoup(s).body()[0].string
        stripped = remove_control_characters(data)
        return stripped

moby = extract_body(moby_dick_url)    
bushido = extract_body(soul_of_japan)

corpus = [moby,bushido]

vectorizer = TfidfVectorizer(use_idf=False, smooth_idf=True)
tf_idf = vectorizer.fit_transform(corpus)
df_tfidf = pd.DataFrame(tf_idf.toarray(), columns=vectorizer.get_feature_names(), index=["Moby", "Bushido"])
df_tfidf[["the", "whale"]]

我本来期望在《白鲸》中,“鲸”这个词的tf-idf得分相对较高,但在《武士道:日本的灵魂》中得分较低,“the”这个词在两本书中都得分较低。然而,实际结果与我的预期相反。计算出来的结果如下:

|       |     the   | whale    |
|-------|-----------|----------|
|Moby   | 0.707171  | 0.083146 |
|Bushido| 0.650069  | 0.000000 |

这对我来说毫无意义。有人能指出我在思考或编码中犯的错误吗?

1个回答

2

出现这个问题的原因有两个。

  • 第一个原因是您传递给TfidfVectorizer的参数。您应该使用TfidfVectorizer(use_idf=True, ...),因为它是tfidf(记住tf-idf是词频和逆文档频率的乘积)中idf部分将惩罚出现在所有文档中的单词。通过设置TfidfVectorizer(use_idf=False, ...),您只考虑了词频部分,这显然会导致停用词得分更高。

  • 第二个原因是您的数据。假设您解决了上面的代码问题,您的语料库仍然非常小,只有两篇文档。这意味着在两本书中出现的任何单词都会被同样惩罚。"courage"可能会出现在两本书中,就像"the"一样,因此,由于它们在语料库中的每个文档中都出现,它们的idf值将相同,因此停用词再次得分更高,因为它们的词频更大。


谢谢!我会接受你的答案。我实际上没有注意到use_idf=False的问题,这是我为了看看设置是否有任何区别而进行的实验的反映。正如你上面提到的第二个原因,确实没有区别。 - James Hamilton
1
我猜测Scikit的实现使用了类似于log(N/(nt+1))的idf公式,因为如果使用Sparck-Jones的原始公式,一个出现在所有文档中的单词会导致log(N/N) = 0 - James Hamilton
@JamesHamilton,是的确实如此! - MaximeKan
这个相关答案解决了同样的问题,并提供了sklearn的TfidfVectorizer和标准Tf-idf公式之间结果的有趣比较。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接