Python :: NLTK连接句子列表

时间:2016-06-08 02:59:07

标签: python list nltk nested-lists

NLTK http://www.nltk.org/是计算语言学的工具包。

我正在尝试使用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', '.'], ...]

但是,假设我想按作者而不是书来列出句子。 以重复的方式(它不会让我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', '.'], ...]]

3 个答案:

答案 0 :(得分:2)

最好的解决方案是一次性取出它们 - 句子就像你想要的那样。 nltk的语料库读者可以接受单个文件名或文件列表:

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

在其他情况下,如果您有多个列表并且想要连接它们,则应使用extend(),而不是append()

shakespeare.extend(macbeth)
shakespeare.extend(caesar)

答案 1 :(得分:1)

我同意亚历克西斯的说法,理想的做法是立即从gutenberg语料库中获取所有这些信息。对于将来希望将各个语料库中的句子连接起来的任何人,您也可以尝试以下pythonic方法:

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

shakespeare = hamlet + macbeth + caesar

答案 2 :(得分:0)

您可以在追加到列表shakespeare后使用itertools.chain

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]