python:在句子中计算单词标记

Duk*_*uke 2 python string replace

我正在尝试计算字符串中的单词数.但是,我首先必须删除一些标点符号,例如

line = "i want you , to know , my name . "
Run Code Online (Sandbox Code Playgroud)

赛跑

en = line.translate(string.maketrans('', ''), '!,.?')
Run Code Online (Sandbox Code Playgroud)

产生

en = "i want you  to know  my name  "
Run Code Online (Sandbox Code Playgroud)

在此之后,我想计算一行中的单词数.但是当我做len(en)时,我得到30而不是7.

在en上使用split来标记化并找到长度并不适用于所有情况.例如

我试过它并不总是有效.例如考虑这个字符串.

"i ccc bcc the a of the abc ccc dd on aaa , 28 abc 19 ."
Run Code Online (Sandbox Code Playgroud)

然后成为:

"i ccc bcc the a of the abc ccc dd on aaa 28 abc 19 "
Run Code Online (Sandbox Code Playgroud)

但len(en)返回17而不是15.

你能帮忙吗?谢谢

Mar*_*ers 11

问题en.split(' ')是你的字符串中有额外的空格,这会给出空的匹配.你可以通过调用en.split()来轻松解决这个问题.

但也许您可以使用正则表达式使用这种不同的方法(现在不需要首先删除标点符号):

import re
print len(re.findall(r'\w+', line))
Run Code Online (Sandbox Code Playgroud)

看到它在线工作:ideone


Fra*_*urt 7

您可以使用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)))
Run Code Online (Sandbox Code Playgroud)

输出:

15
Run Code Online (Sandbox Code Playgroud)


Cit*_*ito 5

而不是使用正则表达式,\w+\b用于计算单词更快,如下所示:

import re
_re_word_boundaries = re.compile(r'\b')

def num_words(line):
    return len(_re_word_boundaries.findall(line)) >> 1
Run Code Online (Sandbox Code Playgroud)

请注意,我们必须将数字减半,因为\b在单词的开头和结尾都有匹配.不幸的是,与egrep不同,Python不支持仅在开头或结尾进行匹配.

如果你有很长的行并关心内存,使用迭代器可能是一个更好的解决方案:

def num_words(line):
    return sum(1 for word in _re_word_boundaries.finditer(line)) >> 1
Run Code Online (Sandbox Code Playgroud)