gpt4 book ai didi

python-3.x - 如何在 TfidfVectorizer 中计算词频?

转载 作者:行者123 更新时间:2023-12-05 03:09:37 24 4
gpt4 key购买 nike

我搜索了很多以了解这一点,但我做不到。我知道默认情况下 TfidfVectorizer 将对术语频率应用 l2 规范化。 This文章解释了它的方程式。我在用古吉拉特语编写的文本上使用 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}

请在这个例子中解释一下我的两个文档中每个词的词频是多少。

最佳答案

好的,现在让我们看一下 documentation I gave in comments一步一步:

文件:

`ખુબ વખાણ કરે છે
ખુબ વધારે છે`
  1. 获取所有独特的术语(特征):['કરે', 'ખુબ', 'છે.', 'વખાણ', 'વધારે']
  2. 计算文档中每个术语的频率:-

    一个。文档 1 中出现的每个术语 [ખુબ વખાણ કરે છે] 出现一次,વધારે 不出现。`

    所以词频向量(按特征排序):[1 1 1 1 0]

    在 document2 上应用步骤 a 和 b,我们得到 [0 1 1 0 1]

    所以我们最终的词频向量是 [[1 1 1 1 0], [0 1 1 0 1]]

    注意:这是你想要的词频

  3. 现在找到 IDF(这是基于特征,而不是基于文档):

    idf(term) = log(文档数/包含这个词的文档数) + 1

    1 被添加到 idf 值以防止零除法。它由默认为 True 的 "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

    所以对于 document1,最终的 tf-idf 向量是 [1.69314 1 1 1.69314 0]

    现在归一化完成了(l2 Euclidean):

    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...

    将 tf-idf 数组的每个元素除以除数,我们得到:

    [0.6088445 0.3595948 0.3595948548 0.6088445 0]

    注意:这是您发布的第一个有问题的文档的 tfidf。

    现在对文档 2 执行相同的步骤 a 和 b,我们得到:

    [ 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 = True 会改变词频向量。

new_tf = 1 + log(tf)

现在,上面的行仅适用于术语频率中的非零元素。因为对于 0,log(0) 是未定义的。

所有非零条目都是 1。log(1) 是 0 和 1 + log(1) = 1 + 0 = 1`。

您会看到值为 1 的元素的值将保持不变。因此您的 new_tf = [[1 1 1 1 0], [0 1 1 0 1]] = tf(original) .

由于 sublinear_tf,您的词频正在发生变化,但它仍然保持不变。

因此,如果您使用 sublinear_tf=Truesublinear_tf=False,则以下所有计算都相同,输出也相同。

现在,如果您更改词频向量包含 1 和 0 以外的元素 的文档,您将使用 sublinear_tf 获得差异。

希望您的疑虑现在已经消除。

关于python-3.x - 如何在 TfidfVectorizer 中计算词频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42440621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com