LoginSignup
3
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-08-13

はじめに

今回よりPythonでしりとりAPIを作っていきます。

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

第2回は【Python+Flask】しりとりAPIを作ろう #2 ~しりとりプログラム作成です

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

環境

今回はデータ収集(ほぼテキストマイニング)を行うので google colab を用います。
こちらからGoogle colabを開いてください

テキストコーパス

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

実際にやってみよう

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

手順1 git clone する

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

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

手順2 ファイルのパスを取得する

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

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

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

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

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

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 - 初期化+正規表現の設定

import re

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

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

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

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

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コマンドで見てみます。

!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
...省略

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

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

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

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

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

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

# 重複文字を取り除く (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回目

3回目

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1