Python TF-IDF 产品
Python TF-IDF product
我正在尝试从我的 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
的矩阵。
- 所以我们有 tf_matrix 个
K X N
、idf_matrix 个大小 N X N
或 idf_vector 个大小 1 X N
。要获得 tf_idf_matrix,您需要进行矩阵乘法:tf_matrix * idf_matrix 或逐元素矩阵和向量乘法 tf_matrix * idf_vector。两者都将实现将每个 i-th
tf 与 i-th
idf 权重相乘的目标。
- 您可以在其中一些步骤之间进行一些归一化,但这永远不会改变这些维度中的任何一个,只会改变相应位置的数值。
希望对您有所帮助!
我正在尝试从我的 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
的矩阵。 - 所以我们有 tf_matrix 个
K X N
、idf_matrix 个大小N X N
或 idf_vector 个大小1 X N
。要获得 tf_idf_matrix,您需要进行矩阵乘法:tf_matrix * idf_matrix 或逐元素矩阵和向量乘法 tf_matrix * idf_vector。两者都将实现将每个i-th
tf 与i-th
idf 权重相乘的目标。 - 您可以在其中一些步骤之间进行一些归一化,但这永远不会改变这些维度中的任何一个,只会改变相应位置的数值。
希望对您有所帮助!