使用Python从语料库中提取句子

时间:2012-10-15 16:03:23

标签: python python-2.7

我试图通过使用Python从文本中提取句子。文本中的每个单词都写成一行,其中包含与该单词相关的其他信息:

Mary Noun Name
loves Verb No-Name
John Noun Name
. Punct No-Name

句子边界用空行标记。我想提取包含具有某些特定特征的单词的整个句子(例如带有名字的句子)。

现在使用,我只设法提取感兴趣的词,而不是整个句子。 我使用.readlines()逐行阅读文本。然后我遍历这些行并使用re和.split('\t')来分割行,以便每行由3个元素的列表表示。然后我将列表中的元素与所需的值匹配,并且可以提取相关的单词,但我无法弄清楚如何提取整个句子..

任何人都有一些建议吗?

4 个答案:

答案 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解决方案与存储“已解析”句子的腌制结果相结合,以便下次您可以加载该信息并开始更快速地搜索。

如果您的句子列表不适合记忆,那么如果您使用二元泡菜,则将单个句子信息按顺序存储在文件中,在每个酸洗句子之前存储长度指示符。

如果您经常搜索并且解析需要大量时间(使用大量文本),这种额外的努力是值得的。