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克的列表?
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克的列表?
您可以使用此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)
現在,如果我需要做tri-gram而不是bigrams,我該怎麼做 - 只是好奇而已。 – stfd1123581321
好了,你可以使用
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的長度。
's'是一個字符串,認爲你的意思是's.split()'。你還沒有計算任何東西...... –
@Chris_Rands's'在OP的問題中從不使用,所以它可能就是一個單詞列表。但是這個答案當然應該清楚。 –
@Chris_Rands,你當然是正確的。我修改了答案。 – zmbq
向我們展示一些代碼! – Astrom