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

时间:2011-11-07 00:49:29

标签: python string replace

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

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。

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

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

"i ccc bcc the a of the abc ccc dd on aaa , 28 abc 19 ."

然后变成:

"i ccc bcc the a of the abc ccc dd on aaa 28 abc 19 "

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

你可以帮忙吗?感谢

6 个答案:

答案 0 :(得分:11)

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

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

import re
print len(re.findall(r'\w+', line))

查看在线工作:ideone

答案 1 :(得分:5)

而不是使用正则表达式\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

答案 2 :(得分:1)

len函数计算变量的长度,在本例中,该变量是字符串的长度,即30个字符。要对单词进行计数,您需要在空格上拆分字符串,然后计算返回的项目数。

答案 3 :(得分:1)

def main():

# get the user msg
    print "this program tells you how many words are in your sentence."
    message = raw_input("Enter message: ")

    wrdcount = 0
    for i in message.split():
        eawrdlen = len(i) / len(i)
        wrdcount = wrdcount + eawrdlen
    print wrdcount


main()

答案 4 :(得分:1)

您可以使用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

答案 5 :(得分:0)

查看collections.Counter文档中的介绍性示例。这表明如何在句子中找到单个单词。