如何处理与n-gram的关系和Python中的max函数?

时间:2018-05-26 05:34:19

标签: python max n-gram

在我的程序中,我找到了n-gram并打印出数据集中有多少n-gram。 https://en.wikipedia.org/wiki/N-gram对于那些不知道n-gram是什么的人。

这是我的代码:

from collections import defaultdict
import sys
from string import punctuation
def tokenize(text, ngrams=1):
    tokens = text.split()
    return [tuple(tokens[i:i+ngrams]) for i in range(len(tokens)-ngrams+1)]

line = ""
for i in sys.stdin:
    stripped = i.strip(punctuation)
    line += stripped.lower()
for n in range(1, 10):
    a = tokenize(line, n)
    d = defaultdict(int)
    for i in a:
        d[i] += 1
    result = max(d.items(), key = lambda x: x[1])
    if(result[1] >= 3):
        s = ' '.join(result[0])
        print('{:<6} {:<0} {:<0} {:<10}'.format(str(result[1]), str(n) + "-grams ", "|", s))

以下是我的程序的示例输出,其中包含数据集:

10     1-grams  | and
3      2-grams  | balloonman whistles
3      3-grams  | balloonman whistles far
3      4-grams  | balloonman whistles far and
3      5-grams  | balloonman whistles far and wee

这就是我应该得到的(忽略格式差异):

10 1-grams       | and
3 2-grams        | balloonman whistles
3 2-grams        | whistles far
3 2-grams        | far and
3 2-grams        | and wee
3 3-grams        | balloonman whistles far
3 3-grams        | whistles far and
3 3-grams        | far and wee
3 4-grams        | balloonman whistles far and
3 4-grams        | whistles far and wee
3 5-grams        | balloonman whistles far and wee

似乎问题是当我在我的defaultdict中找到我的物品的最大值时,我只得到3个3克中的一个,但是我想得到所有3个3克。有任何想法吗?提前谢谢

1 个答案:

答案 0 :(得分:1)

是的,这就是原因。来自https://docs.python.org/3/library/functions.html#max

  

如果多个项目是最大的,则该函数返回遇到的第一个项目。这与其他排序稳定性保留工具一致,例如sorted(iterable,key = keyfunc,reverse = True)[0]和heapq.nlargest(1,iterable,key = keyfunc)。

只需找到最大值,然后使用最大值,即结果[1],并获得最常见的n克的完整列表,并列出清单。