我试图通过使用Python从文本中提取句子。文本中的每个单词都写成一行,其中包含与该单词相关的其他信息:
Mary Noun Name
loves Verb No-Name
John Noun Name
. Punct No-Name
句子边界用空行标记。我想提取包含具有某些特定特征的单词的整个句子(例如带有名字的句子)。
现在使用,我只设法提取感兴趣的词,而不是整个句子。
我使用.readlines()
逐行阅读文本。然后我遍历这些行并使用re和.split('\t')
来分割行,以便每行由3个元素的列表表示。然后我将列表中的元素与所需的值匹配,并且可以提取相关的单词,但我无法弄清楚如何提取整个句子..
任何人都有一些建议吗?
答案 0 :(得分:1)
你可以用空行分解,将类型拆分成一个集合,然后使用它 - 一个未经测试的例子......
text="""Mary Noun Name
loves Verb No-Name
John Noun Name
. Punct No-Name
John Noun Name
loves Verb No-Name
Mary Noun Name
. Punct No-Name"""
from itertools import takewhile
sentences = []
split = iter(text.splitlines())
while True:
sentence = list(takewhile(bool, split))
if not sentence:
break
types = set(el.split()[1] for el in sentence)
words = [el.split(' ', 1)[0] for el in sentence]
sentences.append(
{
'sentence': sentence,
'types': types,
'words': words
}
)
print sum(1 for el in sentences if 'Noun' in el['types']), 'sentences contain Noun'
print sentences[0]['words']
答案 1 :(得分:0)
我会将各行解析为字典,您可以将其分组到以标点符号(或句点)分隔的列表中。
sentences = []
columns = ('word', 'pos', 'type')
with open('file.txt', 'r') as handle:
sentence = []
for row in handle:
chunks = row.split('\t')
structure = dict(zip(columns, chunks))
sentence.append(structure)
if structure['pos'] == 'Punct':
sentences.append(sentence)
sentence = []
现在,sentences
包含包含句子所有部分的列表(如果此代码有效)。
我会留给你弄清楚如何做其余的事情。使用几个for
循环来查找目标句子应该很容易。
要打印一个给出列表的句子,这样的事情应该让你开始:
print ' '.join((chunk['word'] for chunk in sentence))
答案 2 :(得分:0)
现有的答案假设语料库足够小,可以一次读入内存并构建 然后过滤的句子的数据结构。如果不是这种情况(即使现在,也可能不是将来),您需要做一些生成器解决方案。我会看一下类似的问题:Python: How to loop through blocks of lines,看看你能否为你做这件事。
就个人而言,我认为人们通过强制使用单一工具为自己做更多的工作。这个特殊问题是为简单的awk过滤器准备的:
awk -v RS='\n\n' -v FS='\n' -v ORS='\n\n' -v OFS='\n' '/ Name/'
当然,如果您要在python中进行进一步处理,那么这两个点都无效。
答案 3 :(得分:0)
您可能希望将Blender或Jon Clements解决方案与存储“已解析”句子的腌制结果相结合,以便下次您可以加载该信息并开始更快速地搜索。
如果您的句子列表不适合记忆,那么如果您使用二元泡菜,则将单个句子信息按顺序存储在文件中,在每个酸洗句子之前存储长度指示符。
如果您经常搜索并且解析需要大量时间(使用大量文本),这种额外的努力是值得的。