2012-05-11 3 views
1

я могу читать текст с NLTK корпусов python2.6:Как эффективно найти списки букв с помощью NLTK в Python?

from nltk.corpus import gutenberg 
for fileid in gutenberg.fileids(): 
    num_chars = len(gutenberg.raw(fileid)) 
    num_words = len(gutenberg.words(fileid)) 
    num_sents = len(gutenberg.sents(fileid)) 
    num_vocab = len(set([w.lower() for w in gutenberg.words(fileid)])) 
    print int(num_chars/num_words), int(num_words/num_sents), int(num_words/num_vocab), fileid 

Теперь я хотел бы найти средние вхождений букв слов и фраз, что-то вроде num_letters (whole_text, [ «а», «бб» , 'ccc']). Ожидаемый результат:

а = n11/n12, бб = n21/n22, ссс = n31/n32

где N11 = вхождения в слова и N12 = появлений на предложениях.

ответ

2

Вы можете сделать это, находя все матчи для каждого элемента, который вы хотите, чтобы соответствовать против в объеме текста с помощью регулярных выражений:

import re 
matches = ['a', 'bb', 'ccc', 'and'] 

#add this line into your for loop: 
    num_letter_dict = dict([(match, len([seq.start() for seq in 
      re.finditer(match, gutenberg.raw(fileid))])) for match in matches]) 

Это создает словарь всех матчей и их частоты. Таким образом, для первого текста, austen-emma.txt, мы получаем для num_letter_dict:

{'a': 53669, 'and': 5257, 'ccc': 0, 'bb': 52} 

Чтобы перейти отсюда к среднему числу вхождений в словах и предложениях прямо вперед, просто разделить насквозь num_words и num_sents соответственно.

Чтобы найти количество слов, которые включают в себя следующие элементы (повторы в пределах слова, не учитываются), использование:

num_letter_in_words = dict([(match, len([word for word in gutenberg.words(fileid) 
             if match in word])) for match in matches]) 
#from the same text gives: 
{'a': 50043, 'and': 5257, 'ccc': 0, 'bb': 52} 

В качестве примера:

text = 'apples pairs bannanas' 
matches = ['a', 'n', 'p'] 
#gives: 
{'a': 3, 'p': 2, 'n': 1} 
+0

Как бы вы получите процент появление буквы, используемой для слов? Теперь кажется, что «несколько раз» за слово, я прав? – MarkokraM

+0

@PHPGAE - Извините, я не понимаю ваш вопрос, не могли бы вы дать более подробную информацию. И вы на самом деле имеете в виду буквы (a, b, c, d, e ...)? – fraxel

+0

Скажите слово «домохозяйство» 2 * h, 2 * o, 2 * ho, ... Если я хочу получить среднее появление строк [h, o, ho] за слова, я думаю, мне нужно их пересчитать только один раз за слово, а не дважды. Его отличие по сравнению с тем, чтобы получить средний показатель за весь текстовый корпус. – MarkokraM

Смежные вопросы