sklearn.svm.LinearSVCでフィルタを書いてみる

Wikiquoteのダンプデータから引用部分だけ取り出したいな、と思った。元データを見るとこんな感じ

[[小泉純一郎]]

CATEGORIES: 政治家, 日本人, 日本の内閣総理大臣, 1940年代生

小泉純一郎(1942年 - )は、日本の政治家(自由民主党)、第87、88、89代総理大臣。

==発言==

* 人間を動かすのは、計算じゃありません。
**  1998年 二度目の自民党総裁選に敗北し、会見で涙を見せた
*「自民党をぶっ壊す」「構造改革なくして成長なし」「改革には痛みが伴う」
** 2001年 自民党総裁選の街頭演説などで

で「どこが引用文でどこがそうでないかを識別するコード」を人間が実装するかどうか。手軽に使えるようだからsklearn.svm.LinearSVCを使ってみた。こんな感じで識別される。+1が「引用文」で-1が「それ意外」

+1 *「自民党をぶっ壊す」「構造改革なくして成長なし」「改革には痛みが伴う」
-1 ** 2001年 自民党総裁選の街頭演説などで
-1 
-1 ===首相在任中===
-1 
+1 *協力して「聖域なき構造改革」に取り組む「改革断行内閣」
+1 *今の痛みに耐えて明日を良くしようという「米百俵の精神」こそ、改革を進めようとする今日の我々に必要ではないでしょうか。
-1 ** 第151回国会における小泉内閣総理大臣所信表明演説
(中略)
+1 * またいまこの瞬間にスターンの作品が描いたものをそれぞれ再び手にとってみれば、19世紀において、我々が彼の描いたものそれぞれに負っているものが経験され、また我々が彼スターンより継承しうるものが洞察されるであろう。『箴言と省察』760節。
-1 *:[tpl]lang|de|Auch jetzt im Augenblick sollte jeder Gebildete Sternes Werke wieder zur Hand nehmen, damit auch das 19. Jahrhundert erführe,

ソースコードはこんな感じ。jawq.txtが元データでjawq_ok.txtに引用部分の例を、jawq_ng.txtにそうでない部分の例を入れている。make_featureで1280次元の特徴ベクトルを作って、その特徴ベクトルから+1/-1への対応付けのデータをmake_dataで作って、svc.fitに学習させている。後は元データから1行読んでSVCで分類して表示。Enterキーで次々進んで、もし間違った分類の仕方をしていたらなんか入力すればそれを学習データに追加するって仕組み。

from sklearn.svm import LinearSVC
import numpy as np

svc = LinearSVC()
N = 5
xs = []
ys = []

def make_feature(line):
    s = line[:N].ljust(N, '\0')
    x = np.zeros(N * 256)
    for i, c in enumerate(s):
        x[i * 256 + ord(c)] = 1
    return x

def make_data(filename, answer):
    for line in file(filename):
        x = make_feature(line)
        xs.append(x)
        ys.append(answer)


make_data('jawq_ok.txt', 1)
make_data('jawq_ng.txt', -1)

svc.fit(xs, ys)

for line in file('jawq.txt'):
    p = svc.predict(make_feature(line))[0]
    r = raw_input("%+1d %s" % (p, line.strip()))
    if r: # mean NG
        if p == 1:
            open('jawq_ng.txt', 'a').write(line)
        else:
            open('jawq_ok.txt', 'a').write(line)

簡単だなぁ。人間が人力でフィルタを実装する場合にはタスクが自分と密結合になるけども、こういう形になったら「正解かどうか」を判定できる人であれば誰でもフィルタを育てられる。

次は切りだされた行の中から出展情報と本文とを分割するのを試してみよう。カッコで囲われてたり引用符が付いてたりめんどくさげ。

*カエサルのものはカエサルに収め、神のものは神に納めよ。- マタイ22:21
*剣を取る者は皆、剣で滅びる。- マタイ26:52
* 鮒に始まり鮒に終わる -- 釣りの格言
* 鮒一箸二箸一箸二箸至極惜しい -- e(自然対数の底)の語呂合わせ
* 青は之を藍より取りて而も藍より青し。氷は水之を為りて而も水より寒し。 -- 荀子『勧学篇』
* 水取りや氷の僧の沓の音 -- 松尾芭蕉『野ざらし紀行』
* 「追従は、それを捧げる人も受ける人も共に堕落させる。阿諛が無益であるのは王に対してだけとは限らない。民衆に対しても同様である。」 -- エドマンド・バーク『フランス革命の省察』より
*:遠くて近きもの 極樂 舟の道 男女の仲
*“人の客ほど大事にする。それがキャストの仁義。” ―――「銀座時代に培った“持ちつ持たれつ”の精神について語った名言」として。『小悪魔ageha』による引用。(2010年)『小悪魔ageha 2010年10月号』 : “金融バブルに色恋、黒い太陽、そしてユダ… あの時代を駆け抜けたちょうちょたちの伝説が今甦る!! 歌舞伎町・六本木 夜の偉人伝説!!!!:早川沙世伝説” (p.100) 2010年10月10日発行 インフォレスト
*「野球は人生そのものだ」「リハビリはウソをつかない」
*「長嶋って誰?」 - 新庄剛志