TfidfVectorizer赋予停用词以高的权重

问题描述 投票:1回答:1

给出以下代码:

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 |

这对我来说毫无意义。任何人都可以指出我所做的思考或编码错误吗?

python scikit-learn tf-idf tfidfvectorizer
1个回答
0
投票

您观察此有两个原因。

  • 首先是由于您传递给Tfidf Vectorizer的参数。您应该这样做TfidfVectorizer(use_idf=True, ...),因为它是tfidf的idf部分(请记住tf-idf是词频和反向文档频率的乘积),将惩罚所有文档中出现的单词。通过设置 TfidfVectorizer(use_idf=False, ..),您只是在考虑词频部分,这显然会导致停用词的得分更高]]

  • 第二是由于您的数据。假设您解决了上面的代码问题,您的语料库仍然很小,只有两个文档。这意味着两本书中出现的任何单词都会以相同的方式受到惩罚。 “勇气”可能会像“ the”一样出现在两本书中,因此鉴于它们都出现在语料库的每个文档中,因此它们的idf值将相同,由于停用词的用词较长,因此它们的得分也再次提高了,频率

© www.soinside.com 2019 - 2024. All rights reserved.