用nltk提取元组?

时间:2014-09-30 05:36:03

标签: python nlp nltk

阅读nltk的文档,我发现可以使用str2tuple()提取元组。作为一个例子假设我有以下句子(显然是一个更大的文件):

sent = "pero pero CC " \
        "tan tan RG " \
        "antigua antiguo AQ0FS0 " \
        "que que CS " \
        "según según SPS00 " \
        "mi mi  DP1CSS " \
        "madre madre NCFS000"

我想提取一个元组列表,例如:

> ([antigua, AQ0FS0],[madre, NCFS000])

女性形容词标记(AQ0FS0)和女性名词标记(NCFS000)。这可能是str2tuple()还是更好的方法可以使用正则表达式?

这就是我的尝试:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import nltk as nl

sent = "pero pero CC " \
              "tan tan RG " \
              "antigua antiguo AQ0FS0 " \
              "que que CS " \
              "según según SPS00 " \
              "mi mi  DP1CSS " \
              "madre madre NCFS000"

nl.tag.str2tuple(t) for t in sent.split()

2 个答案:

答案 0 :(得分:1)

我认为你所拥有的是一个垂直文本文件,又称为.vrt,请参阅CWB encoding Corpus

我想第一列是单词的表面形式,第二列是某种引理,第三列是词性文本。

首先看看csv模块,我觉得本教程很有用,http://www.pythonforbeginners.com/systems-programming/using-the-csv-module-in-python/

假设您有一个制表符分隔文件:

pero    pero    CC
tan tan RG
antigua antiguo AQ0FS0
que que CS
según   según   SPS00
mi  mi  DP1CSS
madre   madre   NCFS000

要阅读文件,有时人们称之为“解析文件”:

import csv

with open('test.txt', 'r') as fin:
    reader = csv.reader(fin, delimiter='\t')
    for line in reader:
        word, lemma, pos = line
        print word, lemma, pos

要获得句子的(word,pos)元组结构,请尝试:

import csv
sentences = []
with open('test.txt', 'r') as fin:
    reader = csv.reader(fin, delimiter='\t')
    for line in reader:
        word, lemma, pos = line
        sentences.append((word, pos))

print sentences

[OUT]:

[('pero', 'CC'), ('tan', 'RG'), ('antigua', 'AQ0FS0'), ('que', 'CS'), ('seg\xc3\xban', 'SPS00'), ('mi', 'DP1CSS'), ('madre', 'NCFS000')]

答案 1 :(得分:1)

由于您可能对将您的语料库与NLTK一起使用感兴趣:假设您的文件以此格式存储,您应该阅读它,解析它(使用str2tuple或其他更简单的方法)并加载它与TaggedCorpusReader。然后您可以使用所有标准的NLTK语料库功能。你基本上有两种类型的标签,词性和(推测)单词引理。如果这是您所追求的,我可以在此答案中添加更多具体信息。

假设你的字符串在每个三元组之后实际包含一个换行符,将它解析为元组列表的简单方法是这样的:

sent = """pero pero CC
tan tan RG
antigua antiguo AQ0FS0
que que CS
según según SPS00
mi  mi DP1CSS
madre madre NCFS000"""

tuples = [ line.split() for line in sent.splitlines() ]

细节:split()实际上返回一个列表,而不是一个元组。如果您需要将它们用作字典键,请将line.split()替换为tuple(line.split())