python:计算句子中的词汇量
我想要计算一个字符串中的单词数量。不过,我首先得去掉一些标点符号,比如:
line = "i want you , to know , my name . "
运行
en = line.translate(string.maketrans('', ''), '!,.?')
产生
en = "i want you to know my name "
之后,我想要计算这一行中的单词数量。但是当我用 len(en) 的时候,得到的是 30,而不是 7。
我尝试用 split 方法来分割字符串并找出长度,但这在所有情况下都不管用。例如:
我试过这个方法,但并不是总能成功。比如,考虑这个字符串:
"i ccc bcc the a of the abc ccc dd on aaa , 28 abc 19 ."
en 变成了:
"i ccc bcc the a of the abc ccc dd on aaa 28 abc 19 "
但是 len(en) 返回的是 17,而不是 15。
你能帮帮我吗?谢谢!
6 个回答
6
与其使用正则表达式 \w+
来匹配单词,不如用 \b
来计算单词,这样会快很多,像这样:
import re
_re_word_boundaries = re.compile(r'\b')
def num_words(line):
return len(_re_word_boundaries.findall(line)) >> 1
需要注意的是,我们要把结果除以二,因为 \b
会在单词的开头和结尾都匹配。不幸的是,和 egrep 不同,Python 不支持只在开头或结尾进行匹配。
如果你处理的是非常长的行,并且担心内存问题,使用迭代器可能是个更好的选择:
def num_words(line):
return sum(1 for word in _re_word_boundaries.finditer(line)) >> 1
8
你可以使用NLTK这个工具:
import nltk
en = "i ccc bcc the a of the abc ccc dd on aaa 28 abc 19 "
print(len(nltk.word_tokenize(en)))
输出结果:
15
13
使用 en.split(' ')
的问题在于你的字符串中有多余的空格,这会导致出现空的匹配结果。你可以很简单地通过调用 en.split()
来解决这个问题。
不过,你也可以尝试使用正则表达式的不同方法(这样就不需要先去掉标点符号了):
import re
print len(re.findall(r'\w+', line))
在线查看效果: ideone