正規表現vs類語辞書

5月 25th, 2017

相変わらず正規表現周辺をうろうろ中。

私のチャットボットは、目下、類語辞書を使うことで正規表現なしでキーワード対応をしている。単に正規表現を食わず嫌いしていただけなのだが。

で、ふと思った。どっちが早いんだろう、と。

ついでに、timeで時間を計測することを覚えた(今頃かいっ)ので、今回は、datetimeではなく、timeで計測してみた。下記のpatlistの1~3がキーワードファイル。ここにあるキーワードが、それぞれstの文字列内にあるかどうかを評価させてスピードを見る。patlist1が少し特殊で、頭に「<」がついている場合のみ正規表現とみなして照合している。

----------------
import re
import time

patlist1=['<(私|僕|彼|それ)は','君は','あれは']
patlist2=['私は','僕は','君は','あれは','彼は','それは']
patlist3=['(私|僕|彼|それ)は','君は','あれは']
st='私は、みかんが好きです'

t1=time.time()
#一部正規表現を使ってチェックする場合
for i in range(0,10000):
    for pat in patlist1:
        if pat[0]==’<':
            pat=pat.lstrip('<')
            p=re.search(pat,st)
            if p:
                pass
        else:
            if pat in st:
                pass
t2=time.time()
#全く正規表現を使わない場合
for i in range(0,10000):
    for pat in patlist2:
        if pat in st:
            #print ('be')

t3=time.time()
#全て正規表現の場合
for i in range(0,10000):
    for pat in patlist3:
        p=re.search(pat,st)
        if p:
            pass
t4=time.time()
print (t2-t1)
print (t3-t2)
print (t4-t3)

ちょっと並び順が分かりにくくて申し訳ない。とりあえず結果は…

正規表現との混合:0.047
正規表現なしの時:0.015
正規表現のみの時:0.063

正規表現を扱わない方が、どうしても早い。まあ、当たり前といえば当たり前かもしれない。こういう使い方の場合、予め正規表現のパターンをコンパイルしておくことができない。

良く使うものについては、始めにコンパイルしておき、それを使えば早くなるだろうが、出現の確率が低そうな場合は、かえって手間の方が増えそうな気がする。

正規表現が使える方が便利は便利なのだが・・・たとえば、文末の「そうだ」系に反応させたい時、「そうだね」「そうだな」等々一つ一つ類語辞書を作ってもいいが、これだと「そうだの」とか「そうだぬ」とか、ちょっと変わった表現を使う人相手だと反応しなくなってしまう。ここを正規表現で「そうだ.?$」にすれば、その辺りはクリアできる。

うううん・・・後、そもそも「まとめてコンパイルしておく」方法ってどうやるんだろうというのが…リスト化とかできるのかな??

関連記事

  1. 正規表現vs類語辞書 補足
  2. Cortanaは能天気?
  3. チャットにタイマーを実装するには

Comments are closed.