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

2024-04-24 04:17:04 发布

您现在位置:Python中文网/ 问答频道 /正文

齐普夫定律是许多现实生活中的一种模式,齐普夫定律的一个常见现象是出现在文本的段落中,其中最常用的词是第二常用词的两倍。
我一直在学习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(',',' : ')))

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


Tags: 代码textinforstring字典operatorreplace
1条回答
网友
1楼 · 发布于 2024-04-24 04:17:04

这应该符合您的标准-我不知道您在代码末尾对for循环做了什么-您是否尝试替换数字?如果是这样的话,您可以修改我使用的regex模式。你知道吗

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.

相关问题 更多 >