реальное количество слов в NLTK

В книге NLTK есть несколько примеров подсчета слов, но на самом деле это не подсчет слов, а подсчет токенов. Например, в главе 1 «Словарь подсчета» сказано, что следующее дает количество слов:

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

Однако он не '- он дает количество слов и знаков препинания. Как вы можете получить реальное количество слов (игнорируя знаки препинания)?

Точно так же, как вы можете получить среднее количество символов в слове? Очевидный ответ:

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

Тем не менее, это будет отключено, потому что:

len(string_of_text) is a character count, including spaces len(text) is a token count, excluding spaces but including punctuation marks, which aren't words.

Я что-то здесь упускаю? Это должно быть очень распространенной задачей НЛП ...

 dhg20 мая 2012 г., 22:51
В будущем старайтесь не задавать отдельные вопросы вместе.
 Zach20 мая 2012 г., 23:18
Хорошо. Извини за это.

Ответы на вопрос(2)

Решение Вопроса
Removing Punctuation

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})
Average Number of Characters

Суммируйте длины каждого слова. Разделите на количество слов.

>>> float(sum(map(len, filtered))) / len(filtered)
3.75

Или вы можете использовать подсчеты, которые вы уже сделали, чтобы предотвратить некоторые повторные вычисления. Это умножает длину слова на количество раз, которое мы видели, а затем суммирует все это.

>>> float(sum(len(w)*c for w,c in counts.iteritems())) / len(filtered)
3.75
 20 мая 2012 г., 23:43
Кроме того, вы можете использоватьre.split() на пунктуацию и пробелы.
 21 мая 2012 г., 00:19
@ Джоэл: 1) Я имею в виду, что если вы разделите словоU.S. в пунктуации вы получите два словаU а такжеSи это неправильно. 2)findall будет работать в этом конкретном случае, но, как я уже писал, вы можете использовать регулярное выражение, чтобы точно определить, что значит быть «токеном пунктуации»; (возможно, более сложным способом, чем я).
 21 мая 2012 г., 00:12
@dhg:U.S. довольно двусмысленно, но я понимаю, что вы говорите. Из любопытства, есть ли причина, по которой вы не используетеre.findall() ?
 20 мая 2012 г., 23:46
@Joel: Это может вызвать проблемы с пунктуацией, которая встроена в слова (например,U.S.).
 Zach20 мая 2012 г., 23:14
Таким образом, 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']

Ваш ответ на вопрос