NLTK书有几个单词计数的例子,但实际上它们不是字数而是令牌数。例如,第1章,Counting Vocabulary表示以下内容给出了一个单词计数:
text = nltk.Text(tokens)
len(text)
然而,它没有 - 它给出一个单词和标点符号计数。 你怎么能得到真实的字数(忽略标点符号)?
同样,如何获得单词中的平均字符数? 显而易见的答案是:
word_average_length =(len(string_of_text)/len(text))
然而,这将是关闭的原因:
我在这里遗漏了什么吗?这必须是一个非常常见的NLP任务......
答案 0 :(得分:10)
使用正则表达式过滤掉标点符号
import re
from collections import Counter
>>> text = ['this', 'is', 'a', 'sentence', '.']
>>> nonPunct = re.compile('.*[A-Za-z0-9].*') # must contain a letter or digit
>>> filtered = [w for w in text if nonPunct.match(w)]
>>> counts = Counter(filtered)
>>> counts
Counter({'this': 1, 'a': 1, 'is': 1, 'sentence': 1})
总结每个单词的长度。除以单词数。
>>> float(sum(map(len, filtered))) / len(filtered)
3.75
或者你可以利用你已经做过的计数来阻止一些重新计算。这会将单词的长度乘以我们看到它的次数,然后将所有这些加起来。
>>> float(sum(len(w)*c for w,c in counts.iteritems())) / len(filtered)
3.75
答案 1 :(得分:10)
使用nltk进行标记
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'\w+')
text = "This is my text. It icludes commas, question marks? and other stuff. Also U.S.."
tokens = tokenizer.tokenize(text)
返回
['This', 'is', 'my', 'text', 'It', 'icludes', 'commas', 'question', 'marks', 'and', 'other', 'stuff', 'Also', 'U', 'S']
答案 2 :(得分:0)
使用与dhg相同的解决方案,但是测试给定令牌是字母数字形式,而不要使用正则表达式模式。
from collections import Counter
>>> text = ['this', 'is', 'a', 'sentence', '.']
>>> filtered = [w for w in text if w.isalnum()]
>>> counts = Counter(filtered)
>>> counts
Counter({'this': 1, 'a': 1, 'is': 1, 'sentence': 1})
优势:
"À".isalnum()
为True
,而bool(nonPunct.match(“à”))为False
(“à”不是标点符号至少用法语)。 re
软件包。