PolyglotをRaspberry Piで動かして英文の形態素解析を行う

Advent calendarのネタづくりを行うときに英文の形態素解析を行う必要が生まれたのですが少し引っかかったので残しておきます。

# Polygotとは何か
日本語の領域だと[MeCab](https://taku910.github.io/mecab/)が形態素解析ツールとしてよく取り上げられていますが、英文の形態素解析となるとそんなに事例が多くありません。
そんな英文の形態素解析を始めとして言語特定、言語検出などの自然言語解析の機能を多く持ったライブラリが、Polygotです。

## 言語サポート範囲
[公式ドキュメント](https://polyglot.readthedocs.io/en/latest/index.html)に記載されてる通りになりますが機能ごとによって対応言語に差があります。

|機能名|対応言語数|説明|
|---|---|---|
|トークン化|165言語|文字列を自然言語処理を行う際に扱う文章の最小単位に分割します|
|言語検出|196言語|解析対象の文字列の言語を特定します|
|固有表現抽出|40言語|解析対象の文字列から固有表現を抽出します Polygotでは、**場所**、**組織**、**人**の3つのタイプを抽出することができます|
|品詞タグづけ|16言語|解析対象の文字列の各トークンに対して、品詞タグを付与します|
|感情分析|136言語|**ネガティブ**、**ニュートラル**、**ポジティブ**の3つの種別を取得できる|
|分散表現|137言語|単語をd次元のベクトル空間にマッピングします|
|形態素解析|135言語|解析対象の文字列から意味を持つ最小単位に分割します|
|翻字|69言語|入力された文字列を指定した言語の文字列に変換する|

上記表から見てもわかるように多くの言語をサポートしています。

# Install
実際にPolygotを動くようにセットアップしていきましょう。

## Polygotをインストールする
```sh
$ sudo pip3 install -U polyglot
```
polyglot自体は、上記コマンドを実行するだけでインストールすることができます。
しかし、実際にpolyglotで言語解析を行うには解析対象の言語の辞書を取得する必要があります。
辞書取得時にICUがインストール済みでないとエラーを吐きます。なので、ダウンロード前に下記コマンドを実行して必要なライブラリを取得します。

```sh
$ sudo apt-get -y install libicu-dev
$ sudo pip3 install -U pyicu
$ sudo pip3 install -U morfessor
```
その他に**pycld2**がモデルのダウンロードに必要となります。
通常のLinux環境であれば``$ sudo pip install pycld2``を叩くだけでインストールすることが可能です。ですが、Raspberry Pi上で上記コマンドを実行すると下記のようなエラーが表示されていまいます。

```sh
arm-linux-gnueabihf-gcc: error: unrecognized command line option ‘-m64’
  error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
  ----------------------------------------
  ERROR: Failed building wheel for pycld2
```
上記エラーはARMアーキテクチャ向けのコンパイラーに-m64オプションが用意されていないことでコンパイルに失敗しているため発生しています。
このままでは、pycld2をインストールすることができないため、Raspberry Pi上でPolyglotを動かすことが出来ません。さぁ困った....

## pycld2をRaspberry Piにインストールする
そのままでは、インストールできないためpycld2の``setup.py``に指定されている-m64コンパイルオプションを取り除いた上でsetup.pyを実行する必要があります。
下記のリポジトリから``git clone``した上で、``setup.py``を弄ります。
[aboSamoor/pycld2 - Github](https://github.com/aboSamoor/pycld2)

```sh
$ git clone https://github.com/aboSamoor/pycld2.git
$ cd pycld2/
```

git cloneしたpycld2のディレクトリに移動し、直下に配置されているsetup.pyのLine 78に記述されているコンパイルオプションの配列から**-m64**を削除してから保存します。

```python:変更前
    language="c++",
    # TODO: -m64 may break 32 bit builds
    extra_compile_args=["-w", "-O2", "-m64", "-fPIC"],
```
```python:変更後
    language="c++",
    # TODO: -m64 may break 32 bit builds
    extra_compile_args=["-w", "-O2", "-fPIC"],
```

変更後、下記コマンドを実行します。

```sh
$ sudo pip3 install hogehoge/pycld2/
```

```sh
Successfully built pycld2
Installing collected packages: pycld2
Successfully installed pycld2-0.42
```
実行後、Successfullyが表示されればインストール成功です。

## モデルのダウンロードを行う
下記コマンドを実行するモデルのダウンロードができます。
今回は英文の形態素解析を行うので、英語のモデルをダウンロードします。

```sh
$ polyglot download morph2.en
[polyglot_data] Downloading package morph2.en to
[polyglot_data]     /home/pi/polyglot_data...
```

# 実際に形態素解析を行う
あとは下記のようなサンプルコードを実行するだけです。

```python:morph.py
from polyglot.text import Text

sample_text = "One Hamburger and a Medium Coffee please."
tokens = Text(sample_text)
print(tokens.morphemes)
```

実際に上記スクリプトを実行すると下記のような形で結果を取得することが可能です。

```sh
$ python3 morph.py 
['One', ' ', 'Ham', 'burg', 'er and a Medium Coffee p', 'lease', '.']
```

# おわりに
今回はとあるプログラムを作るためにPolyglotを初めて活用しました。言語判定などできるので、TwitterAPIと絡めて日本語であればMeCab側で処理して、それ以外をPolyglotに任せるなども出来るかと思います。中々、英文の自然言語処理を業務で使うことは無いと思いますが1つの引き出しとして備忘録的に残しておきます。