gpt4 book ai didi

python - TfidfVectorizer 赋予停用词较高的权重

转载 作者:太空宇宙 更新时间:2023-11-03 19:50:58 29 4
gpt4 key购买 nike

给出以下代码:

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 |

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

最佳答案

您之所以注意到这一点有两个原因。

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

  • 第二个是因为你的数据。假设你修复了上面的代码问题,你的语料库仍然非常非常小,只有两个文档。这意味着两本书中出现的任何单词都会受到同样的惩罚。 “courage”可能会出现在两本书中,就像“the”一样,因此考虑到它们都出现在语料库的每个文档中,它们的 idf 值将是相同的,导致停用词由于其较大的术语而再次具有较大的分数 -频率

关于python - TfidfVectorizer 赋予停用词较高的权重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59845939/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com