如何制作一个演示Zipf定律的Python程序?

时间:2019-11-19 11:59:01

标签: python python-3.x xcode list dictionary

Zipf定律是在许多现实生活中发现的模式,Zipf定律的一个非常普遍的出现是在文本段落中,其中最常用的词的数量是第二个最常见的词的数量的两倍。
我一直在学习有关Python的字典,并尝试自己做,对它们的某些方面感到困惑。

第一步应该首先是从字符串中删除标点符号(这是为了防止在下一步中使用“ to”或“ said-”之类的词),然后.split进入列表。然后,创建一个字典,将键作为单词和值作为它们的出现,可以使用for循环来完成。然后,我怀疑最困难的部分是按降序打印所有键和值。

如果不是完整的代码,能否请您告诉我如何执行每个步骤,以便自己完成?谢谢!

import operator, pprint

punctuater = ['`','~','!','@','#','$','%','*','(',')','-', \
              '_','+','=','[','\]','{','}','|','\\','\"','\'', \
              ':',';','<',',','>','.','/','?','^','&']
numbers = [1,2,3,4,5,6,7,8,9,0]

def convertForZipf(string):
    string = (string.lower())
    for i in punctuater:
        if i in string:
            string = string.replace(i, '')
    return string.split()

text = 'Lorem Ipsum Ipsum Ipsum Meow h h h h h n n n n n dolor dolor'
words = convertForZipf(text)
wordsRanked = {}

for i in words:
    wordsRanked.setdefault(i, 0)
    wordsRanked[i] += 1
wordsRanked = (str((sorted(wordsRanked.items(), key=operator.itemgetter(1), reverse=True))))

for i in wordsRanked:
    try:
        int(i)
        wordsRanked = wordsRanked.replace(str(i), str(i)+'\n')    
    except ValueError:
        pass
print((wordsRanked.replace('[','')
                  .replace('(','')
                  .replace(')','')
                  .replace(']','')
                  .replace(',',' : ')))

在我正式完成该项目之前,我只需要最后一件事的帮助,输出的显示有问题,我的代码高度不一致,并且我愿意接受建议。

1 个答案:

答案 0 :(得分:0)

这应该符合您的条件-我不确定您在代码末尾使用for循环在做什么-您是否尝试替换数字?如果是这样,您可以更改我使用的正则表达式模式。

import re
from collections import OrderedDict

pattern = re.compile('[\W_]+')

def convertForZipf(string):
    string = string.lower()
    pattern.sub('', string)
    return string.split()

text = 'Lorem Ipsum Ipsum Ipsum Meow h h h h h n n n n n dolor dolor'
words = convertForZipf(text)
wordsRanked = {}

for i in words:
    if i not in wordsRanked:
        wordsRanked[i] = 1
    else:
        wordsRanked[i] += 1

wordsRanked = OrderedDict(sorted(wordsRanked.items(), key=lambda t: t[1], reverse=True))

for k, v in wordsRanked.items():
    print(f"{k} appears {v} times.")

输出:

h appears 5 times.
n appears 5 times.
ipsum appears 3 times.
dolor appears 2 times.
lorem appears 1 times.
meow appears 1 times.