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
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