Help us understand the problem. What is going on with this article?

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

昨夜のアプリにバグがあったので、追記するか新たに書くか迷うところだが、新たに書くこととする。

やったこと

・比較に正規表現を使う
・バグフィックス

・比較に正規表現を使う

【参考】
pythonで、とっても便利な正規表現を!
正規表現の基本として、参考のとおり、以下のようなパターンと説明の表ができる。

パターン 説明
[ぁ-ん] 任意のひらがな
[ァ-ン] 任意のカタカナ
[一-龥] 任意の漢字
[ぁ-んァ-ン] 任意のひらがなとカタカナ
[一-龥ぁ-んァ-ン] 任意の漢字とひらがなとカタカナ
[^ぁ-ん] ひらがな以外の任意の文字
[^ァ-ン] カタカナ以外の任意の文字
[^一-龥] 漢字以外の任意の文字
[^ぁ-んァ-ン] ひらがなとカタカナ以外の任意の文字
[^一-龥ぁ-んァ-ン] 漢字とひらがなとカタカナ以外の任意の文字

・バグフィックス

今回は、以下の比較部分にバグがあった。
つまり、本来会話履歴は二度と出現しないように、排除しているつもりであったが、どうも、以下の過去3回の比較のみが効いている状況で抜けてもbreakしてしまって、その後のコードが使われていないことがわかった。

    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

ということで、この不要な過去三回の比較は削除することとした。
さらに、以下の比較しているそれぞれの文章をよく見るとこれも少しおかしい挙動になっていた。

                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]は""で括られてしまっていて、比較しても異なる文字列ということになってしまっていた。
ということで、上記の正規表現を利用して以下のようなコードを使って、裸にして比較することとした。

line_ = re.sub(r"[^一-龥ぁ-んァ-ン]", "", line)
conv_new_ = re.sub(r"[^一-龥ぁ-んァ-ン]", "", conv_new[j])

こうして、「漢字とひらがなとカタカナ以外の任意の文字」として比較することにより、先ほどの""が消えて比較できるようになった。
コード全体は以下のとおりになった。

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

まとめ

・正規表現の基本をおさらいした
・正規表現を使って「漢字とひらがなとカタカナ以外の任意の文字」で文字列比較を行った
・バグフィックスを行った

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away