2015-04-29 3 views
0

Я пытаюсь изолировать первые слова в серии предложений, используя Python/NLTK.Как выбрать первые элементы каждого списка в списке списков?

создал несущественную серию предложений (the_text), и хотя я могу разделить это на токенизированные предложения, я не могу успешно отделить только первые слова каждого предложения в списке (first_words).

[['Здесь', 'is', 'some', 'text', '.'], ['There', 'is', 'a', 'a', 'person', 'on ',' ',' газон ','. '], [' I ',' am ',' confused ','. '], [' There ',' is ',' more ','. '] , ['Здесь', 'is', 'some', 'more', '.'], ['I', 'do', 'not', 'know', 'anything', '.'] , ['I', 'should', 'add', 'more', '.'], ['Look', ',', 'here', 'is', 'more', 'text', '. '], [' как», 'большой', 'есть', 'что', '?']]

the_text="Here is some text. There is a a person on the lawn. I am confused. " 
the_text= (the_text + "There is more. Here is some more. I don't know anything. ") 
the_text= (the_text + "I should add more. Look, here is more text. How great is that?") 

sents_tok=nltk.sent_tokenize(the_text) 
sents_words=[nltk.word_tokenize(sent) for sent in sents_tok] 
number_sents=len(sents_words) 
print (number_sents) 
print(sents_words) 
for i in sents_words: 
    first_words=[] 
    first_words.append(sents_words (i,0)) 
print(first_words) 

Спасибо за помощь!

+0

Вы пробовали 'i [0]' вместо 'sents_words (i, 0)'? Кроме того, поставьте 'first_words = []' перед циклом или очистите его с каждой итерацией. – TigerhawkT3

+2

Вы ищете этот список - «Здесь», «Там», «Я», «Там», «Здесь», «Я», «Я», «Смотри», «Как»)? Просто используйте 'firstwords = [i [0] для i в вашем_list]' – letsc

+0

Это основная задача python, не существует никаких специфических для nltk аспектов. Сделайте так, как @letsc говорит в комментарии выше, и обратите внимание на круглые или квадратные скобки в целом. – alexis

ответ

0

Есть три проблемы с вашим кодом, и вы должны исправить все три, чтобы заставить его работать:

for i in sents_words: 
    first_words=[] 
    first_words.append(sents_words (i,0)) 

Во-первых, вы стираете first_words каждый раз через петлю: переместить first_words=[] вне цикла ,

Во-вторых, вы смешиваете синтаксис вызова функции (круглые скобки) с синтаксисом индексирования (скобки): вы хотите sents_words[i][0].

В-третьих, for i in sents_words: перебирает элементов из sents_words, а не индексов. Так что вы просто хотите i[0]. (Или, в качестве альтернативы, for i in range(len(sents_words)), но нет никаких причин, чтобы сделать это.)

Таким образом, положить его вместе:

first_words=[] 
for i in sents_words: 
    first_words.append(i[0]) 

Если вы знаете что-нибудь о comprehensions, вы можете признать, что эта модель (начать с пустым списком, перебирать что-то, добавив некоторое выражение в список) именно то, что делает список понимание:

first_words = [i[0] for i in sents_words] 

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

0
>>> sents_words = [['Here', 'is', 'some', 'text', '.'],['There', 'is', 'a', 'a', 'person', 'on', 'the', 'lawn', '.'], ['I', 'am', 'confused', '.'], ['There', 'is', 'more', '.'], ['Here', 'is', 'some', 'more', '.'], ['I', 'do', "n't", 'know', 'anything', '.'], 'I', 'should', 'add', 'more', '.'], ['Look', ',', 'here', 'is', 'more', 'text', '.'], ['How', 'great', 'is', 'that', '?']] 

Вы можете использовать цикл для append к list вы инициализирован ранее:

>>> first_words = [] 
>>> for i in sents_words: 
...  first_words.append(i[0]) 
... 
>>> print(*first_words) 
Here There I There Here I I Look How 

или понимание (заменить эти квадратные скобки со скобками, чтобы создать генератор вместо этого):

>>> first_words = [i[0] for i in sents_words] 
>>> print(*first_words) 
Here There I There Here I I Look How 

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

>>> print(*(i[0] for i in sents_words)) 
Here There I There Here I I Look How 
0

Вот пример того, как получить доступ к элементам в списках и список списков:

>>> fruits = ['apple','orange', 'banana'] 
>>> fruits[0] 
'apple' 
>>> fruits[1] 
'orange' 
>>> cars = ['audi', 'ford', 'toyota'] 
>>> cars[0] 
'audi' 
>>> cars[1] 
'ford' 
>>> things = [fruits, cars] 
>>> things[0] 
['apple', 'orange', 'banana'] 
>>> things[1] 
['audi', 'ford', 'toyota'] 
>>> things[0][0] 
'apple' 
>>> things[0][1] 
'orange' 

Для вас проблем:

>>> from nltk import sent_tokenize, word_tokenize 
>>> 
>>> the_text="Here is some text. There is a a person on the lawn. I am confused. There is more. Here is some more. I don't know anything. I should add more. Look, here is more text. How great is that?" 
>>> 
>>> tokenized_text = [word_tokenize(s) for s in sent_tokenize(the_text)] 
>>> 
>>> first_words = [] 
>>> # Iterates through the sentneces. 
... for sent in tokenized_text: 
...  print sent 
... 
['Here', 'is', 'some', 'text', '.'] 
['There', 'is', 'a', 'a', 'person', 'on', 'the', 'lawn', '.'] 
['I', 'am', 'confused', '.'] 
['There', 'is', 'more', '.'] 
['Here', 'is', 'some', 'more', '.'] 
['I', 'do', "n't", 'know', 'anything', '.'] 
['I', 'should', 'add', 'more', '.'] 
['Look', ',', 'here', 'is', 'more', 'text', '.'] 
['How', 'great', 'is', 'that', '?'] 
>>> # First words in each sentence. 
... for sent in tokenized_text: 
...  word0 = sent[0] 
...  first_words.append(word0) 
...  print word0 
...  
... 
Here 
There 
I 
There 
Here 
I 
I 
Look 
How 

>>> print first_words ['Here', 'There', 'I', 'There', 'Here', 'I', 'I', 'Look', 'How'] 

В однострочника с списковыми:

# From the_text, you extract the first word directly 
first_words = [word_tokenize(s)[0] for s in sent_tokenize(the_text)] 

# From tokenized_text 
tokenized_text= [word_tokenize(s) for s in sent_tokenize(the_text)] 
first_words = [w[0] for s in tokenized_text] 
0

Другая альтернатива, хотя она в значительной степени похожа на предложение Abarnert:

first_words = [] 
for i in range(number_sents): 
    first_words.append(sents_words[i][0]) 
Смежные вопросы