【会話入門】会話しつつ学習するアプリが進化した♪II正規表現の使い方（バグフィックス版）

[昨夜のアプリにバグがあった](https://qiita.com/MuAuan/items/6119f5419dcbb4603f06)ので、追記するか新たに書くか迷うところだが、新たに書くこととする。
###やったこと
・比較に正規表現を使う
・バグフィックス
###・比較に正規表現を使う
【参考】
・[pythonで、とっても便利な正規表現を！](https://qiita.com/hiroyuki_mrp/items/29e87bf5fe46de62983c)
正規表現の基本として、参考のとおり、以下のようなパターンと説明の表ができる。

|パターン |説明| 
|:-:|:-:|
| [ぁ-ん]  | 任意のひらがな  |
|[ァ-ン]   | 任意のカタカナ  |
|[一-龥]   | 任意の漢字  |
|[ぁ-んァ-ン]   | 任意のひらがなとカタカナ  |
|[一-龥ぁ-んァ-ン]   | 任意の漢字とひらがなとカタカナ  |
| [^ぁ-ん]  | ひらがな以外の任意の文字  |
|[^ァ-ン]   | カタカナ以外の任意の文字  |
|[^一-龥]   | 漢字以外の任意の文字  |
|[^ぁ-んァ-ン]   | ひらがなとカタカナ以外の任意の文字  |
|[^一-龥ぁ-んァ-ン]   |漢字とひらがなとカタカナ以外の任意の文字  |
###・バグフィックス
今回は、以下の比較部分にバグがあった。
つまり、本来会話履歴は二度と出現しないように、排除しているつもりであったが、どうも、以下の過去３回の比較のみが効いている状況で抜けてもbreakしてしまって、その後のコードが使われていないことがわかった。

```py
    line1=line
    line2=line
    line3=line
    with open('conversation_.csv', 'a', newline='') as f: #a+ #w
        writer = csv.writer(f)
        while True:
            writer.writerow({line}) #会話相手の会話のみ保存
            sims = cosine_similarity(vectorizer.transform([mecab.parse(line)]), vecs)
            index = np.argsort(sims[0])
            line3=line2
            line2=line1
            line1=line
            while True:
                index_= index[-np.random.randint(1,10)] #ランキング1-10までを乱数で選択
                line = questions[index_]
                if line1==line or line2==line or line3==line:
                    continue
                else:
                    break
```
ということで、この不要な過去三回の比較は削除することとした。
さらに、以下の比較しているそれぞれの文章をよく見るとこれも少しおかしい挙動になっていた。

```py
                conv_new=read_conv(mecab)
                s=1
                ss=1
                for j in range(0,len(conv_new),1):
                    if line==conv_new[j]: 
                        s=0
                    else:
                        s=1
                    ss *= s
                    #print(ss,s)
                if ss == 0:
                    continue
                else:
                    break
```
すなわち、if line==conv_new[j]: の左辺と右辺は、以下のようになっていた。

```
そう だ ね ,
"そう だ ね ,"
```
すなわち、conv_new[j]は""で括られてしまっていて、比較しても異なる文字列ということになってしまっていた。
ということで、上記の正規表現を利用して以下のようなコードを使って、裸にして比較することとした。

```py
line_ = re.sub(r"[^一-龥ぁ-んァ-ン]", "", line)
conv_new_ = re.sub(r"[^一-龥ぁ-んァ-ン]", "", conv_new[j])
```
こうして、「漢字とひらがなとカタカナ以外の任意の文字」として比較することにより、先ほどの""が消えて比較できるようになった。
コード全体は以下のとおりになった。

```py
def conversation(questions,vecs,mecab):
    line = input("> ")
    with open('conversation_.csv', 'a', newline='') as f: #a+ #w
        writer = csv.writer(f)
        while True:
            writer.writerow({line})
            sims = cosine_similarity(vectorizer.transform([mecab.parse(line)]), vecs)
            index = np.argsort(sims[0])
            while True:
                index_= index[-np.random.randint(1,10)]
                line = questions[index_]
                conv_new=read_conv(mecab)
                s=1
                ss=1
                for j in range(0,len(conv_new),1):
                    line_ = re.sub(r"[^一-龥ぁ-んァ-ン]", "", line)
                    conv_new_ = re.sub(r"[^一-龥ぁ-んァ-ン]", "", conv_new[j])
                    if line_==conv_new_:
                        s=0
                    else:
                        s=1
                    ss *= s
                    #rint(j,ss)
                if ss == 0:
                    continue
                else:
                    break
            save_questions(line)
            print("({:.2f}): {}".format(sims[0][index_],questions[index_]))
            text2speak(questions[index_])
            time.sleep(2)
            line = input("> ")
            save_questions(line)
            if not line:
                break
```
###コード全体は以下に置きました
・[something2speak/auto_conversation_.py](https://github.com/MuAuan/something2speak/blob/master/auto_conversation_.py)
###まとめ
・正規表現の基本をおさらいした
・正規表現を使って「漢字とひらがなとカタカナ以外の任意の文字」で文字列比較を行った
・バグフィックスを行った