GiNZAを使って分かち書きをしてみた話

# 3行でわかるまとめ
GiNZAというNLPライブラリを使ってみた！  
GiNZAでは、spaCy（NLPフレームワーク）とSudachipy（形態素解析器SudachのPythonクローン）が使われている！  
インストールはpip一発で簡単！いい感じで分かち書きもできるし使ってみたらハッピー！

# はじめに
## 読むと良さそうな人
janome,MeCabを使って形態素解析したことがあるよって人

## 環境
MacbookAir 
python3.7.4(pyenv)

## きっかけ
NLP界隈の強い人達がGiNZAを使っていると聞き、自分も試してみようと思いました。

# GiNZAについて

## GiNZAとは
リクルートのAI研究機関と国立国語研究所が共同で開発した，日本語の自然言語処理ライブラリ。

> **「GiNZA」の概要**  
>  
>「GiNZA」は、ワンステップでの導入、高速・高精度な解析処理、単語依存構造解析レベルの国際化対応などの特長を備えた日本語自然言語処理オープンソースライブラリです。「GiNZA」は、最先端の機械学習技術を取り入れた自然言語処理ライブラリ「spaCy」（※5）をフレームワークとして利用しており、また、オープンソース形態素解析器「SudachiPy」（※6）を内部に組み込み、トークン化処理に利用しています。「GiNZA日本語UDモデル」にはMegagon Labsと国立国語研究所の共同研究成果が組み込まれています。

> **「GiNZA」の主な特長**
>1. 高度な自然言語処理をワンステップで導入完了
>2. 高速・高精度な解析処理と依存構造解析レベルの国際化に対応
>3. 国立国語研究所との共同研究成果の学習モデルを提供  

https://www.recruit.co.jp/newsroom/2019/0402_18331.html より


## GiNZAのインストール
インストールはpip一発です。  
`$ pip install "https://github.com/megagonlabs/ginza/releases/download/latest/ginza-latest.tar.gz"`  
ただし、実行環境について[公式](https://megagonlabs.github.io/ginza/)に下記のように記載がある通り、Python3.6以上が想定されているので要注意です。  
（私はPython3.5以下での検証はしていません。）

> **実行環境**  
>このプロジェクトは Python 3.6以上（および対応するpip）で動作検証を行っています。 Anaconda環境ではpipによるインストールが正常に行えない場合があります。 (Anaconda環境は将来のバージョンでサポートする予定です)

https://megagonlabs.github.io/ginza/ より

## GiNZAのqiita記事
[【Python】日本語NLPライブラリ”GiNZA”で言語処理100本ノック（第4章）やってみた](https://qiita.com/derodero24/items/b49dd92e14c7e7655ccc)  
[@derodero24](https://qiita.com/derodero24)

# GiNZAを活用したtwitter文章の分かち書き
今回は自分のツイートを取得したcsvをインプットに、分かち書きしてみようと思います。

### 1. ライブラリのインポート
```python
import spacy
import pandas as pd
```
### 2. インプットデータ(取得済みのtweetdata)読み込み
```python
df = pd.read_csv('pchanGGO.csv')
df.head(5)
```

読み込んだ結果はこんな感じです（textしか使いませんが…）

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>id</th>
      <th>created_at</th>
      <th>text</th>
      <th>fav</th>
      <th>RT</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>1206053627317518337</td>
      <td>2019-12-15 03:29:26</td>
      <td>RT @mikanmarusan: Hackday 2019 もうすぐハッカソンプレゼンステ...</td>
      <td>0</td>
      <td>3</td>
    </tr>
    <tr>
      <td>1</td>
      <td>1206035284120334336</td>
      <td>2019-12-15 02:16:33</td>
      <td>今日はこれからhackdayいくぞ！ #hackday2019</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>2</td>
      <td>1205076105075363840</td>
      <td>2019-12-12 10:45:07</td>
      <td>長期的なチームでなく、フリーランスのように短期間で入れ替わるチームだからこそ、コミュニケーシ...</td>
      <td>4</td>
      <td>0</td>
    </tr>
    <tr>
      <td>3</td>
      <td>1205068742041825282</td>
      <td>2019-12-12 10:15:51</td>
      <td>エムスリーさんでは、AIチームでは全員が全員のコードをレビューしている！ #mlpp</td>
      <td>1</td>
      <td>0</td>
    </tr>
    <tr>
      <td>4</td>
      <td>1205068442270724097</td>
      <td>2019-12-12 10:14:40</td>
      <td>命名の由来がマリオカートなの好き #mlpp</td>
      <td>1</td>
      <td>0</td>
    </tr>
  </tbody>
</table>
</div>

### 3. GiNZAのインプット用にlist形式にします。

```python
tweets = df['text'].tolist()
```

### 4. GiNZAのpipeメソッドを用いた処理

```python
%%time
docs = list(nlp.pipe(tweets))
```

    CPU times: user 2.33 s, sys: 87.4 ms, total: 2.42 s
    Wall time: 2.47 s

### 5. 分かち書き結果取り出し・格納

```python
tweets_wakati =[]
for doc in docs:
    tweet_wakati = []
    for word in doc:
        tweet_wakati.append(word)
    tweets_wakati.append(tweet_wakati)
```

### 6. 整えて表示

```python
print(*tweets_wakati[0:5], sep='\n')
```

    [RT, @, mikanmarusan, :, Hackday, 2019, もう, すぐ, ハッカソンプレゼンステージ, 始まり, ます, 。, #, hackdayjp, #, つくる, って, たのしい, ね, https, :, /, /, t, ., co, /, 1, sRv, 6, XrCOz]
    [今日, は, これ, から, hackday, いく, ぞ, ！, #, hackday, 2019]
    [長期的, な, チーム, で, なく, 、, フリーランス, の, よう, に, 短期間, で, 入れ替わる, チーム, だ, から, こそ, 、, コミュニケーション, を, 減らす, って, いう, 観点, な, の, よ, ね, #, mlpp]
    [エムスリー, さん, で, は, 、, AI, チーム, で, は, 全員, が, 全員, の, コード, を, レビュー, し, て, いる, ！, #, mlpp]
    [命名, の, 由来, が, マリオ, カート, な, の, 好き, #, mlpp]

いい感じに分かち書きができました！  

特に、「ハッカソンプレゼンステージ」,「フリーランス」といった単語が1単語として取り出せているのがいいですね。  

今度はこの分かち書きを使った文章ベクトルの生成,GiNZAのその他機能についてやってみた記事を書きたいです。



# 参考・おすすめリンク
[GiNZA](https://megagonlabs.github.io/ginza/)

[はじめての自然言語処理 spaCy/GiNZA を用いた自然言語処理 | オブジェクトの広場](https://www.ogis-ri.co.jp/otc/hiroba/technical/similar-document-search/part4.html)