9

NLTK の本には単語数の例がいくつかありますが、実際には単語数ではなくトークン数です。たとえば、Chapter 1, Counting Vocabulary では、次のように語数を計算すると述べています。

text = nltk.Text(tokens)
len(text)

ただし、そうではありません。単語と句読点の数が表示されます。どうすれば実際の単語数を取得できますか (句読点を無視します)?

同様に、単語の平均文字数を取得するにはどうすればよいでしょうか? 明らかな答えは次のとおりです。

word_average_length =(len(string_of_text)/len(text))

ただし、次の理由により、これはオフになります。

  1. len(string_of_text) は、スペースを含む文字数です。
  2. len(text) はトークン カウントであり、スペースは除外されますが、単語ではない句読点が含まれます。

ここで何か不足していますか?これは非常に一般的な NLP タスクに違いありません...

4

3 に答える 3

21

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']
于 2014-09-05T13:19:47.253 に答える
15

句読点の削除

正規表現を使用して句読点を除外します

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
于 2012-05-20T20:46:05.293 に答える