最常见的2克使用python

时间:2017-04-18 13:33:46

标签: python python-2.7 pyspark n-gram python-collections

给出一个字符串:

this is a test this is

如何找到最常见的2克?在上面的字符串中,所有2克都是:

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

您可以注意到,2克this is出现了2次。因此结果应该是:

{this is: 2}

我知道我可以使用Counter.most_common()方法找到最常见的元素,但是如何从字符串中创建一个2-gram的列表呢?

3 个答案:

答案 0 :(得分:5)

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

Equatable

当然,假设输入是单词列表。如果您的输入是一个类似于您提供的字符串(没有任何标点符号),那么您只需from collections import Counter bigrams = zip(words, words[1:]) counts = Counter(bigrams) print(counts.most_common()) 即可获得单词列表。但是,一般而言,您必须考虑标点符号,空格和其他非字母字符。在这种情况下,您可能会执行类似

的操作
words = text.split(' ')

或者您可以使用外部库,例如nltk.tokenize

编辑。如果您需要tri-gram或任何其他任何其他n-gram,那么您可以使用我链接到的博客文章中提供的功能:

import re

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

答案 1 :(得分: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和i + 1处的一对单词,我们遍历从(0,1)到(n-2,n-1)的所有对,其中n是长度string s。

答案 2 :(得分:1)

最简单的方法是:

s = "this is a test this is"
words = s.split()
words_zip = zip(words, words[1:])
two_grams_list = [item for item in words_zip]
print(two_grams_list)

以上代码将为您提供所有两元语法的列表,例如:

[('this', 'is'), ('is', 'a'), ('a', 'test'), ('test', 'this'), ('this', 'is')]

现在,我们需要计算每两克的频率

count_freq = {}
for item in two_grams_list:
    if item in count_freq:
        count_freq[item] +=1
    else:
        count_freq[item] = 1

现在,我们需要按降序对结果进行排序并打印结果。

sorted_two_grams = sorted(count_freq.items(), key=lambda item: item[1], reverse = True)
print(sorted_two_grams)

输出:

[(('this', 'is'), 2), (('is', 'a'), 1), (('a', 'test'), 1), (('test', 'this'), 1)]