计算每个单词在文本中出现的次数

时间:2016-07-21 00:27:29

标签: python python-2.7

我希望这段代码可以读取文本文件,并打印每个单词以百分比形式出现的数量。 几乎有效..

我无法弄清楚如何将打印输出从最高位置排序到最少(当我复制/粘贴其他人的代码时我曾经有过它,我想我导入了集合和计数器,我不知道)

但是另一个问题是它通过我的整个列表读取,这对于较小的文本文件很好,但是较大的文本只会占用我的终端,我希望它只打印一次单词,而不是每个实例打印一次

name = raw_input('Enter file:')
handle = open(name, 'r')
text = handle.read()
words = text.split()

def percent(part, whole):
   return 100 * float(part)/float(whole)

total = len(words)

counts = dict()
for word in words:
    counts[word] = counts.get(word,0) + 1

print "\n"
print"Total Words\n", total
print"\n"

for word in words:
  print word, percent(counts[word],total),"%"

3 个答案:

答案 0 :(得分:1)

您可以像这样迭代字典:

for word in counts:
    print word, counts[word]

这将打印字典中的每个键一次。 要进行排序,您应该查看内置的sorted()函数:https://docs.python.org/3.4/library/functions.html#sorted

答案 1 :(得分:0)

对于您的第一个问题,您可以直接收集OrderedDict:

sortedCounts = collections.OrderedDict(sorted(counts.items(),key=lambda t: t[1]))

仅打印每个单词一次:

for key, value in sortedCounts.iteritems():
  print key, percent(value,total),"%"

希望有所帮助

答案 2 :(得分:0)

您的代码非常接近可行;我只看到一些导致您出现问题的问题:

P1:您的代码不会考虑非单词字符。例如,word;word.word都将被视为唯一字词。

text = handle.read()
words = text.split()


P2:您遍历整个单词列表,其中包括重复项,而不是counts中的唯一列表。所以你当然会多次打印每个单词。

for word in words:


P3:您打开文件但从未关闭它。您的代码不完全是问题,但需要改进。这就是为什么通常鼓励使用with open(...):语法,因为它处理为您关闭文件。

handle = open(name, 'r')


这是您的代码中的一些修复:

#!/usr/bin/python

import re

name = raw_input('Enter file:')

def percent(part, whole):
   return 100 * float(part)/float(whole)

# better way to open files, handles closing the file
with open(name, 'r') as handle:
    text = handle.read()

words = text.split()

# get rid of non-word characters that are messing up count
formatted = []
for w in words:
    formatted.extend(re.findall(r'\w+', w))

total = len(formatted)

counts = dict()
for word in formatted:
    counts[word] = counts.get(word,0) + 1

print "\n"
print"Total Words\n", total
print"\n"

# iterate over the counts dict instead of the original word list
# this way each word is only printed once
for word,count in counts.iteritems():
    print word, percent(counts[word],total),"%"

在此程序上运行时的输出:

Total Words
79


text 2.53164556962 %
float 2.53164556962 %
as 1.26582278481 %
file 1.26582278481 %
in 3.79746835443 %
handle 2.53164556962 %
counts 6.32911392405 %
total 3.79746835443 %
open 1.26582278481 %
findall 1.26582278481 %
for 3.79746835443 %
0 1.26582278481 %
percent 2.53164556962 %
formatted 5.06329113924 %
1 1.26582278481 %
re 2.53164556962 %
dict 1.26582278481 %
usr 1.26582278481 %
Words 1.26582278481 %
print 5.06329113924 %
import 1.26582278481 %
split 1.26582278481 %
bin 1.26582278481 %
return 1.26582278481 %
extend 1.26582278481 %
get 1.26582278481 %
python 1.26582278481 %
len 1.26582278481 %
iteritems 1.26582278481 %
part 2.53164556962 %
words 2.53164556962 %
Enter 1.26582278481 %
100 1.26582278481 %
with 1.26582278481 %
count 1.26582278481 %
word 7.59493670886 %
name 2.53164556962 %
read 1.26582278481 %
raw_input 1.26582278481 %
n 3.79746835443 %
r 1.26582278481 %
w 3.79746835443 %
Total 1.26582278481 %
whole 2.53164556962 %
def 1.26582278481 %

编辑 - 添加了单词格式

的说明

formatted.extend(re.findall(r'\w+', w))的细分:

1:列表的extend函数获取一个列表并将其附加到给定列表中。例如:

listA = [1,2,3]
listB = [4,5,6]
listA.extend(listB)
print(listA)
# [1, 2, 3, 4, 5, 6]

2:re.findall(r'\w+', w))

此表达式使用regular expressions仅提取我们关心的字符串部分。这是关于python正则表达式的tutorial

基本上,re.findall(x, y)会返回y中与x中列出的正则表达式模式匹配的所有子字符串的列表。在我们的例子中,\w表示所有单词字符(即字母数字字符),+表示前述模式中的一个或多个。所以放在一起,\w+表示一个或多个单词字符。

我可能通过命名我们在w上进行搜索的字符串变量来使其有些混乱,但请记住,模式中的\w与{无关联} {1}}变量即字符串。

w