【问题标题】:Extracting tuples with nltk?用nltk提取元组?
【发布时间】:2014-10-12 18:59:58
【问题描述】:

阅读 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()

【问题讨论】:

  • 我有一个正则表达式方法,是否值得将问题描述放入实际脚本中?
  • 您的文件到底是什么样的?句子边界如何表示?请注意,如果您使用 """(multiple lines)""" 包围整个内容,则可以在单个 python 文字字符串中嵌入多行
  • 另外,脚本的最后一行会在正确的上下文中为您提供一个生成器。要查看您的工作代码,请写result = list( nl.tag.str2tuple(t) for t in sent.split() )

标签: python nlp nltk


【解决方案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

[出]:

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

【讨论】:

  • 谢谢@alvas,我可能会像这样进行几次字符串解析。你会推荐我使用这种方法还是正则表达式?
  • 我有一个 .tag 文本,我都用 rady POS 标记语料库,输出看起来像这样。
  • regex 或者 csv 没关系,我猜你也可以line.split('\t')
【解决方案2】:

由于您可能对使用 NLTK 的语料库感兴趣:假设您的文件以这种格式存储,您应该读入、解析它(使用 str2tuple 或其他更简单的方法)并使用 @987654322 加载它@。然后,您可以使用所有标准的 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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    相关资源
    最近更新 更多