Из-за параметров norm
и smooth_idf
.По умолчанию оба значения имеют значение true.
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
texts = [
"good movie", "not a good movie", "did not like",
"i like it", "good one"
]
# using default tokenizer in TfidfVectorizer
tfidf = TfidfVectorizer(min_df=2, max_df=0.5,norm=None,smooth_idf=False, ngram_range=(1, 2))
features = tfidf.fit_transform(texts)
pd.DataFrame(
features.todense(),
columns=tfidf.get_feature_names()
)
Вывод:
good movie like movie not
0 1.916291 0.000000 1.916291 0.000000
1 1.916291 0.000000 1.916291 1.916291
2 0.000000 1.916291 0.000000 1.916291
3 0.000000 1.916291 0.000000 0.000000
4 0.000000 0.000000 0.000000 0.000000
По умолчанию формула, используемая sklearn для вычисления idf, равна log [ n / df(t) ] + 1
.Так что 0.91621 по вашему расчету и добавьте к нему 1.
Если вы сделаете smooth_idf=True
(по умолчанию), тогда формула будет иметь вид log [ (1 + n) / (1 + df(d, t)) ] + 1
Вывод tfidf = TfidfVectorizer(min_df=2, max_df=0.5,norm=None,smooth_idf=True, ngram_range=(1, 2))
будет
good movie like movie not
0 1.693147 0.000000 1.693147 0.000000
1 1.693147 0.000000 1.693147 1.693147
2 0.000000 1.693147 0.000000 1.693147
3 0.000000 1.693147 0.000000 0.000000
4 0.000000 0.000000 0.000000 0.000000
Как 0,707107??
Если вы видите, что для первой строки мы имеем 1.693417 (назовем это a) два раза, следовательно, l2 норма - это sqrt (a ^ 2 + a ^ 2), что равно sqrt (1.69^ 2 + 1,69 ^ 2) = sqrt (5,73349), что равно 2,3944.Теперь вы делите 1.693147 / 2.3944, вы получаете примерно 0,707107.
Прочитайте это Документация