2017-05-26 12 views
0

既存のテキストファイルから情報をコピーし、同じ行にposタグを追加して新しいファイルに書き込む必要がありますが、正しい出力を得る方法がありません、 前もって感謝します。タブで区切られた列にnltk.pos_tagsの出力を書き込む

私の現在の出力:

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

私は5 7 1002 's後の同じ行に0 5 1001 ChinaPOSで5列目にNNPをしたい、など

所望の出力:

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

インデントでこれをフォーマットしてください。 – mauve

答えて

0

数字を投げ捨てるのではなく(テキストの数字を捨てる)、すべてを集めてタグ付けするための4番目の列を抽出します。

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では、さらに圧縮することができます)。代わりに、numpyまたはpandasのようなライブラリを使用して、データに列を追加することもできます。しかし、私はこのアプローチがより簡単で、したがって好ましいと考えています。

0

最新のnltkリリース(v3.2.4)を使用すると、トークンオフセット(最初の2つの列)に役立つ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 

[中]:

$ 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])) 

[出]:

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 
関連する問題