使用正则表达式在Python中计算单词数量

4

如何使用正则表达式计算文档中的英文单词数量?

我尝试了以下方法:

words=re.findall('\w+', open('text.txt').read().lower())
len(words)

但是似乎有几个单词我漏掉了(与gedit中的字数相比)。 我这样做对吗?

非常感谢!


3
我建议你尝试找出哪些单词被遗漏了,然后改进正则表达式以包括那种类型的单词。 - David S.
应该是 \\w+ 吗?还是这是有意为之的? - Constantinius
2
@Constantinius:可能应该写成'\\w+'或者r'\w+'更清晰,但是\w在Python字符串中不是已知的转义序列,所以'\w+'会被解释为一个字面上的反斜杠-w-plus。 - Ben Hoyt
刚刚重新阅读了这个问题。“英语单词”,你是说?你是在核对一个已知的“英语单词”字典吗?你会否排除那些从法语和其他语言借来的单词? - johnsyweb
谢谢大家的评论! @Johnsyweb,那只是因为我的母语是中文,我应该只写“单词”:) - Zhe Li
3个回答

5

使用 \w+ 无法正确计算包含撇号或连字符的单词,例如 "can't" 将被计算为 2 个单词。它还会计算数字(数字字符串);"12,345" 和 "6.7" 每个将计为 2 个单词("12" 和 "345","6" 和 "7")。


谢谢!我应该想到那个:) 在Python文档中非常清楚地说明了... - Zhe Li
但是等等,这只会让我的数字变少而不是更多... :( - Zhe Li

1

这似乎按预期工作。

>>> import re
>>> words=re.findall('\w+', open('/usr/share/dict/words').read().lower())
>>> len(words)
234936
>>> 
bash-3.2$ wc /usr/share/dict/words
  234936  234936 2486813 /usr/share/dict/words

你为什么要把单词变成小写?这与计数有什么关系?

我认为以下方法会更有效:

words=re.findall(r'\w+', open('/usr/share/dict/words').read())

是的,那完全是不必要的。我刚从一个查找文档中最常用单词的程序中得到了这段代码,他们使用它来将“Hello”和“hello”视为同一个单词。 - Zhe Li
@Zhe:将字母转换为小写对这段代码没有影响。如果你想要计算唯一单词的数量,那么它会有所不同。我建议使用set来实现。 - johnsyweb

0

一旦您通过_words_list = words.split()或使用正则表达式或其他方法进行必要的处理,您可以轻松地使用以下方法获取单词计数:

import numpy as NP
import pandas as PD

_counted_words = PD.Series(NP.array(_words_list)).value_counts()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接