Python :: NLTK 连接句子列表

Python :: NLTK concatenating list of sentences

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', '.'], ...]]

您可以在添加到列表后使用 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]

最好的解决方案是一次性全部提取 - 句子按照您想要的方式出现。 nltk 的语料库阅读器接受单个文件名或文件列表:

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

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

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

我同意 Alexis 的观点,理想的做法是从 gutenberg 语料库中一次获取它们。对于将来希望连接来自不同语料库的句子的任何人,您也可以尝试这种 pythonic 方法:

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

shakespeare = hamlet + macbeth + caesar