我正在尝试从我的TF_NORM矩阵和IDF向量创建TF-IDF。我知道他们没有相同的维度,所以我迷失了如何将两者倍增。我是否需要使用TF_NORM矩阵添加减少内容或转换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)
很难遵循您的代码,但是我可以分解尺寸和算术操作。
- 这一切都是从固定的词汇开始的,可以说大小
N
是从一些文本集合中提取的。 - 这意味着您具有
N
IDF权重。这可以是大小1 X N
的向量,也可以是N X N
矩阵的对角线,否则所有零都可以根据最终的算术
来工作。 - 现在可以说,您有一些大小
K
的文本(不一定是用于提取词汇的原始集合)。根据词汇量,每个文本都将被象征性的频率计数N
的向量,以便整个K
尺寸的集合将成为大小K X N
的矩阵。 - 因此,我们有
K X N
的TF_MATRIX,大小N X N
的IDF_MATRIX或大小1 X N
的IDF_VECTOR。要获取TF_IDF_MATRIX,您要么需要执行矩阵乘法:TF_MATRIX * IDF_MATRIX或元素-Wise Matrix和vector乘法TF_MATRIX * IDF_VECTOR。两者都将实现将每个i-th
TF乘以i-th
IDF重量的目标。 - 您可以在其中一些步骤之间进行一些正常化,但这永远不会更改这些维度中的任何一个,只有相应位置中的数字值。
希望这会有所帮助!