2017-04-18 146 views
3

2克給定一個字符串:最常見的使用python

this is a test this is 

我如何才能找到前N個最常見的2克?在上面的字符串,所有2克是:

{this is, is a, test this, this is} 

正如你可以看到,在2克this is出現2次。因此,結果應該是:

{this is: 2} 

我知道我可以使用Counter.most_common()方法來找到最常見的元素,但如何從開始以字符串創建的2克的列表?

+0

向我們展示一些代碼! – Astrom

回答

4

您可以使用此blog post中提供的方法在Python中方便地創建n-gram。

from collections import Counter 

bigrams = zip(words, words[1:]) 
counts = Counter(bigrams) 
print(counts.most_common()) 

這假設輸入是一個單詞列表,當然。如果你的輸入是一個你提供的字符串(沒有任何標點符號),那麼你只需要words = text.split(' ')就可以得到一個單詞列表。但是,一般來說,您必須考慮標點符號,空格和其他非字母字符。在這種情況下,你可能會做這樣的事情

import re 

words = re.findall(r'[A-Za-z]+', text) 

,或者你可以使用一個外部庫,如nltk.tokenize

編輯。如果您一般需要三元組或其他任何n-gram,那麼您可以使用我鏈接到的博客文章中提供的功能:

def find_ngrams(input_list, n): 
    return zip(*(input_list[i:] for i in range(n))) 

trigrams = find_ngrams(words, 3) 
+0

現在,如果我需要做tri-gram而不是bigrams,我該怎麼做 - 只是好奇而已。 – stfd1123581321

1

好了,你可以使用

words = s.split() # s is the original string 
pairs = [(words[i], words[i+1]) for i in range(len(words)-1)] 

(words[i], words[i+1])是對詞的地方,我和i + 1,我們去了所有對從(0,1)到(N-2,N- 1),其中n是串s的長度。

+1

's'是一個字符串,認爲你的意思是's.split()'。你還沒有計算任何東西...... –

+0

@Chris_Rands's'在OP的問題中從不使用,所以它可能就是一個單詞列表。但是這個答案當然應該清楚。 –

+0

@Chris_Rands,你當然是正確的。我修改了答案。 – zmbq