2012-03-19 4 views
1

Я только начал работать с nltk, и мне трудно получить модуль согласования для работы с условными переменными. Я хотел бы вернуть согласование для любого данного слова в латинском тексте, но поскольку язык изменен, я хочу иметь возможность указывать стебель, идентифицировать любое слово в корпусе, содержащем основу, и возвращать согласование для этого , Код я использую:Использование условных переменных с модулем согласования nltk

book1 = open('Book1.txt', 'rU').read() 
token1 = nltk.word_tokenize(book1) 
text1 = nltk.Text(token1) 

word = raw_input("What stem do you want to search?\n > ") 

text1.concordance([w for w in text1 if w.startswith(word)]) 

Который возвращает ошибку:

Traceback (most recent call last): 
    File "C:\Users\admin\Desktop\start_nltk_horace.py", line 68, in <module> 
    concordance() 
    File "C:\Users\admin\Desktop\start_nltk_horace.py", line 49, in concordance 
    text1.concordance([w for w in text1 if w.startswith(word)]) 
    File "C:\Python27\lib\site-packages\nltk\text.py", line 314, in concordance 
    self._concordance_index.print_concordance(word, width, lines) 
    File "C:\Python27\lib\site-packages\nltk\text.py", line 177, in print_concordance 
    offsets = self.offsets(word) 
    File "C:\Python27\lib\site-packages\nltk\text.py", line 156, in offsets 
    word = self._key(word) 
    File "C:\Python27\lib\site-packages\nltk\text.py", line 312, in <lambda> 
    key=lambda s:s.lower()) 
AttributeError: 'list' object has no attribute 'lower' 

Просто указав text1.concordance(word) возвращает то, что я ищу без каких-либо проблем (при условии ввода я полностью отказался-слово) , но я должен был бы повторить функцию шесть-х раз, чтобы получить согласование для всех разных выражений слова.

ответ

1

Я думаю, проблема в том, что вы пытаетесь предоставить NLTK concordance() функцию со списком слов, когда она принимает только строку. Попробуйте следующие вместо:

my_concordances = [] 
my_inputs = [elem for elem in text1 if elem.startswith(word)] 
for input in my_inputs: 
    my_concordances.append(text1.concordance(input)) 

Затем my_concordances должны в конечном итоге в виде списка, где каждая запись является конкордантностью другого слова, которое началось с входной строкой сырой. Вы также можете рассмотреть предварительное выделение пространства для my_concordances в зависимости от того, какой конкретный тип данных возвращается функцией concordance(), так как вы можете просто проверить длину my_inputs. Это может повысить скорость, если это проблема.

Обратите внимание, что this question может вас заинтересовать. Более подробно он находится на concordance().

+0

Это сработало отлично, спасибо большое! – Faulconbridge

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