python:计算句子中的词汇量

5 投票
6 回答
35120 浏览
提问于 2025-04-17 05:46

我想要计算一个字符串中的单词数量。不过,我首先得去掉一些标点符号,比如:

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

撰写回答