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(',',' : ')))
在我正式完成该项目之前,我只需要最后一件事的帮助,输出的显示有问题,我的代码高度不一致,并且我愿意接受建议。
答案 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.