ネット上の文書をきれいにするライブラリ「NetTextCleaner」を公開しました

エイプリルフールネタです:) 見ればわかりますが、30分ぐらいで作ったものなので、言ってることもコードもデータも結構適当です:p

はじめに

インターネット上で扱われる文書(Twitter2chニコニコ動画など)には、特殊な用語や言い回しをしているものがあり、ネットの文書を扱う多くの自然言語処理研究者を苦しめています。


一番問題となることは、「これらの特殊な用語や言い回しを含む文を形態素解析すると解析に失敗すること」で、これによってIDFの計算や統計的言語モデルがおかしくなったりしてしまいます。


そこで、「書き手が書きたいことが、ひねくれて、実際に書かれる」という仮説を考え、生成的な確率モデルである「Noisy Channel Model」を用いてモデル化し、書き手が本当に書きたかったきれいな文へ変換することで、自然言語処理に失敗しない文章にすることができるライブラリを作成しました。
今後、各ウェブ企業などに導入され、ネット上のあらゆる文書に適用されることで、きれいになっていくでしょう。


Noisy Channel Modelによる変換

本当に書きたかったきれいな文章をS、実際に書いてしまった特殊な言い回しをした文章をTとします。
これをNoisy Channel Modelを用いると、
T = argmax P(T' | S)
 \,\,\,\,= argmax P(T') * P(S | T') / P(S)
 \,\,\,\,= argmax P(T') * P(S | T')
のようにモデル化でき、変換モデルP(S | T')を統計的に求めることができる気がします。


本ライブラリでは、ネット上からサンプルを各1件ずつ抽出し、統計的に変換モデルを作成しています。

ライブラリの概要

「変換モデル」と「変換プログラム」の2つから成ります。
「変換プログラム」は、正規表現を用いて上記の変換システムを実装してあり、「変換モデル」は変換モデルが含まれています。


実際のプログラムは、下記のAppendixにまとめられています。

使用例

以下のように、ネット上の文書を、一般的な理解可能な文書へ変換します。

$ ls
model.dat   cleaner.pl

$ perl cleaner.pl
あくしろよ
=> はやくしてください

猫、ぐうかわ
=> 猫、ぐうの音もでないほどかわいい

賢者タイム
=> 男性のみに訪れる特別な時間

帰って、どうぞ
=> 帰ってください

評価

Twitterのタイムラインを流れていたツイートに対してこれらを適用した結果、精度66.7%(3件中2件正解)という高精度で変換することができています。

免責事項

このライブラリを用いて起きたあらゆる問題・障害に対して責任を持ちません。
おそらく適当に変更して使っていただいて問題ないと思います。

Appendix

変換プログラムと変換モデルを以下に添付します。コピペによって利用する事ができます。


【cleaner.pl】

#!/usr/local/bin/perl
use strict;
use warnings;

my $dic_path = "./model.dat";
my @src_rules;
my @dst_rules;

open(IN, "<", $dic_path) or die;
while(<IN>){
    chomp;
    my ($src_rule, $dst_rule) = split(/\s+/, $_, 2);
    push(@src_rules, $src_rule);
    push(@dst_rules, $dst_rule);
}


while(<>){
    chomp;
    my $text = $_;

    for(my $i=0; $i<@src_rules; $i++){
        $text =~ s/$src_rules[$i]/qq(\"$dst_rules[$i]\")/eeg;
    }

    print "=> ", $text, "\n";
}

【model.dat】

(.+?)かわいいよ\1	$1がかわいい
(.+?)\1アンド\1	とても$1
(.+?)のバーゲンセール	$1の希少価値が落ちている
(.+?)ェ…	$1…
(.+?)過ぎて謝謝	$1過ぎて申し訳ない
(.+?)に(\d+?)ペリカ	$1だと思います
(.+?)に自信ニキ	$1に自信がある人
(.+?)は(ポイー|ポイ-)で	$1はいらない
あ…(察し)	心中お察しします
アイエ.+?\!\s*(.+?)\!\?\s*\1ナンデ\!\?	$1だ
あくしろよ	はやくしてください
アッー!	アーッ!
あまり私を怒らせない方がいい	私を怒らせると大変な事になりますよ
ありがとナス	ありがとう
\(.+?)だー!/	$1です
あーげない	あげません
いーらない	いりません
くーださい	ください
イイハナシダナー	いい話です
1ヶ月綺麗な言葉をかけ続けた(.+?)と1ヶ月罵声を浴びせ続けた\1	1ヶ月きれいな言葉と罵声で$1がどう変化したか
いつから(.+?)だと錯覚していた?	$1は錯覚です
今北産業	今来たところなのでこれまでの流れを三行で説明してください
びゃあ゛ぁ゛゛ぁうまひぃ゛ぃぃ゛	いやあ、うまい
(.+?)しろよ、色々と捗るぞ	$1すれば世界が変わりますよ?オススメですよ?
インド人を右に	ハンドルを右に
イ゙ェアアアア	\(断末魔\)
(.+?)から来るぞ!気をつけろ!	$1から何か来ます
ウキウキでワロタw+?	ウキウキで笑いました
イライラでワロタw+?	イライラで笑いました
(?<!ドワ|ニワ)ンゴ	。
(.+?)の法則が乱れる!	(.+?)がよくわからないがとにかくめちゃくちゃな状態になっている
うはwwwおkwww	ハイテンションなので笑って許せます
うーんこの	なにかがおかしい
教えてエロい人	教えてください
オナシャス	お願いします
おめぇの(.+?)ねぇから	あなたの$1はありません
おもんねーわ	面白くない
オワコン	終わったコンテンツ
(.+?)がね・・・	$1が致命的です
(.+?)か何か?	$1ではないと思いますが$1でしょうか?
キマシタワー	百合展開、きました
きんもーっ☆	キモいです
は犠牲になったのだ	は死にました
ぎゃんかわ	とてもかわいい
ギャン泣き	ギャンギャン泣きわめく
草不可避	笑いを耐えられません
くやしいのう	くやしいですね
ぐうかわ	ぐうの音もでないほどかわいい
グンマー	群馬県
賢者タイム	男性のみに訪れる特別な時間
激おこぷんぷん丸	結構怒っています
こ↑こ↓	ここ
これで勝つる	これで勝てます
GOD’S and DEATH	ありがとうございます
33\-4	圧倒的大差
(.+?)、どうぞ	$1ください
志村うしろ!	後ろから危険が迫っています
正直、すまんかった	ごめんなさい
(小並感)	(小学生並みの感想)
が一晩でやってくれました。	が尋常ではないはやさで仕事をしてくれました
じゃあの	また会いましょう
少し、頭冷やそうか	冷静になりましょう
すっごい(.+?)よ!	すごく$1です!
すまぬ…すまぬ…	ごめんなさい
ですしおすし	ですし
でっていう	だからなに?
どう見ても(.+?)です。本当にありがとうございました。	どう見ても$1です\(残念\)
日本語でおk	日本語でお願いします
日本よ、これが(.+?)だ	これこそ真の$1
はいじゃないが	それどころじゃないでしょう
微レ存	微粒子レベルで存在しています
ふつくしい	美しい
△	さんかっこいい
ボスケテ	助けて
無理ぽ	もう無理っぽい
メシウマ	他人の不幸で今日も飯がうまい
メシマズ	他人の幸福で飯がまずい
もうだめぽ	もうダメだ・・・
(.+?)のライフはゼロよ!	$1は瀕死です!
モルダーあなた疲れてるのよ	疲れておかしくなっています
やめたげてよぉ	やめてあげてください
やろう、ぶっころしてやる	ブチ切れました
許してヒヤシンス	許してください
よろしい、ならば戦争だ	でしたら、戦争で勝負をつけましょう
ワシの(.+?)は108式まであるぞ	まだ本気を出していないが、本気を出したらもっとすごいですよ?