TfidfVectorizer дает большой вес, чтобы остановить слова - PullRequest
1 голос
/ 21 января 2020

Учитывая следующий код:

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   | whale    |
|-------|-----------|----------|
|Moby   | 0.707171  | 0.083146 |
|Bushido| 0.650069  | 0.000000 |

Что не имеет смысла для меня. Кто-нибудь может указать на ошибку в моем мышлении или кодировании?

1 Ответ

0 голосов
/ 21 января 2020

Есть две причины, почему вы наблюдаете это.

  • Первое из-за параметров, которые вы передали в Tfidf Vectorizer. Вы должны делать TfidfVectorizer(use_idf=True, ...), потому что это часть idf в tfidf (помните, что tf-idf - это произведение частоты термина и частоты обратного документа), которая будет штрафовать слова, которые встречаются во всех документах. Установив TfidfVectorizer(use_idf=False, ..), вы просто рассматриваете термин «частотная часть», что, очевидно, приводит к тому, что стоп-слова имеют больший балл

  • Второе из-за ваших данных. Предположим, вы устранили проблему с кодом выше, ваш корпус все еще очень маленький, всего два документа. Это означает, что любое слово, встречающееся в обеих книгах, будет наказываться одинаково. «смелость» может появиться в обеих книгах, так же как «the», и поэтому, поскольку они оба появляются в каждом документе вашего корпуса, их значение idf будет одинаковым, в результате чего стоп-слова снова будут иметь больший счет из-за их большего срока - частота

...