2016-06-08 2 views
3

NLTKhttp://www.nltk.org/ - это набор инструментов для вычислительной лингвистики.Python :: NLTK объединение списков предложений

Я пытаюсь манипулировать предложения, используя sents() метод:

from nltk.corpus import gutenberg 

выбирающий текстов fileid:

hamlet = gutenberg.sents('shakespeare-hamlet.txt') 

выход является:

print hamlet 
[['[', 'The', 'Tragedie', 'of', 'Hamlet', 'by', 'William', 'Shakespeare', '1599', ']'], ['Actus', 'Primus', '.'], ...] 

Но, допустим, Я хочу составить список предложений автором, а не bo ОК. В повторяющемся образе (это не позволит мне extend() списков):

shakespeare = [] 

hamlet = gutenberg.sents('shakespeare-hamlet.txt') 
macbeth = gutenberg.sents('shakespeare-macbeth.txt') 
caesar = gutenberg.sents('shakespeare-caesar.txt') 

shakespeare.append(hamlet) 
shakespeare.append(macbeth) 
shakespeare.append(caesar) 

, но тогда все это становится вложенным:

print shakespeare 

[[['[', 'The', 'Tragedie', 'of', 'Hamlet', 'by', 'William', 'Shakespeare', '1599', ']'], ['Actus', 'Primus', '.'], ...], [['[', 'The', 'Tragedie', 'of', 'Macbeth', 'by', 'William', 'Shakespeare', '1603', ']'], ['Actus', 'Primus', '.'], ...], [['[', 'The', 'Tragedie', 'of', 'Julius', 'Caesar', 'by', 'William', 'Shakespeare', '1599', ']'], ['Actus', 'Primus', '.'], ...]] 

Есть ли способ, что я могу закончить с ОДНОГО списка со всеми конкатенированные предложения, не вложенные, вот так?

['[', 'The', 'Tragedie', 'of', 'Hamlet', 'by', 'William', 'Shakespeare', '1599', ']'], ['Actus', 'Primus', '.'], ...], [['[', 'The', 'Tragedie', 'of', 'Macbeth', 'by', 'William', 'Shakespeare', '1603', ']'], ['Actus', 'Primus', '.'], ...], [['[', 'The', 'Tragedie', 'of', 'Julius', 'Caesar', 'by', 'William', 'Shakespeare', '1599', ']'], ['Actus', 'Primus', '.'], ...]] 
+0

Ваш пример внизу не является допустимым списком. Это поможет, если вы дадите немного больше информации о том, что вы ищете (и/или дважды проверяете свой пример). – Daniel

+0

@ Даниэль, там вы идете, я отредактировал нижний пример. спасибо, что предупредил меня. синтаксис для приведенных выше примеров совершенно прав. –

+0

Мое удовольствие - хотя, это все еще не совсем так (ваш пример, как написано, вызывает «SyntaxError»). Я думаю, что я вижу, для чего вы идете: похоже, что вы хотите этого '[',' The ',' Tragedie ',' of ',' Hamlet ',' для первого элемента вместо этого '[', ' «The», «Tragedie», «of», «Hamlet», «но это всего лишь предположение. Просто посмотрел ваше последнее редактирование, хотя, что делает его намного понятнее - спасибо! – Daniel

ответ

0

Вы можете использовать itertools.chain после добавления в список shakespeare:

from itertools import chain 

lis = list(chain.from_iterable(shakespeare)) 

# output: 
# [ 
# ['[', 'The', 'Tragedie', 'of', 'Hamlet', 'by', 'William', 'Shakespeare', '1599', ']'], 
# ['Actus', 'Primus', '.'], 
# ['[', 'The', 'Tragedie', 'of', 'Macbeth', 'by', 'William', 'Shakespeare', '1603', ']'], 
# ['Actus', 'Primus', '.'], 
# ['[', 'The', 'Tragedie', 'of', 'Julius', 'Caesar', 'by', 'William', 'Shakespeare', '1599', ']'], 
# ['Actus', 'Primus', '.'] 
# ] 

Вы также можете выбрать для list comprehension с двойной петлей:

lis = [y for x in shakespeare for y in x] 
+0

спасибо. первый вариант немного быстрее. –

+0

Мое удовольствие - рад, что это сработало для вас, и удачи! – Daniel

1

Лучшим решением будет просто принесите их все сразу - предложения приходят так, как вы хотите их. Читатели корпусных В NLTK в принимают либо одно имя файла или список файлов:

shakespeare = gutenberg.sents(['shakespeare-hamlet.txt', 
       'shakespeare-macbeth.txt', 'shakespeare-caesar.txt']) 

В других ситуациях, если у вас есть несколько списков, и вы хотите, чтобы объединить их следует использовать extend(), не append():

shakespeare.extend(macbeth) 
shakespeare.extend(caesar) 
Смежные вопросы