Python TF-IDF产品

时间:2017-11-27 19:15:01

标签: python python-3.x tf-idf

我正在尝试从我的TF_norm矩阵和IDF向量创建TF-IDF。我知道他们没有相同的尺寸,所以我迷失在如何将两者相乘的地方。我是否需要使用TF_norm矩阵添加reduce或转换IDF向量?完全迷失在这里。

#c) Normalized term frequency
count=0 
total=lexicon_dim
matrix_TF_norm=[[0 for c in range(lexicon_dim)] for r in range(4)]
for c in lexicon:
    matrix_TF_norm[0][count]=c
    matrix_TF_norm[1][count]=hamlet_tok_norm_stop_stem.count(c)/total
    matrix_TF_norm[2][count]=macbeth_tok_norm_stop_stem.count(c)/total
    matrix_TF_norm[3][count]=pinocchio_tok_norm_stop_stem.count(c)/total
    count=count+1
print(matrix_TF_norm)
#d) TF-IDF
vector_idf=[] #initialize IDF vector
for i in range(lexicon_dim): #run through loop for each token in lexicon
    df=0
    if matrix_binary[1][i]==1: #[1] = doc1
        df=df+1
    if matrix_binary[2][i]==1:
        df=df+1
    if matrix_binary[3][i]==1:
        df=df+1
    #add them together
    idf=math.log(3/df)
    vector_idf.append(idf)
print(vector_idf)

import numpy as np
vector_idf=np.diag(vector_idf)
tf_idf=np.cross(vector_idf,matrix_TF_norm)

1 个答案:

答案 0 :(得分:1)

很难遵循你的代码,但我可以分解维度和算术运算。

  • 这一切都以一个固定的词汇开头,比如大小N,它是从一些文本集合中提取的。
  • 这意味着你有N个IDF权重。这可以是大小为1 X N的向量,也可以是N X N矩阵的对角线,否则全部为零,两者都可以根据最终算法运行
  • 现在假设您有一些大小为K的文本集合(不必是用于提取词汇表的原始集合)。根据词汇表,每个文本将被标记化为术语频率计数大小N的向量,以便整个K大小的集合将成为大小为K X N的矩阵。 / LI>
  • 因此,我们有K X N的tf_matrix,大小为N X N的idf_matrix或大小为1 X N的idf_vector。要获得tf_idf_matrix,您需要进行矩阵乘法:tf_matrix * idf_matrix或逐元素矩阵和向量乘法tf_matrix * idf_vector。两者都将实现将每个i-th tf乘以i-th idf权重的目标。
  • 您可以在其中某些步骤之间进行一些规范化,但这绝不会改变任何这些维度,只会改变相应位置的数值。

希望这有帮助!