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