【Python+Flask】しりとりAPIを作ろう #1 ~データ作成編

# はじめに
今回よりPythonでしりとりAPIを作っていきます。

この記事は第1回目です。

第2回は[【Python+Flask】しりとりAPIを作ろう #2 ~しりとりプログラム作成](https://qiita.com/Bana7/items/192d8eee7a73938d477b)です


今回はしりとりのデータを作成していきます。

# 環境
今回はデータ収集(ほぼテキストマイニング)を行うので google colab を用います。
[こちら](https://colab.research.google.com/?hl=ja)からGoogle colabを開いてください

# テキストコーパス

京都大学のテキストコーパスを使います。
ここに保存されているテキスト達をPythonで読み込んで前処理していきます。

https://github.com/ku-nlp/KyotoCorpus

# 実際にやってみよう

手順1つ1つでgoogle colabのセル1つです。

## 手順1 git clone する

google colabなので先頭に!をつけることを忘れずに！

```shell
# git cloneする
!git clone https://github.com/ku-nlp/KyotoCorpus
```

## 手順2 ファイルのパスを取得する
KyotoCorpus/dat/num/　に保存されている numファイルのパスを取得します。

```python
# 先のKyotoCorpusにある　numファイルを取得する
import os
import glob

files = glob.glob("KyotoCorpus/dat/num/*")
print(files)
```

## 手順3 テキストマイニングする

全体として以下のコードになっており実行することで`output.txt`が出力されています

```python
import re

# 念のために初期化 
rep = ""
rep_list = []

# ひらがなを抽出する設定。このとき ["はな", "ああ"] みたいなリスト形式になる時がある. 大体は["はな"]の様になる
noun_regrex = re.compile(r'''(
    [\u3040-\u309F]+
)''', re.VERBOSE)

for filename in files:
    with open(filename, "r") as f:
        for line in f:
            if "名詞" and "普通名詞" in line:
                # 実際にひらがなを抽出する
                rep = noun_regrex.findall(line)
                # リストがから [] でない時にrep_listに要素を追加する
                if rep:
                    rep_list.append(rep[0])
# 重複文字を取り除く (list型 -> set型 -> list型)
rep_list = list(set(rep_list))
# あいうえお順にソートする
rep_list.sort()
# output.txtに書き込む withを使うと暗黙的にcloseしてくれる
with open("output.txt", "w", encoding='UTF-8') as output:
    for rep in rep_list:
        output.write(rep+"\n")
```

## テキストマイニングについて深掘りしていきます

### 深掘り1 - 初期化+正規表現の設定

```python
import re

# 念のために初期化 
rep = ""
rep_list = []

# ひらがなを抽出する設定。このとき ["はな", "ああ"] みたいなリスト形式になる時がある. 大体は["はな"]の様になる
noun_regrex = re.compile(r'''(
    [\u3040-\u309F]+
)''', re.VERBOSE)

```

[\u3040-\u309F]+ で１文字以上のひらがなを表現しています。
re.VERBOSE を入れることによって空白やコメントを正規表現パターンから除外しています。

### 深掘り2 - 正規表現されたひらがなをリストに追加する

```python
for filename in files:
    with open(filename, "r") as f:
        for line in f:
            if "名詞" and "普通名詞" in line:
                # 実際にひらがなを抽出する
                rep = noun_regrex.findall(line)
                # リストがから [] でない時にrep_listに要素を追加する
                if rep:
                    rep_list.append(rep[0])
```

各numファイルを開いて1行1行読み込み、正規表現を行なった、ひらがなをリストに追加します。

ここでnumファイルを見てみましょう。
※google colab上で catコマンドで見てみます。

```shell
!cat /content/KyotoCorpus/dat/num/950101.num
```

```/content/KyotoCorpus/dat/num/950101.num
...省略
50-5 いきごんで 意気込む 動詞 2 * 0 子音動詞マ行 9 タ系連用テ形 14
55-2 いる いる 接尾辞 14 動詞性接尾辞 7 母音動詞 1 基本形 2
...省略

```

幸いなことに形態素解析されています。そのため、

```python
if "名詞" and "普通名詞" in line:
```

とすることで、名詞かつ普通名詞
要するに、人名や助詞などのしりとりに向かない語句を選別しています。

```python
if rep:
    rep_list.append(rep[0])
```

rep には正規表現されたテキストが入りますが、repに代入されるのはリスト型です。
rep[0]とすることで目的の名詞をリストに追加しています。
if リスト型の変数: として、リストが空かどうかを確認しています。

### 深掘り3 - 並び替えとファイルに出力

```python
# 重複文字を取り除く (list型 -> set型 -> list型)
rep_list = list(set(rep_list))
# あいうえお順にソートする
rep_list.sort()
# output.txtに書き込む withを使うと暗黙的にcloseしてくれる
with open("output.txt", "w", encoding='UTF-8') as output:
    for rep in rep_list:
        output.write(rep+"\n")
```

rep+"\n"の様にしないと、改行されないので気をつけましょう。

## データ完成

無事にしりとりさせるために必要なデータを得ることができました。

```output.txt
ぁんて
あ
あい
あいえいち
あいかぎ
あいかん
あいがかり
あいきょう
あいくち
あいけん
あいこく
あいことば
あいしゃ
...省略
```

これまでのコードを実行してみると、google colab上にoutput.txtが生成されているので、ダウンロードしておきましょう。

# 最後に

今回はしりとりさせるために必要なテキストデータを収集しました。
次回ではこのテキストデータを用いてしりとりをさせていきます。

## 2回目
https://qiita.com/Bana7/items/192d8eee7a73938d477b

## 3回目
https://qiita.com/Bana7/items/10c0159637babcf9e11f