Python 我是否在原始文档的语料库上正确使用TD-IDF?

Python 我是否在原始文档的语料库上正确使用TD-IDF?,python,scikit-learn,Python,Scikit Learn,我怀疑我是否正确使用TD-IDF计算。我有大量不同的文档,每个文档都使用pandas dataframe存储在自己的行中。我将每一行输入scikit学习中的TD-IDF,并将功能\u名称(单词)存储在列表中 我正在使用以下代码: term_tdidf = [] def tdidf_f(vec, matrix): f_array = np.array(vec.get_feature_names()) t_sort = np.argsort(matrix.toarray()).fl

我怀疑我是否正确使用TD-IDF计算。我有大量不同的文档,每个文档都使用pandas dataframe存储在自己的行中。我将每一行输入scikit学习中的TD-IDF,并将
功能\u名称
(单词)存储在列表中

我正在使用以下代码:

term_tdidf = []

def tdidf_f(vec, matrix):
    f_array = np.array(vec.get_feature_names())
    t_sort = np.argsort(matrix.toarray()).flatten()[::-1]
    n = 100
    top_term = f_array[t_sort][:n]
    term_tdidf.append(set(top_term))

for row in df.document:
        x = TfidfVectorizer(stop_words='english')
        tfidf_matrix = x.fit_transform(row)
        terms = x.get_feature_names()
        tdidf_f(x, tfidf_matrix)
之后,我创建了新的数据帧,其中来自每个文档的每组tdidf存储在一个单独的列中

TD-IDF的使用是否正确?我只在一个文档上运行它,所以我得到的术语只在这一个文档中计算,对吗?据我所知,应该在所有文档中使用td idf来查找一组常用术语,而不是多组。这种应用是否有任何后果


我对每个文档中提取的特征的手动检查表明,我得到的术语是合适的。之后,我使用这些术语来计算文档之间的相似性,这似乎是正确的。

要计算权重的IDF部分,您需要计算术语在整个语料库中出现的次数,因此您的代码不正确

下面是如何使用它的一个简单示例:

from sklearn.feature_extraction.text import TfidfVectorizer

corpus = ["My first document", "My second document"]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

X
是一个矩阵,其中每行是一个文档,每列代表一个术语。

这是我的直觉。那么,在单个文档上执行时,返回的频率是多少?我如何正确地实现它,以从一个文档中获得与X个其他文档相对应的频率,然后移动到下一个文档,再次将其与其他文档进行比较。您只需迭代
X
(每一行都是一个文档)的行,并按您所做的方式进行处理(在行上而不是
矩阵
)。在单个文档中使用IDF术语是没有意义的:IDF术语的目的是降低整个语料库中最常用术语的重要性,因为它们不那么具有歧视性。IDF值乘以TF值,TF值是该术语在当前文档中出现的次数。我现在明白你的意思了,尤其是在我自己看到差异之后。我只计算在单个文档上运行时的术语频率。考虑到我希望找到文档之间的相似性,并且在列表中运行TD-IDF(所有文档都在其中)会给我带来所有文档中最常见的术语,我理解使用TD-IDF进行文档间相似性是毫无意义的(比较docA、docB和docC)。我应该只使用最常用的术语、不同的算法,还是针对整个文档对每个段落运行TD-IDF以获得准确度?通常的做法是,首先将文档转换为TF-IDF向量(
X
),然后计算向量之间的余弦相似性,从而计算文档之间的相似性。这可以通过
S=X@X
(因为
X
中的行已经被规范化)来实现,它生成了一个相似性矩阵:
S[i,j]是文档
i``和文档j之间的相似性分数。我想我明白了,但最后一个跟进问题。这个向量如何将每个术语保存(排序?)到每个文档中,以便以后计算相似性?我的意思是,我们如何从什么文件中知道什么术语。从你们所写的内容来看,似乎正在发生的是文档被转换成术语向量,然后我们只是将每个向量与另一个向量进行比较,以找出它们之间的距离。你能用一些示例代码更新你的答案吗?