我有一个numpy数组,matrixValue
和3个包含以下内容的列表:
matrixValue :(类型:ndarray)wordlist中单词的出现次数按降序排列
[.. 62 62 ..]
[.. 23 21 ..]
[.. 14 13 ..]
valueList :(类型:列表)wordlist中单词的出现次数降序
[... 74, 71, 63, 62, 62, 50, 40, 23, 21, 14, 13, 11, 11...]
userGivenWord :(类型:列表)用户指定的字词
[... water, animal, flower...]
wordList :(类型:列表)包含英语词典单词列表
[.. water, ocean, lake, green, blue, sea...]
给定一个用户定义的单词,我将从单词列表中检索出有一些“语义相似性”的单词。我的问题是,对于在valueList中看到的任何重复出现(例如62,11),只打印第一个英文单词'lake'而不是sea(假设蓝色和湖泊各有62次)。
输出
water = lake, lake # wrong output
water = lake, sea # correct output
以下是我非常肯定导致问题的代码部分:
for i in range(0, 3): # printing top 3 words
value = matrixValue[i] # returns the first two numbers, 62 & 62
iValue = valueList.index(value) # returns the indexes in valueList for the above value
tagword = str(tag_list[iValue]) # retrieves the word based on the iValue
res = userTags[x] + " = " + tagword
同样,湖泊和海洋都发生了62次。我相信错误发生在for循环的第二行。当我在调试器中查看时,我注意到“湖”这个词被添加到结果列表中两次(而不是海)。我不确定我是否在这里保持连贯,或者我是否清楚写了这个问题......但如果需要澄清,请随时问我问题。
答案 0 :(得分:1)
如果你想获得看起来相同次数的单词,反击词将会简单得多:
from collections import Counter
c = Counter(["foo","foo","bar","bar","foobar","foob"])
print([k for k, v in c.items() if v == 2 ])
['foo', 'bar']
但是你计算相似度,如果它不是频率,只需在你的词典中存储常用词并按键访问。索引除了比使用dict效率低得多之外总是会返回第一次出现。
将计数作为键和组字存储为值:
from collections import defaultdict
d = defaultdict(list)
for k,v in c.items():
d[v].append(k)
print(d.get(2,"N/A"))
['foo', 'bar']