通过将列表与其他列表进行比较来计算列表中出现的每个单词的相对频率

时间:2018-05-21 10:50:53

标签: python

我有一个元素列表列表,我希望通过将元素与另一个列表的元素进行比较来创建元素的相对频率。

例如:

A = [['a','b','c'],['b','d'],['c','d','e'],['a','c','e','f']]
B = [['a','b','c'],['c','e'],['c','e']]
C = [['b','c','e'],['b','c','e','g']]

我想为所有列表中出现的每个单词计算两个不同的值(X和Y)并取其比率,最后将该比率存储在具有相同列表名称的该单词中。 X和Y的计算方式是: 对于A中的单词“a”:

X = Number of lists it is appearing in A / Total number of lists in A
Y = Sum of number of times it is appearing in rest of the list / sum of total length of remaining list

例如:A:中的'a'

X = 2/4 = 0.5
Y = 1/5 = 0.2

最后取X / Y或Y / X的比例大于1并存储它。我必须为每个元素做同样的事情。

请帮助如何做到这一点。

1 个答案:

答案 0 :(得分:1)

我希望这段代码能让你开始:

首先获取所有列表中的所有唯一字词:

all_words = set().union(*A).union(*B).union(*C)

计算每个清单列表的长度:

length_A = float(len(A))
num_rest_lists = float(len(B) + len(C))

对于你所提到的计算比率的每个单词:

res_dict = {]
for word in all_words:
    X = sum(map(lambda x: word in x, A))/length_A
    Y =  sum(map(lambda x: word in x, B)) + sum(map(lambda x: word in x, C))/num_rest_lists
    if Y == 0 or X == 0:
        print "word: %s, X: %s, Y: %s" % (word, X,Y)
        res_dict[word] = 0
    elif X/float(Y) > 1 :
        print "word: %s, ratio: %s" % (word, X/float(Y))
        res_dict[word] = X/float(Y)
    else:
        print "word: %s, ratio: %s" % (word, Y/float(X))
        res_dict[word] = Y/float(X)

print res_dict

祝你好运。