gpt4 book ai didi

python-2.7 - 使用python 2.7计算文档之间的tf-idf

转载 作者:行者123 更新时间:2023-12-04 00:45:15 25 4
gpt4 key购买 nike

我有一种情况,我从互联网检索信息/原始数据,并将它们放入各自的json或.txt文件中。

从那以后,我想通过使用tf-idf计算每个文档中每个术语的频率及其余弦相似度。

例如:
有50个不同的文档/文本文件,每个文件包含5000个字/字符串
我想从第一个文档/文本中取出第一个单词,比较所有250000个单词的频率,然后对第二个单词进行搜索,以此类推,对所有50个文档/文本都如此。

每个频率的预期输出为0 -1

我该怎么做。我一直在指代sklear软件包,但是在每次比较中,它们大多数只包含几个字符串。

最佳答案

您确实应该向我们展示您的代码,并更详细地说明遇到问题的部分。

您所描述的通常不是完成方式。通常要做的是对文档进行矢量化处理,然后对矢量进行比较,从而得出此模型下任意两个文档之间的相似性。由于您在询问NLTK,因此我假设您需要这种常规的传统方法。

无论如何,使用传统的单词表示法,两个单词之间的余弦相似度是没有意义的-两个单词相同或相反。但是,当然还有其他方法可以处理术语相似性或文档相似性。

https://stackoverflow.com/a/23796566/874188复制代码,因此我们有一个基准:

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ["This is very strange",
"This is very nice"]
vectorizer = TfidfVectorizer(min_df=1)
X = vectorizer.fit_transform(corpus)
idf = vectorizer._tfidf.idf_
print dict(zip(vectorizer.get_feature_names(), idf))


这里没有什么取决于输入的长度。如果文档越长, idf中的功能数量将越大;如果文档越多,语料库中的功能就越多,但是这样的算法完全不需要更改即可容纳更多或更长的文档。 。

如果您不想了解原因,可以在这里停止阅读。

向量基本上是每个单词形式的计数数组。每个向量的长度是单词形式的数量(即特征的数量)。因此,如果您有一个包含六个条目的词典,如下所示:

0: a
1: aardvark
2: banana
3: fruit
4: flies
5: like


那么输入文档“水果像香蕉一样飞”将产生一个包含六个元素的向量,如下所示:

[2, 0, 1, 1, 1, 1]


因为该词在词典中的索引为零的位置出现了两次,因此在索引的索引为零的位置出现了该单词,在索引索引为2的一个出现了零,等等。它已经是一个有用的载体。您可以使用余弦距离比较它们中的两个,并获得它们相似性的度量。

IDF因子的目的是对此进行标准化。标准化带来三个好处;在计算上,您不需要进行任何按文档或按比较的标准化,因此速度更快;并且该算法还对频繁出现的单词进行了归一化处理,因此,如果大多数文档都包含多次出现的“ a”,那么很多出现的“ a”被认为是微不足道的(因此您不必进行显式停用词过滤),而多次出现的“ aardvark”在归一化向量中立即明显地显着。同样,归一化的输出可以很容易地得到解释,而对于普通的TF向量,您必须考虑文档长度等因素才能正确理解余弦相似度比较的结果。

因此,如果“ a”的DF(文档频率)为1000,而词典中其他单词的DF为1,则缩放矢量将为

[0.002, 0, 1, 1, 1, 1]


(因为我们采用文档频率的倒数,即TF(“ a”)* IDF(“ a”)= TF(“ a”)/ DF(“ a”)= 2/1000)。

余弦相似度基本上是在n维空间(此处n = 6)中解释这些向量,并观察它们的箭头彼此相距多远。为了简单起见,让我们将其缩小为三个维度,并在X轴上绘制(按IDF缩放比例)“ a”的数量,在Y轴上绘制“ aardvark”的数量,并绘制“香蕉”的数量在Z轴上端点[0.002,0,1]与[0.003,0,1]的差别很小,而[0,1,0]终止于我们正在想象的立方体的另一个角,因此余弦距离大。 (归一化意味着1.0是任何元素的最大值,因此我们所说的实际上是一个角。)

现在,返回到词典,如果您添加一个新文档,并且该文档中的单词不在词典中,那么它们将被添加到词典中,因此从现在开始,矢量将需要更长的时间。 (您已经创建的向量现在太短了,可以简单地扩展;迄今为止看不见的术语的术语权重显然总是为零。)如果将文档添加到语料库,则语料库中还会有一个向量要比较反对。但是算法不需要改变。它将始终创建每个词典条目只有一个元素的向量,并且您可以继续使用与以前相同的方法比较这些向量。

当然,您可以循环使用这些术语,并为每个术语合成仅由单个术语组成的“文档”。将其与其他单一术语“文档”进行比较将产生与其他单个术语“文档”的0.0相似度(或与包含相同术语且没有其他内容的文档具有1.0相似性),因此并没有太大用处,但与实际文档的比较将本质上揭示出每个文档的比例由您要检查的术语组成。

原始IDF向量会告诉您每个术语的相对频率。它通常表示每个术语出现在多少个文档中(因此,即使一个术语在文档中出现多次,该术语在DF中也只会加1),尽管某些实现也允许您使用裸术语计数。

关于python-2.7 - 使用python 2.7计算文档之间的tf-idf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27497528/

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