我搜索了很多理解这一点,但我不能。 据我所知,在默认情况下TfidfVectorizer将适用l2
词频正常化。 此文章解释了它的方程。 我使用写在古吉拉特语我的文字TfidfVectorizer。 以下是关于它输出的详细信息:
我的两个文件分别是:
ખુબ વખાણ કરે છે
ખુબ વધારે છે
我使用的代码是:
vectorizer = TfidfVectorizer(tokenizer=tokenize_words, sublinear_tf=True, use_idf=True, smooth_idf=False)
在这里, tokenize_words
是我的话标记化功能。 我的数据的TF-IDF的名单是:
[[ 0.6088451 0.35959372 0.35959372 0.6088451 0. ]
[ 0. 0.45329466 0.45329466 0. 0.76749457]]
功能列表:
['કરે', 'ખુબ', 'છે.', 'વખાણ', 'વધારે']
IDF的价值:
{'વખાણ': 1.6931471805599454, 'છે.': 1.0, 'કરે': 1.6931471805599454, 'વધારે': 1.6931471805599454, 'ખુબ': 1.0}
请解释我在这个例子中什么事每学期在我的两个文件的词频。
好了,现在让我们去通过我的意见给文档一步一步:
文件:
`ખુબ વખાણ કરે છે
ખુબ વધારે છે`
- 获取所有特别条款(
features
): ['કરે', 'ખુબ', 'છે.', 'વખાણ', 'વધારે']
计算文档每学期的频率: -
一个。 存在于文档1的每个术语[ખુબ વખાણ કરે છે]
存在一次,વધારે不present.`
湾 所以,术语频率向量(根据特征排序): [1 1 1 1 0]
C。 在书2将步骤a和b,我们得到[0 1 1 0 1]
d。 因此,我们的最终术语频矢量是[[1 1 1 1 0], [0 1 1 0 1]]
注 :这是你想要的词频
现在找到IDF(这是基于特征的,而不是文件为基础):
idf(term) = log(number of documents/number of documents with this term) + 1
1被添加到IDF值,以防止零个分裂。 它是由管辖"smooth_idf"
参数默认为真。
idf('કરે') = log(2/1)+1 = 0.69314.. + 1 = 1.69314.. idf('ખુબ') = log(2/2)+1 = 0 + 1 = 1 idf('છે.') = log(2/2)+1 = 0 + 1 = 1 idf('વખાણ') = log(2/1)+1 = 0.69314.. + 1 = 1.69314.. idf('વધારે') = log(2/1)+1 = 0.69314.. + 1 = 1.69314..
注 :这与你在问题显示的数据。
现在计算TF-IDF(这再次被计算文档的角度来看,根据特征排序计算):
一个。 对于文档1:
For 'કરે', tf-idf = tf(કરે) x idf(કરે) = 1 x 1.69314 = 1.69314 For 'ખુબ', tf-idf = tf(કરે) x idf(કરે) = 1 x 1 = 1 For 'છે.', tf-idf = tf(કરે) x idf(કરે) = 1 x 1 = 1 For 'વખાણ', tf-idf = tf(કરે) x idf(કરે) = 1 x 1.69314 = 1.69314 For 'વધારે', tf-idf = tf(કરે) x idf(કરે) = 0 x 1.69314 = 0
因此,对于文档1,最后的TF-IDF矢量为[1.69314 1 1 1.69314 0]
湾 现在,标准化完成(L2欧几里得):
dividor = sqrt(sqr(1.69314)+sqr(1)+sqr(1)+sqr(1.69314)+sqr(0)) = sqrt(2.8667230596 + 1 + 1 + 2.8667230596 + 0) = sqrt(7.7334461192) = 2.7809074272977876...
除以dividor的TF-IDF阵列中的每个元素,我们得到:
[0.6088445 0.3595948 0.3595948548 0.6088445 0]
注:这是你的问题发布firt文件的TFIDF。
C。 现在做同样的步骤a和b的文件2,我们得到:
[ 0. 0.453294 0.453294 0. 0.767494]
更新:关于sublinear_tf = True OR False
您原来的词频向量为[[1 1 1 1 0], [0 1 1 0 1]]
你在你的理解是正确的使用sublinear_tf =真会改变词频向量。
new_tf = 1 + log(tf)
现在,上面的线将仅在术语,frequecny非零元素的工作。 因为对于0,日志(0)是未定义的。
和所有非零项是:1 log(1)
是0和1 +日志(1)= 1 + 0 = 1`。
您将看到该值将保持不变的元素具有值1。所以你new_tf = [[1 1 1 1 0], [0 1 1 0 1]] = tf(original)
。
你的长期频率不断变化的,由于sublinear_tf
但它仍然保持不变。
因此下面的所有计算将是相同的,如果你使用的输出是一样sublinear_tf=True
OR sublinear_tf=False
。
现在,如果你改变你的证件,其中术语,frequecy载体包含比1和0等元素 ,你会得到使用的差异sublinear_tf
。
希望你的疑虑,现在都被清除。