But, soft! what light through yonder window breaks?
It is the east, and Juliet is the sun.
Arise, fair sun, and kill the envious moon,
Who is already sick and pale with grief,
Python的split函数可以识别空格,把词汇看作是由空格分隔开来的词单元,所以,“soft”和“soft!”会被视为不同的词汇,分别为它们创建一个字典项。
由于文本中还存在大写,“who”和“Who”也是不同的词,分别进行统计。
通过字符串的lower、punctuation与translate方法可以解决上述问题。其中translate是最精细的方法。以下是translate的说明文档:
string.translate(s, table[, deletechars])
首先,从s中删除deletechars参数(如果存在的话)指定的所有字符,然后使用table参数来翻译字符。table是一个256个字符长的字符串,用来翻译每个字符值,并按照序数进行索引。如果table是None值,只会执行字符删除步骤。
这里不指定table参数,用deletechars参数来删除所有标点符号。Python甚至可以告诉我们,标点符号包括哪些字符:
>>> import string
>>> string.punctuation
‘!"#$%&\‘()*+,-./:;<=>?@[\\]^_`{|}~‘
我们对程序做出如下修改:
import string # New Code
fname = raw_input(‘Enter the file name: ‘)
try:
fhand = open(fname)
except:
print ‘File cannot be opened:‘, fname
exit()
counts = dict()
for line in fhand:
line = line.translate(None, string.punctuation) # New Code
line = line.lower() # New Code
words = line.split()
for word in words:
if word not in counts:
counts[word] = 1
else:
counts[word] += 1
print counts
我们使用translate方法删除了所有的标点符号,并将每一行中的字母转换为小写。程序主体并未发生改变。请注意,Python2.5及早期版本中,translate方法不接受None值作为第一个参数,因此使用下面的代码来调用该方法:
print a.translate(string.maketrans(‘ ‘,‘ ‘), string.punctuation
懂得一些“Python的艺术”和“像Python一样思考”,不难发现Python为许多常见数据分析问题内置了解决方案。随着学习的深入,通过大量的示例代码和技术文档的阅读,你会知道去哪里寻找别人是否用Python已经解决了此类问题,从而减轻一些你的工作。
以程序运行的部分输出结果如下:
Enter the file name: romeo-full.txt
{‘swearst‘: 1, ‘all‘: 6, ‘afeard‘: 1, ‘leave‘: 2, ‘these‘: 2,
‘kinsmen‘: 2, ‘what‘: 11, ‘thinkst‘: 1, ‘love‘: 24, ‘cloak‘: 1,
a‘: 24, ‘orchard‘: 2, ‘light‘: 5, ‘lovers‘: 2, ‘romeo‘: 40,
‘maiden‘: 1, ‘whiteupturned‘: 1, ‘juliet‘: 32, ‘gentleman‘: 1,
‘it‘: 22, ‘leans‘: 1, ‘canst‘: 1, ‘having‘: 1, ...}
查看这些输出仍然很费事,让Python来帮助我们找到具体要找到的信息。要做到这一点,我们需要学习Python的元组。在学习元组时会继续使用这个例子。