2018年06月27日

言語処理100本ノックでPython入門 #55 - Stanford Core NLPの出力から人名を抜き出す

  

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

■ 問題
55. 固有表現抽出
入力文中の人名をすべて抜き出せ.

■ どうやって解くか

まず、Stanford Core NLPが出力した解析結果(xmlフィル)ファイルを見てみます。

人名の場合には、以下のようにNERタグが PERSON となっています。
これを抜き出せばOKですね。

<token id="4">
  <word>Alan</word>
  <lemma>Alan</lemma>
  <CharacterOffsetBegin>646</CharacterOffsetBegin>
  <CharacterOffsetEnd>650</CharacterOffsetEnd>
  <POS>NNP</POS>
  <NER>PERSON</NER>
  <Speaker>PER0</Speaker>
</token

■ Pythonのコード

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'):
        if e.find('NER').text == 'PERSON':
            yield e.find('word')


def main():
    with open('result55.txt', 'w', encoding='utf8') as w:
        for word in getWords():
            w.write(f'{word.text}\n')


if __name__ == '__main__':
    main()


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

■ 結果

以下、結果です。
Alan
Turing
Joseph
Weizenbaum
MARGIE
Schank
Wilensky
Meehan
Lehnert
Carbonell
Lehnert
Racter
Jabberwacky
Moore