2011-04-06 13 views
1

品詞付きのタグ付き文章をテキストファイルに読み書きするための既存のモジュールまたは簡単な方法があるかどうか知りませんか?私はPythonとNatural Language Toolkit(NLTK)を使用しています。たとえば、このコード:NLTKとPythonを使用してテキストファイルからPOSタグ付き文を読み書きする

import nltk 

sentences = "Call me Ishmael. Some years ago - never mind how long precisely - having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world." 

tagged = nltk.sent_tokenize(sentences.strip()) 
tagged = [nltk.word_tokenize(sent) for sent in tagged] 
tagged = [nltk.pos_tag(sent) for sent in tagged] 

print tagged 

戻り、このネストされたリスト:

[[('Call', 'NNP'), ('me', 'PRP'), ('Ishmael', 'NNP'), ('.', '.')], [('Some', 'DT'), ('years', 'NNS'), ('ago', 'RB'), ('-', ':'), ('never', 'RB'), ('mind', 'VBP'), ('how', 'WRB'), ('long', 'JJ'), ('precisely', 'RB'), ('-', ':'), ('having', 'VBG'), ('little', 'RB'), ('or', 'CC'), ('no', 'DT'), ('money', 'NN'), ('in', 'IN'), ('my', 'PRP$'), ('purse', 'NN'), (',', ','), ('and', 'CC'), ('nothing', 'NN'), ('particular', 'JJ'), ('to', 'TO'), ('interest', 'NN'), ('me', 'PRP'), ('on', 'IN'), ('shore', 'NN'), (',', ','), ('I', 'PRP'), ('thought', 'VBD'), ('I', 'PRP'), ('would', 'MD'), ('sail', 'VB'), ('about', 'IN'), ('a', 'DT'), ('little', 'RB'), ('and', 'CC'), ('see', 'VB'), ('the', 'DT'), ('watery', 'NN'), ('part', 'NN'), ('of', 'IN'), ('the', 'DT'), ('world', 'NN'), ('.', '.')]] 

私は簡単にピクルスにこれをダンプする可能性が知っているが、私は本当に大きなテキストのセグメントとしてこれをエクスポートしますファイル。私は、リストをテキストファイルにエクスポートし、それから後でそれを解析し、元のリスト構造を復元することができるようにしたいと思います。これを行うためにNLTKに組み込まれている関数はありますか?それはおそらく、自動のタグラッパーで、pickle.dumpsを使用して、テキストファイルにその出力を挿入するように思える

<headline>Article headline</headline> 
<body>Call me Ishmael...</body> 
<pos_tags>[[('Call', 'NNP'), ('me', 'PRP'), ('Ishmael', 'NNP')...</pos_tags> 

答えて

1

:私が見てきたが、どの...

出力例を見つけることができませんあなたの要求を満たすことができます。

テキスト出力をどのように表示したいかについて具体的に説明できますか? 人間が読めるようなものを目指していますか?

EDIT:

from xml.dom.minidom import Document, parseString 
import nltk 

sentences = "Call me Ishmael. Some years ago - never mind how long precisely - having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world." 

tagged = nltk.sent_tokenize(sentences.strip()) 
tagged = [nltk.word_tokenize(sent) for sent in tagged] 
tagged = [nltk.pos_tag(sent) for sent in tagged] 

# Write to xml string 
doc = Document() 

base = doc.createElement("Document") 
doc.appendChild(base) 

headline = doc.createElement("headline") 
htext = doc.createTextNode("Article Headline") 
headline.appendChild(htext) 
base.appendChild(headline) 

body = doc.createElement("body") 
btext = doc.createTextNode(sentences) 
headline.appendChild(btext) 
base.appendChild(body) 

pos_tags = doc.createElement("pos_tags") 
tagtext = doc.createTextNode(repr(tagged)) 
pos_tags.appendChild(tagtext) 
base.appendChild(pos_tags) 

xmlstring = doc.toxml() 

# Read back tagged 

doc2 = parseString(xmlstring) 
el = doc2.getElementsByTagName("pos_tags")[0] 
text = el.firstChild.nodeValue 
tagged2 = eval(text) 

print "Equal? ", tagged == tagged2
+0

ありがとうございました。ええ、可能ならば人間が読めるようにしたいと思います。私は新聞記事からデータを抽出し、タグ付きレコードを作成しています。私はフィールドの1つに記事のPOSタグ付き文章を入れることを望みます。理想的な出力の例として上記の編集を参照してください... – rjf

+0

あなたが望む出力はあなたのリストのpython reprと同じですか? – so12311

+0

ええ、repr()を使って文字列にしたら、それをリストに戻す方法はありますか? – rjf

3

いくつかのコードを追加することNLTKは、タグ付きテキストのための標準的なファイル形式を持っています。これは次のようになります。

コール/ NNP me/PRP Ishmael/NNP ./。

それはNLTKのTaggedCorpusReaderおよび他の類似のクラスを使用してファイルを読み込み、コーパスリーダー機能の完全な範囲を取得することができますので、あなたは、この形式を使用する必要があります。紛らわしいことに、にこの形式でタグ付けされたコーパスを書くためNLTKには高レベルの機能はありませんが、それは非常に簡単ですので、それはおそらくです:

for sent in tagged: 
    print " ".join(word+"/"+tag for word, tag in sent) 

(NLTKはnltk.tag.tuple2str()を提供していますが、それは一つだけを扱います単にword+"/"+tagと入力する方が簡単です)。 sents()方法はいえ、あなたがタグなしのテキストを与えること

mycorpus = nltk.corpus.reader.TaggedCorpusReader("path/to/corpus", "file.*\.txt") 
print mycorpus.fileids() 
print mycorpus.sents()[0] 
for sent in mycorpus.tagged_sents(): 
    <etc> 

注:

あなたはこの形式で1つ以上のファイルfileN.txtであなたのタグ付きテキストを保存する場合は、このようなnltk.corpus.reader.TaggedCorpusReaderでそれを読み戻すことができますビットは奇妙な間隔です。あなたの例のように、タグ付きとタグなしの両方のバージョンをファイルに含める必要はありません。

TaggedCorpusReaderは、ファイルのヘッダー(タイトルなど)をサポートしていませんが、本当に必要な場合は、ファイルメタデータを読み取り、残りの部分をTaggedCorpusReaderのように処理する独自のクラスを派生させることができます。

+0

小さなエラーが発生した場合、参加呼び出しの中でリストを作成する必要があります: ""ジョイン([word + "/" + tag for sent]) –

+0

@RahulJha、なぜですか?私がそれを書いたようにそれを試してください。これはジェネレータと呼ばれ、事前に結果リストを構築することなく機能します(非常に長いリストには最適ですが、どこでもうってつけです)。 – alexis

関連する問題