0. おことわり
- エックス(X)に慣れていないので、以下の文章ではツイートと一貫して表記します
- 下品な内容を含みます
1. これは何
- ツイートに誤字を混入させて、より面白いツイートにします
- ソースコードはこちら
2. 誤字ツイートについて
ツイートに思いがけない誤字が混入し、面白いツイートになることがあります。
一番最初に誤字でバズったとされるツイートがこちらです。見かけたことがある方も多いかと思います。
久しぶりにマフィア焼いてます✨
焼き上がりが待ち遠しい~❤️
大変面白いですね!!!
3. 誤字ツイートのパターン
大きく分けて以下の3つのパターンがあると思います。
- パターンA:元と読みは同じで漢字だけ違う単語(同音異義語)に置き換わる
- パターンB:一文字違いの単語に置き換わる
- パターンC:予測変換によって、最初の数文字だけ同じ全く別の単語に置き換わる
それぞれの具体例は以下のような感じです。
パターンA:元と読みは同じで漢字だけ違う単語(同音異義語)に置き換わる
- 「散乱(さんらん)」を「産卵(さんらん)」と打ち間違える
- 「ハム買ってきて」を「歯向かってきて」と打ち間違える
- 「紫外線」を「市街戦」と打ち間違える
パターンB:一文字違いの単語に置き換わる
- 「マフィン」を「マフィア」と打ち間違える
- 「陰性(いんせい)」を「陰茎(いんけい)」と打ち間違える
- 「成績証明書(せいせきしょうめいしょ)」を「性癖証明書(せいへきしょうめいしょ)」と打ち間違える
- 「卵(たまご)」を「多摩区(たまく)」と打ち間違える
- 「からし」を「彼氏(かれし)」と打ち間違える
- 「蜘蛛(くも)」を「熊(くま)」と打ち間違える
- 「セミ」を「攻め(せめ)」と打ち間違える
- 「勢力(せいりょく)」を「性欲(せいよく)」と打ち間違える
- 「震度(しんど)」を「インド」と打ち間違える
- 「蕎麦(そば)」を「祖母(そぼ)」と打ち間違える
- 「お豆腐(おとうふ)」を「弟(おとうと)」と打ち間違える
- 「カメムシ」を「亀梨(かめなし)」と打ち間違える
- 「ちくわ」を「乳首(ちくび)」と打ち間違える
- 「花粉(かふん)」を「古墳(こふん)」と打ち間違える
- 「人参(にんじん)」を「人間(にんげん)」と打ち間違える
- 「一抹の(いちまつの)」を「イチモツの」と打ち間違える
パターンC:予測変換によって、最初の数文字だけ同じ全く別の単語に置き換わる
- 「結膜炎(けつまくえん)」を「ケツマンコ」と打ち間違える
- 「水分(すいぶん)」を「炊飯器(すいはんき)」と打ち間違える
- 「ナス」を「ナチス」と打ち間違える
- 「石(いし)」を「石田純一(いしだじゅんいち)」と打ち間違える
- 「フレンチトースト」を「フルチントースト」と打ち間違える
- 「チーズ」を「チワワ」と打ち間違える
- 「ゴキブリ」を「郷ひろみ(ごうひろみ)」と打ち間違える
- 「ゴキブリ」を「後醍醐天皇(ごだいごてんのう)」と打ち間違える
- 「生クリーム(なまくりーむ)」を「生首(なまくび)」と打ち間違える
- 「チェーンロック」を「チェーンソー」と打ち間違える
- 「食パン(しょくぱん)」を「職場(しょくば)」と打ち間違える
- 「雪(ゆき)」を「諭吉(ゆきち)」と打ち間違える
- 「ピーマン」を「ヒューマン」と打ち間違える
- 「スタッフ」を「スタローン」と打ち間違える
- 「スタンガン」を「ショットガン」と打ち間違える
- 「確認します(かくにんします)」を「角煮します(かくにします)」と打ち間違える
他の傾向
- だいたい、一個のツイートの中で一単語に打ち間違いが存在している
- 食べ物や虫関連が多い
- 面白さが生まれるのは意外性(人間を食べることはないとか)にあると思うので、それは食べないだろ!みたいなそういうギャップがあるから
- 打ち間違えた先のワードが下品であるものが多い気がする
思いもよらない打ち間違いばかりで、クスっと笑えるものばかりですね!!!!!
4. 機械的に誤字ツイートを作るには
達成すべきこと
今回のタスクは、入力として適当なツイートが与えられた時に、その中の適当な単語に誤字を混入させることです。
つまり、「久しぶりにマフィン焼いてます✨」を、「久しぶりにマフィア焼いてます✨」に置き換えるようなことができればよいです。
今回は簡単のために、漢字のみで書かれた名詞に限って誤字を混入させることにします。また、予測変換のミス(上記のパターンC)も考えず、パターンAとBの2種類の誤りを混入させることにします。
- パターンAは、読みが同じで漢字が異なる単語に書き換えるだけなので簡単。
- パターンBは、「花粉(かふん)」を「古墳(こふん)」と間違えるように、読みのひらがなのうち1文字だけ間違えることにします。ひらがなをどう間違えるかが問題になりますが、スマホのフリック入力を想定して、以下の2つのルールのいずれかを適用することにします。
- 同じ行の別の文字に置き換ます。例えば「かふん」の「か」を間違えるのであれば、「きふん」「くふん」「けふん」「こふん」のいずれかが誤字の候補になります。
- スマホのフリック入力のように同じ指の動きをすることを意識して置き換えます。例えば「か」を打ち間違える時は、スマホで表示されている隣り合う行(あ行・さ行・な行)に対し、同じ指の動きをする文字(あ・さ・な のいずれか)に置き換えます。つまり「かふん」であれば、「あふん」「さふん」「なふん」のいずれかが誤字の候補となります。
※今回は、パターンBで置き換えるのは清音のみとします。(つまり「ぱ」や「ば」や「っ」のようなものは置き換わりません)
ひらがなを漢字に変換する
パターンAとBは、置き換える先の「読み」だけはすでにわかっている状態です。つまり、例えば元のツイートにおいて、「かふん」から「こふん」にすれば良いということがわかっています。そのため、ひらがなから漢字に直す操作ができればよいことになります。
ここでは、Google CGI API for Japanese Inputを利用することとします。
5. 実装
- ソースコードはこちら
- Janomeでツイート本文を形態素解析し、名詞を抜き出します。
- パターンAとパターンBのどちらに従って誤りを挿入するかをランダムに選びます。
- ステップ1で選んだ名詞をランダムに一つ選び、パターンAもしくはBに従ってひらがなから漢字に直します。パターンBを選んだ時、あまりにも無理な読み仮名から漢字を作ろうとすることがあります(例:「かふん」を「けふん」に置き換えようとしても、そんな単語は存在しない)。その場合は諦めて、他の読み仮名で漢字を作ります。
- 誤字を混入させたツイートを出力します。
6. 結果
「どの名詞に誤りが挿入されるか」「どのように誤字るか」の2種類にランダム要素があるので、試行の度に結果が変わります。バズったツイートと同じ誤字が得られるまで何回の試行が必要かを調べます。
本ライブラリはpipでinstallでき、以下のようにimportすることで使えるようになります。
from goji_tweet.src.create_goji_tweet import omakase_goji
original_tweet = "きええええぇえええ。。\n後30分でお出掛けなのに書類が散乱してるよぉおお😭😭😭"
omakase_goji(original_tweet)
# 'きええええぇえええ。。\n後30分でお出掛けなのに書類が産卵してるよぉおお😭😭😭'
きええええぇえええ。。\n後30分でお出掛けなのに書類が産卵してるよぉおお😭😭😭
性癖証明書取りに大学来たけど発行機どこにあるか知らんので困った
60回
7. ユーモアは一日にしてならず!笑
以上です。
8. 今回の学び
正規表現
- 日本語関連の正規表現
- 正規表現とマッチした文字列を取得する
何らかのweb上のサービスにリクエストをURLの形で送る
- Google CGI API(日本語変換をインターネット上で実現するためのCGI サービス)
- urllibを使ってリクエストを投げたりする
- 日本語をutf-8エンコーディング(パーセントエンコーディング)しないといけない
- リクエストを投げる・レスポンスを読む
文字列の形で返ってきたリストをリスト型に直す
- 文字列の形で帰ってきたリストをリスト型に直す
- https://www.delftstack.com/ja/howto/python/python-string-to-list/
- eval・execはセキュリティホールになりうるのでastを使おう
カタカナをひらがなに直す
pipでinstallできるライブラリにする
- unkoという名前のライブラリを作りたい時は、ディレクトリの構成を、unko → unko → (コード群)というふうにしないとうまくimportできない https://qiita.com/ijufumi/items/71df89e00ffc2779e165
- pyproject.toml(もしくはsetup.py)を一番上のunkoディレクトリに入れておくという想定(unko/pyproject.toml)
- コードを書くときは、~/unko/unko/srcディレクトリにconfig.pyがあって、hoge.pyからconfig.py内のfugaを使いたい場合、hoge.pyには、from unko.src.config import fugaと書く必要がある。(要は一番上の~/unkoディレクトリで実行しているみたいな想定)これをしないとModuleNotFoundErrorが出る