「この単語、もっと出てたはずなんだけど」を機械で探すツールを書いた
少なく見える語は、たいてい別の字で起こされている。読み・惜しい綴り・語尾・出ないはずがない回、の4通りで洗う。
作った動機
聴いていると「この言葉、もっと出てたはずなんだけど」と引っかかることがあります。
最初は数え直して「348回あるから合っているな」で済ませていました。ところが毎回、 そのあとで別の書かれ方が見つかります。少なく見えるのは数え方の問題ではなく、 その語が別の字で起こされているからでした。
そのたびに LIKE をアドホックに叩いていたのですが、
毎回同じことをしているのでツールにしました。
$ python3 scripts/find_missing_word.py ソシュール
$ python3 scripts/find_missing_word.py うんちく
1通りで探すと必ず取りこぼす
最初は「読みが同じもの」だけを探していました。それだと当たらない壊れ方があります。 いまは4通り並べています。
| 探し方 | 当たる例 |
|---|---|
| ① 読みで引く | 祖収る → そしゅうる |
| ② 惜しい綴り(1〜2文字違い) | ネガティブプライトネス |
| ③ 正しい出現の直後2文字の分布 | デカルトみ → デカルトを |
| ④ タイトル・概要欄にあるのに本文に出ない回 | 本文0回=名前ごと壊れている |
def by_yomi(rows, word):
keys = yomi_keys(word) # 長音を落とした形と、母音に開いた形の両方
return [r for r in rows
if any(k in normalize_for_search(r.text_yomi) for k in keys)
and word not in r.text]
②は全1.3M行に総当たりすると重いので、文字の重なりで粗く絞ってから類似度を見ます。
chars, need = set(w), max(2, len(set(w)) - 1)
for row in rows:
body = normalize_for_search(row.text_search)
if len(chars & set(body)) < need:
continue
# 1 segment につき、いちばん似ている窓だけを採る
best = max((difflib.SequenceMatcher(None, w, body[k:k+span]).ratio(), body[k:k+span])
for span in (n-1, n, n+1) for k in range(len(body)-span+1))
if best[0] >= thr:
found[best[1]] += 1
最初は窓を全部拾っていて、同じ箇所が何行にも化けて出ました。1セグメント1候補に絞ると読めます。
回してみた結果
$ python3 scripts/find_missing_word.py ソシュール
■ 「ソシュール」の現状: 348回 / 65本
① 読みが同じで表記が違うもの (読み「そしゅうる / そしゅる」で照合) 6件
https://youtu.be/Xlvp9rfJ9co?t=1460 ただそしゅるが言いたかったのは
https://youtu.be/gxwy4c_Rgig?t=2103 そしゅるが否定したと言われる
② 惜しい綴り (類似度 0.62 以上)
30回 「ソシャル」 ← ソーシャルグッド(無関係。目で捨てる)
28回 「シュル」 ← 無関係
①はほぼ本物、②はノイズが多い、という性質があります。②は目で捨てる前提の道具です。
| 語 | 前 | 後 | 見つかった誤表記 |
|---|---|---|---|
| ソシュール | 348回 | 354回 | そしゅる(ひらがな) |
| うんちく | 995回 | 1,036回 | 運築36件・運知5件 |
| タメ語 | 11回 | 32回 | ためご21件 |
「いい運築で」「面白い運築だよね」「運築おじさん」。 読めば一目で分かるのに、5年ぶんずっと集計から漏れていました。
同じ失敗をもう一度した
この道具の親戚で、「番組が過去回に言及した箇所」を探すものも作りました。 最初は言い方だけを手がかりにしていました。
REF = re.compile(r"前回|前に|以前|昔|過去|の回で|シリーズ|覚えてます")
ところが番組の造語は、前置きなしにそのまま出てきます。
取らないで俺のデカルトみ
デカルトみ感じますね
つまりデカルトみってことですよね
この形が正規表現に一度もかからず、実際は9本あった参照を1本しか見つけられませんでした。 「正しく起こされている」を前提に探したときと、まったく同じ失敗です。
いまは「その語が主題ではない回の発言を全部出す」経路を足しています。 機械に確定させるのではなく、人が判断する材料を漏らさず出す方向に倒しました。
結局のところ
- 「少ないはず」の直感は当たる。数え方ではなく表記を疑う
- ツールに前提を置くと、前提の外は永遠に見つからない
- 気づく入口は毎回「少なくない?」という引っかかり。 網は広く張って、最後は自分の目で判断するのがよさそうです
← 日本語の全文検索を「表記が違っても引ける」ようにする… 語ごとの「いつ・どの回で語られたか」を1枚に置く。時… → 目次へ