2016-11-06 35 views
2

我想计算两个列表元素的点互信息分数。 比方说,我们有两个列表元素的PMI

ListA = "Hi there, This is only a test message. Please enjoy the weather in the park." 
ListB = "work, bank, tree, weather, sun" 

我怎样才能再计算所有对的PMI分数(工作,嗨),(工作,有),(工作,此)......(太阳,公园)。

它的工作对我来说,计算一个列表中bigram的采购经理人指数:

def pmi(word1, word2, unigram_freq, bigram_freq, unigram_freq_values, bigram_freq_values, output_name): 
    prob_word1 = unigram_freq[word1]/float(sum(unigram_freq_values)) 
    prob_word2 = unigram_freq[word2]/float(sum(unigram_freq_values)) 
    prob_word1_word2 = bigram_freq/float(sum(bigram_freq_values)) 
    pmi = math.log(prob_word1_word2/float(prob_word1*prob_word2),2) 

unigrams = nltk.FreqDist(ListA) 
bigrams = ngrams(ListA,2) 

n1_freq = nltk.FreqDist(unigrams) 
n2_freq = nltk.FreqDist(bigrams) 

output_pmi = "test.txt" 
for bigram, freq in n2_freq.most_common(1000): 
    w1 = bigram[0] 
    w2 = bigram[1] 
    unigram_freq_val = n1_freq.values() 
    bigram_freq_val = n2_freq.values() 
    pmi(w1, w2, unigrams, freq, unigram_freq_val, bigram_freq_val, output_pmi) 

我被困的问题,从计算和利斯塔的双字母组数组listB的PMI。如果有人能帮助我,我会非常感激。非常感谢!

(这两个名单是的,当然,我的任务是如何看起来像最小的例子。)

回答

1

如果你正在努力寻找这两个列表的所有组合:

import itertools 

ListA = "Hi there, This is only a test message. Please enjoy the weather in the park." 
ListB = "work, bank, tree, weather, sun" 
WordsA = ListA.split() 
WordsB = ListB.split() 
#print(WordsA, "\n\n", WordsB)    #This is to show what the new lists are 
c = list(itertools.product(WordsA, WordsB)) 
print(c) 
+0

却怎么也之后,我计算这个组合的PMI?这是我仍然不清楚的部分。 – JohnD

+0

是的,我也很难想到这一点。你能否给我一个关于PMI的描述,因为我有(忘记)那是什么。我已经做了我现在所能做的,但如果你能解释它,我可能会想出一个完整的解决方案来解决你的问题。另外,如果您认为我已经帮助过(或正在尝试提供帮助),那么请+1我的代码,因为它确实有帮助。谢谢! –

相关问题