2018年06月24日

言語処理100本ノックでPython入門 #54 - Stanford Core NLPの出力を品詞タグ付け

  
今日は、言語処理100本ノック 2015の第6章・問題54を解きます。

■ 問題

54. 品詞タグ付け
Stanford Core NLPの解析結果XMLを読み込み,単語,レンマ,品詞をタブ区切り形式で出力せよ.


■ Pythonのコード
import re
from xml.etree import ElementTree

def getWords():
    xdoc = ElementTree.parse('nlp.txt.xml')
    root = xdoc.getroot()
    sentences = root.find('document/sentences')
    for e in sentences.findall('sentence/tokens/token'):
        yield e.find('word'), e.find('lemma'), e.find('POS')

def main():
    with open('result54.txt', 'w', encoding='utf8') as w:
        for word, lemma, pos in getWords():
            m = re.search(r'[A-Z]', pos.text)
            if m:
                w.write(f'{word.text}\t{lemma.text}\t{pos.text}\n')


if __name__ == '__main__':
    main()

ソースコードは、GitHubで公開しています。

■ すこし説明

問題53とほとんど変わらないです。
getWords関数で以下のように3つのタプルを返すようにして、
for e in sentences.findall('sentence/tokens/token'):
    yield e.find('word'), e.find('lemma'), e.find('POS')
main関数では、このタプルの word.text, lemma.text, pos.txtををタブ区切りで出力しています。

ただし、ピリオドやカンマなどの記号を除外するために、正規表現を使っています。 pos.textがどのような値を取りうるのかがわからないのですが、ここでは、アルファベット大文字が1文字でも含まれて入れば、記号ではない別の品詞だと判断しています。
    m = re.search(r'[A-Z]', pos.text)
    if m:
        w.write(f'{word.text}\t{lemma.text}\t{pos.text}\n')

■ 結果

先頭の30行ほどを掲載します。
Natural	natural	JJ
Natural	natural	JJ
language	language	NN
processing	processing	NN
From	from	IN
Wikipedia	Wikipedia	NNP
the	the	DT
free	free	JJ
encyclopedia	encyclopedia	NN
Natural	natural	JJ
language	language	NN
processing	processing	NN
-LRB-	-lrb-	-LRB-
NLP	nlp	NN
-RRB-	-rrb-	-RRB-
is	be	VBZ
a	a	DT
field	field	NN
of	of	IN
computer	computer	NN
science	science	NN
artificial	artificial	JJ
intelligence	intelligence	NN
and	and	CC
linguistics	linguistics	NNS
concerned	concern	VBN
with	with	IN
the	the	DT
interactions	interaction	NNS
between	between	IN
computers	computer	NNS