当我将字符串列表传递给此函数时,我希望它返回一个矩阵,说明每个唯一单词出现在字符串中的次数,但是,我得到一个矩阵,其中第一个字符串的值重复4次。
这是代码
def tf(corp):
words_set = set()
for i in corp:
a=i.split(' ')
for j in a:
words_set.add(j)
words_dict = {i:0 for i in words_set}
wcount=0
matr=list()
for doc in corp:
for worduni in words_dict:
count=0
for words in doc.split(' '):
if words==worduni:
count+=1
words_dict[worduni]=count/len(doc.split(' '))
print(words_dict)
matr.append(words_dict)
return matr
当我打印matr的值时,我得到
[{'the':0.2,
“第一”:0.2,
'文档':0.2,
'第三':0.0,
'是':0.2,
'一个':0.0,
“和”:0.0,
'this':0.2,
'second':0.0},
{'the':0.2,
“第一”:0.2,
'文档':0.2,
'第三':0.0,
'是':0.2,
'一个':0.0,
“和”:0.0,
'this':0.2,
'second':0.0},
{'the':0.2,
“第一”:0.2,
'文档':0.2,
'第三':0.0,
'是':0.2,
'一个':0.0,
“和”:0.0,
'this':0.2,
'second':0.0},
{'the':0.2,
“第一”:0.2,
'文档':0.2,
'第三':0.0,
'是':0.2,
'一个':0.0,
“和”:0.0,
'this':0.2,
'秒':0.0}]
最佳答案
您的代码正在执行的操作是将相同的对象(word_dict
)重复添加到matr
。自然地,由于matr
是一个列表,它可以处理此...,并且您将对同一词典有多个引用。同时,您正在更新字典。因此,当您打印列表时,您看到的是字典的最终状态... N次。
现在,我怀疑您打算将word_dict
状态的快照保存在matr
中。但是,如果要这样做,则需要将word_dict
的副本保存在matr
中;例如
matr.append(words_dict.copy())
另一方面,如果打算为
doc
中的每个corp
生成一个单独的词频字典,则需要在外循环内移动word_dict
的创建和初始化。除上述之外,您计算单词和计算频率的方式似乎是完全错误的。我假设这就是您要在此处执行的操作。
注意:如果您使用更有意义的方法和变量名和/或在代码中添加适当的注释,其他人将更容易理解代码的意图。