如何词频在TfidfVectorizer计算?如何词频在TfidfVectorizer计算?(How

2019-05-12 13:41发布

我搜索了很多理解这一点,但我不能。 据我所知,在默认情况下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}

请解释我在这个例子中什么事每学期在我的两个文件的词频。

Answer 1:

好了,现在让我们去通过我的意见给文档一步一步:

文件:

`ખુબ વખાણ કરે છે
 ખુબ વધારે છે`
  1. 获取所有特别条款( features ): ['કરે', 'ખુબ', 'છે.', 'વખાણ', 'વધારે']
  2. 计算文档每学期的频率: -

    一个。 存在于文档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]]

    :这是你想要的词频

  3. 现在找到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.. 

    :这与你在问题显示的数据。

  4. 现在计算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

希望你的疑虑,现在都被清除。



文章来源: How term frequency is calculated in TfidfVectorizer?