読者です 読者をやめる 読者になる 読者になる

2ちゃんねるに寄せられた質問と回答から検索できるページを作った

2ちゃんねる Q&A 検索 - QARC

人類の知の資産であるところの2ちゃんねるの過去ログから、特に有用と思われる質問と回答のやりとりを高度な自然言語処理技術を用いて抽出・アーカイブし、それらを誰もが自由に検索できるページを作りました。
僕は、feezch.infoという2ちゃんねるのパートスレを次スレまで次々に自動追跡しながらひとつのストリームとしてフィードを吐くウェブサービスを運営しているのですが、フィードの利用者がとても少ないわりに、過去ログへのアクセスがものすごくあって、そのほとんどは質問スレの回答求めて訪れる方のようなので、それなら一発で回答にアクセスできるページを作れば非常に大きな社会貢献になるのではないか、feezch.infoのコードを使えば簡単に作れるし、ビッグデータや。そう考えてこのサービスを作ることにしました。

コレを使うと、たとえば、「skyrim 水銀のインゴット」と入力して検索ボタンを押すと…
http://2bd642aadabd8fdc27fb3bd56a192efb.gazou.me/large.png

このように過去に2ちゃんねるに寄せられた質問レスが出てきます。
「回答を見る」をクリックすると……

http://1e14e14a1c3f2fc208bd1ed8f7b94289.gazou.me/large.png

知の資産に一発アクセス!

全文検索はpg_trgmで適当に作ったもので、短いクエリのパフォーマンスが最悪なのでなので、どちらかというとGoogle様に期待しています。

それと2ちゃんねるのレスを文に分割するライブラリを作った

さて、全自動2chまとめブログの話はこれくらいにして、技術的な話。

質問文の抽出はいろいろがんばっているのですが、正直なところ「?が含まれるかどうか??」のほうが精度がいいのでは???ってレベルです。
そのため質問スレ以外はゴミを大量に作りそうで処理してないのですが、今後精度がよくなれば持っている過去ログ全てから質問のみを抽出するといったこともやっていきたいと思っています。

で、少しはがんばった結果、ちょっと便利なライブラリができたのでここで紹介だけしておきます。

2ちゃんねるのレスは、たとえば、

wryebashについて調べていたら、「MODのインスコとアンインスコでゴミを残す」
というのが出てきたのでそれについて調べてみたのですが
他のサイトで同じようなバグは報告されていませんでした
実際に使っている方は問題なく使えていますか?
また、他のバグや不満な点などを教えてもらえると有りがたいです。
NMMから乗り換えようと思っているのでお願いします。

「氷の上の血」のクエストが発生しないんで困ってるんだけど
なんとか、コンソールとかで強制的に発生できないかな?
wiki見る限り、経過日数が250日経過してるとアウトっぽいんで
今のデータだとほぼ詰みっぽいんで、家が買えない・・・・

古びたお守り:龍の護石から回避距離6達人10のお守りが出たのですが
風化したお守りからは同等もしくはそれ以上の数値を持つお守りが出ることはあるのでしょうか
それとも古おまのみにしか出ないお守りなのでしょうか
誰か持っている人いたら回答よろしくお願いします
風おまを狙って凍土へ行くか古おま、光おまも狙って火山へ行くか…
早く下山したい…

のような「。」があったりなかったり、「。」の代わりに改行が使われていたり、しかも「。」とは関係なく文字列の幅を調節するために改行していたりで、どこまでがひとつの文なのか分からなくなっています。
文章をbag of wordsで処理する分には問題ならないと思いますけど、係り受け解析までしたいときに文の区切りが分からないとうまく処理できないとか、そこまでしなくても、たとえば疑問文かどうかは文末を見れば大体分かりますが、文末がどこか分からないと見ることができません。
おい、困ったぞ。
そこで、これをこういった文字列を自動で文に区切るライブラリを作りました。(Rubyですが、MeCabがあるところならきっと簡単に移植できます)

句読点のない文字列を文単位に区切る — Gist

こんな感じになります。(別途MeCab-Rubyが必要です)

require 'zch_sentence'
res1 = <<T
wryebashについて調べていたら、「MODのインスコとアンインスコでゴミを残す」
というのが出てきたのでそれについて調べてみたのですが
他のサイトで同じようなバグは報告されていませんでした
実際に使っている方は問題なく使えていますか?
また、他のバグや不満な点などを教えてもらえると有りがたいです。
NMMから乗り換えようと思っているのでお願いします。
T
res2 = <<T
「氷の上の血」のクエストが発生しないんで困ってるんだけど
なんとか、コンソールとかで強制的に発生できないかな?
wiki見る限り、経過日数が250日経過してるとアウトっぽいんで
今のデータだとほぼ詰みっぽいんで、家が買えない・・・・ 
T
res3 = <<T
古びたお守り:龍の護石から回避距離6達人10のお守りが出たのですが
風化したお守りからは同等もしくはそれ以上の数値を持つお守りが出ることはあるのでしょうか
それとも古おまのみにしか出ないお守りなのでしょうか
誰か持っている人いたら回答よろしくお願いします
風おまを狙って凍土へ行くか古おま、光おまも狙って火山へ行くか…
早く下山したい…
T
puts "---"
puts ZchSentence.emend(res1)
puts "---"
puts ZchSentence.emend(res2)
puts "---"
puts ZchSentence.emend(res3)

出力

    • -

wryebashについて調べていたら、「MODのインスコとアンインスコでゴミを残す」というのが出てきたのでそれについて調べてみたのですが、他のサイトで同じようなバグは報告されていませんでした。
実際に使っている方は問題なく使えていますか?
また、他のバグや不満な点などを教えてもらえると有りがたいです。
NMMから乗り換えようと思っているのでお願いします。

    • -

「氷の上の血」のクエストが発生しないんで困ってるんだけど、なんとか、コンソールとかで強制的に発生できないかな?
wiki見る限り、経過日数が250日経過してるとアウトっぽいんで、今のデータだとほぼ詰みっぽいんで、家が買えない・・・・

    • -

古びたお守り:龍の護石から回避距離6達人10のお守りが出たのですが、風化したお守りからは同等もしくはそれ以上の数値を持つお守りが出ることはあるのでしょうか。
それとも古おまのみにしか出ないお守りなのでしょうか。
誰か持っている人いたら回答よろしくお願いします。
風おまを狙って凍土へ行くか古おま、光おまも狙って火山へ行くか…
早く下山したい…

適切に「。」や「、」を補完し、1行1文にして返してくれます。便利。

アルゴリズムとしては、まず「改行の位置は文の区切りまたは文節の区切りである」という仮定を置いた上で、

  • 「。」や「?」「!」などで終わっていたら文の区切りでしょう
  • 「、」で終わっていたら文の区切りではないでしょう
  • 行がアスキーコードの範囲のみで構成されているなら、きっとそれはURLであり1行でひとつの単位でしょう
  • 連続して改行されていたら(空行を挟んでいたら)その上はきっと文の終わりでしょう

などなどのルールを適用しようとして、それらのルールで最後まで対応できない場合は、あらかじめ学習している機械学習器で文として区切れるか区切れないかを判定しています。

この分類器はあまり精度がよくないのですが、ルールのおかげであまり使うこともないので、大体はうまくいくという感じのものです。
この部分はいろいろ妥協していたり、もっとうまくやる方法があると思うけど、僕が詳しくないために試せていないとか、もっと自然言語処理やってますみたいな人が作って僕に無料で使わせるべきだ、みたいに思っている部分があるので、今度またどうやって学習しているのかなどの話を詳しく書こうと思っています。

ちなみにZchSentence.splitという関数を使うと機械学習器だけを使って区切ります。
(。や?や改行が含まれないデータで学習しているので、あらかじめ消しておきます)

puts "---"
puts ZchSentence.split(res1.gsub(/[。、?\n]/,"")).join("。\n") + "。\n"
puts "---"
puts ZchSentence.split(res2.gsub(/[。、?\n]/,"")).join("。\n") + "。\n"
puts "---"
puts ZchSentence.split(res3.gsub(/[。、?\n]/,"")).join("。\n") + "。\n"
    • -

wryebashについて調べていたら「MODのインスコとアンインスコでゴミを残す。
」というのが出てきたのでそれについて調べてみたのですが他のサイトで同じようなバグは報告されていませんでした。
実際に使っている方は問題なく使えていますか。
また他のバグや不満な点などを教えてもらえると有りがたいです。
NMMから乗り換えようと思っているのでお願いします。

    • -

「氷の上の血」のクエストが発生しないんで困ってるんだけどなんとかコンソールとかで強制的に発生できないかな。
wiki見る限り経過日数が250日経過してるとアウトっぽいんで今のデータだとほぼ詰み。
っぽいんで家が買えない。
・・・・。

    • -

古びたお守り:龍の護石から回避距離6達人10のお守りが出たのですが風化した。
お守りからは同等もしくはそれ以上の数値を持つお守りが出ることはあるのでしょうか。
それとも古おまのみにしか出ない。
お守りなのでしょうか。
誰か持っている。
人いたら回答よろしくお願いします。
風おまを狙って凍土へ行くか。
古おま光。
おまも狙って火山へ行くか。
…早く下山したい…。

たったこれだけの文字列でも結構間違えていますね。
学習データが青空文庫のテキストなので、そのせいもあるかもしれませんけど、とにかくあまりよくないです。最悪です。