代码之家  ›  专栏  ›  技术社区  ›  Coder117

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

  •  0
  • Coder117  · 技术社区  · 6 年前

    在我的程序中,我找到n个克,然后打印出一个数据集中有多少个。 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
    

    问题似乎是,当我在默认dict中找到最大值时,我只得到其中的一个,例如3个3克,但我想得到所有3个3克。有什么想法吗?提前谢谢你

    1 回复  |  直到 6 年前
        1
  •  1
  •   Sean Peters    6 年前

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

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

    只需找到你正在做的最大值,然后使用最大值,即结果[1],得到最常见n个g的完整列表,并进行列表理解。