言語処理100本ノック-54:品詞タグ付け

[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)[「第6章: 英語テキストの処理」](http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch6)の[54本目「品詞タグ付け」](http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec54)記録です。
XML解析方法とレンマ、品詞について学びます。

# 参考リンク

|リンク|備考|
|:--|:--|
|[054.品詞タグ付け.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/06.%E8%8B%B1%E8%AA%9E%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E5%87%A6%E7%90%86/054.%E5%93%81%E8%A9%9E%E3%82%BF%E3%82%B0%E4%BB%98%E3%81%91.ipynb)|回答プログラムのGitHubリンク|
|[素人の言語処理100本ノック:54](https://qiita.com/segavvy/items/4d55805352089332828e)|多くのソース部分のコピペ元|
|[Stanford Core NLP公式](https://stanfordnlp.github.io/CoreNLP/)|最初に見ておくStanford Core NLPのページ|

# 環境

|種類|バージョン|内容|
|:--|:--|:--|
|OS|Ubuntu18.04.01 LTS|仮想で動かしています|
|pyenv|1.2.16|複数Python環境を使うことがあるのでpyenv使っています|
|Python|3.8.1|pyenv上でpython3.8.1を使っています<br>パッケージはvenvを使って管理しています|
|Stanford CoreNLP|3.9.2|インストールしたのが1年前で詳しく覚えていないです・・・<br>1年たってもそれが最新だったのでそのまま使いました|
|openJDK|1.8.0_242|他目的でインストールしていたJDKをそのまま使いました|

# [第6章: 英語テキストの処理](http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch6)
## 学習内容
> Stanford Core NLPを用いた英語のテキスト処理を通じて，自然言語処理の様々な基盤技術を概観します．
>> [Stanford Core NLP](https://stanfordnlp.github.io/CoreNLP/), ステミング, 品詞タグ付け, 固有表現抽出, 共参照解析, 係り受け解析, 句構造解析, S式

## ノック内容
> 英語のテキスト（[nlp.txt](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/nlp.txt)）に対して，以下の処理を実行せよ．

### [54. 品詞タグ付け](http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec54)
> Stanford Core NLPの解析結果XMLを読み込み，単語，レンマ，品詞をタブ区切り形式で出力せよ．

### 課題補足(「レンマ」について)
[Wikipedia 語彙素](https://ja.wikipedia.org/wiki/%E8%AA%9E%E5%BD%99%E7%B4%A0)によると「レンマ」は以下のように解説されています。**children にとっての childであったりgoes にとっての go が「レンマ」ですね。**

> 語彙素（ごいそ:Lexeme）とは、言語学における形態論的単位であり、異なる形態であるが同じ語であると考えられるものからなる語の集合をいう。例えば英語のchild - children、go - goes - went - gone - going、あるいはbig - bigger - biggestは、それぞれ同じ語彙素としてまとめられる。
> **形態素はレンマ（Lemma、基本形：上の例でいえばそれぞれchild、go、big）で代表され**、ある言語における語彙素の総体がレクシコン（Lexicon、語彙目録）である。レクシコンとレンマは一般的概念であるが、具体的なものとしては辞書と見出し語とに相当する。

# 回答
## 回答プログラム [054.品詞タグ付け.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/06.%E8%8B%B1%E8%AA%9E%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E5%87%A6%E7%90%86/054.%E5%93%81%E8%A9%9E%E3%82%BF%E3%82%B0%E4%BB%98%E3%81%91.ipynb)

```python
import xml.etree.ElementTree as ET

for i, token in enumerate(ET.parse('./nlp.txt.xml').iter('token')):
    print('{}\t{}\t{}\t{}'.format(i, token.findtext('word'), 
                                  token.findtext('lemma'), token.findtext('POS')))
    
    # 多いので制限
    if i > 30:
        break
```

## 回答解説
### XMLファイルのパス
以下のXMLファイルのパスと目的とする単語，レンマ，品詞のマッピングです。

|出力|第1階層|第2階層|第3階層|第4階層|第5階層|第6階層|第7階層|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|単語|root|document|sentences|sentence|tokens|token|word|
|レンマ|root|document|sentences|sentence|tokens|token|lemma|
|品詞|root|document|sentences|sentence|tokens|token|POS|


XMLファイルは[GitHub](https://github.com/YoheiFukuhara/nlp100/blob/master/06.%E8%8B%B1%E8%AA%9E%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E5%87%A6%E7%90%86/nlp.txt.xml)に置いています。

```xml:nlp.txt.xml(抜粋)
<root>
  <document>
    <docId>nlp.txt</docId>
    <sentences>
      <sentence id="1">
        <tokens>
          <token id="1">
            <word>Natural</word>
            <lemma>natural</lemma>
            <CharacterOffsetBegin>0</CharacterOffsetBegin>
            <CharacterOffsetEnd>7</CharacterOffsetEnd>
            <POS>JJ</POS>
            <NER>O</NER>
            <Speaker>PER0</Speaker>
          </token>
          <token id="2">
            <word>language</word>
            <lemma>language</lemma>
            <CharacterOffsetBegin>8</CharacterOffsetBegin>
            <CharacterOffsetEnd>16</CharacterOffsetEnd>
            <POS>NN</POS>
            <NER>O</NER>
            <Speaker>PER0</Speaker>
          </token>
          <token id="3">
            <word>processing</word>
            <lemma>processing</lemma>
            <CharacterOffsetBegin>17</CharacterOffsetBegin>
            <CharacterOffsetEnd>27</CharacterOffsetEnd>
            <POS>NN</POS>
            <NER>O</NER>
            <Speaker>PER0</Speaker>
          </token>
```

### 出力結果(実行結果)
プログラム実行すると以下の結果が出力されます。
ちなみにこの品詞は何を示しているのか初見でわかりません。記事[「Stanford CoreNLP POSタグ まとめ」](https://qiita.com/syunyo/items/2c1ce1d765f46a5c1d72)が素晴らしくまとめてくれていました！

```bash:出力結果
0	Natural	natural	JJ
1	language	language	NN
2	processing	processing	NN
3	From	from	IN
4	Wikipedia	Wikipedia	NNP
5	,	,	,
6	the	the	DT
7	free	free	JJ
8	encyclopedia	encyclopedia	NN
9	Natural	natural	JJ
10	language	language	NN
11	processing	processing	NN
12	-LRB-	-lrb-	-LRB-
13	NLP	nlp	NN
14	-RRB-	-rrb-	-RRB-
15	is	be	VBZ
16	a	a	DT
17	field	field	NN
18	of	of	IN
19	computer	computer	NN
20	science	science	NN
21	,	,	,
22	artificial	artificial	JJ
23	intelligence	intelligence	NN
24	,	,	,
25	and	and	CC
26	linguistics	linguistics	NNS
27	concerned	concern	VBN
28	with	with	IN
29	the	the	DT
30	interactions	interaction	NNS
31	between	between	IN
```