为了账号安全,请及时绑定邮箱和手机立即绑定

TfidfVectorizer 赋予停用词高权重

TfidfVectorizer 赋予停用词高权重

九州编程 2022-07-05 19:18:48
给定以下代码:import pandas as pdfrom sklearn.feature_extraction.text import TfidfVectorizerimport urllib.request  # the lib that handles the url stufffrom bs4 import BeautifulSoupimport unicodedatadef 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 strippedmoby = 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 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

你观察这个有两个原因。

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

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


查看完整回答
反对 回复 2022-07-05
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信