将nltk.pos_tags输出写入制表符分隔的列

时间:2017-05-26 15:40:01

标签: python tags nltk

我必须从现有的文本文件中复制信息并在同一行添加pos标签并将其写入新文件,但我不知道如何获得正确的输出,提前感谢。

我目前的输出:

0 5 1001 China
5 7 1002 's
8 17 1003 state-run
18 23 1004 media
24 27 1005 say
28 29 1006 a
NNP POS JJ NNS VBP DT

代码:

import sys
import nltk

def main():
    list1 = []
    read = open("en.tok.off", "r")
    data = read.read()
    result = ''.join([i for i in data if not i.isdigit()])

    result = result.split()

    data3 = nltk.pos_tag(result)

    words, tags = zip(*data3)
    tags = " ".join(tags)

    print(tags)
    outfile = open("en.tok.off.pos", "w")

    outfile.write(data)
    outfile.write(tags)
    outfile.close()

main()

我希望NNP在0 5 1001 ChinaPOS的第五列和5 7 1002 's之后的同一行,

期望的输出:

0 5 1001 China NNP
5 7 1002 's POS
8 17 1003 state-run JJ

2 个答案:

答案 0 :(得分:0)

不是丢弃数字(也会丢弃文本中的数字!),而是收集所有内容并提取第四列进行标记。

data = read.read()
rows = [ line.split() for line in data.splitlines() ]
words = [ row[3] for row in rows ]
tagged = nltk.pos_tag(words)

然后你可以把这些碎片放回原处。

tagged_rows = [ row + [ tw[1] ] for row, tw in zip(rows, tagged) ]

(在相对较新的Python版本中,您可以进一步压缩上述内容)。另一种方法是使用numpypandas等库,您可以在其中为数据添加列。但我认为这种方法更简单,因此更可取。

答案 1 :(得分:0)

使用最新的nltk版本(v3.2.4),align_tokens函数可能对令牌偏移(前两列)有帮助。

至于将POS打印为最后一列,只需将每个单词所需的元素放入列表中,然后使用str.join()函数即可。 :

>>> x = ['a', 'b', 'c']
>>> print ('\t'.join(x))
a   b   c
>>> x.append('d')
>>> print ('\t'.join(x))
a   b   c   d

特定于您的代码:

[IN]:

$ cat test.txt
China's state-run media say a 

[代码]:

from nltk.tokenize.treebank import TreebankWordTokenizer
from nltk.tokenize.util import align_tokens
from nltk import pos_tag

tb = TreebankWordTokenizer()

with open('test.txt') as fin:
    for line in fin:
        text = line.strip()
        tokens = tb.tokenize(text)
        tagged_tokens = pos_tag(tokens)
        offsets = align_tokens(tokens, text)
        for (start, end), (tok, tag) in zip(offsets, tagged_tokens):
            print ('\t'.join([str(start), str(end), tok, tag]))

[OUT]:

0   5   China   NNP
5   7   's  POS
8   17  state-run   JJ
18  23  media   NNS
24  27  say VBP
28  29  a   DT