文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜

9,366 views

Published on

第7回自然言語処理勉強会のスライドです

0 Comments
13 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,366
On SlideShare
0
From Embeds
0
Number of Embeds
2,210
Actions
Shares
0
Downloads
116
Comments
0
Likes
13
Embeds 0
No embeds

No notes for slide

文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜

  1. 1. 文字列カーネルSVMによる辞書なしツイート分類∼文字列カーネル入門∼第7回自然言語処理勉強会 #TokyoNLP2011/09/10 @a_bicky2013/06/02 改訂版
  2. 2. • 自己紹介• カーネル法の概要• SVMの概要• 文字列カーネル入門• 文字列カーネルによるツイート分類アジェンダ
  3. 3. アジェンダ• 自己紹介• カーネル法の概要• SVMの概要• 文字列カーネル入門• 文字列カーネルによるツイート分類
  4. 4. 自己紹介• Takeshi Arabiki(データマイニングエンジニア1年目)‣ Twitter: @a_bicky‣ はてな: id:a_bicky• 興味機械学習、自然言語処理、R• ブログあらびき日記 http://d.hatena.ne.jp/a_bicky/
  5. 5. RユーザですOsaka.R #4 Tokyo.R #16http://www.slideshare.net/abicky/twitterr http://www.slideshare.net/abicky/r-9034336そろそろ ScyPy に浮気しようと思ってます
  6. 6. Webプログラミングを少々http://favmemo.com/作りました!
  7. 7. http://favmemo.com/http://favolog.org/影に隠れました!Webプログラミングを少々
  8. 8. • 自己紹介• カーネル法の概要• SVMの概要• 文字列カーネル入門• 文字列カーネルによるツイート分類アジェンダ
  9. 9. カーネル法の概要
  10. 10. 非線形データの解析===高次元に写像することで非線形問題を線形問題にする変換00000線形分離不可能(非線形問題) 線形分離可能(線形問題)例
  11. 11. 非線形データの非線形解析入力 特徴ベクトル 線形多変量解析入力空間 特徴空間高次元空間に写像すると計算量が増える入力空間x f(x) = wTφ(x)
  12. 12. カーネル法による非線形解析入力 特徴ベクトル カーネル多変量解析入力空間 特徴空間入力空間x f(x) =ni=1αikx(i), x)= wTφ(x)Representer定理(カーネル関数)kx(i), x= φ(x(i))Tφ(x)kカーネル関数を導入することで計算量削減(カーネルトリック)
  13. 13. カーネル関数の種類カーネル関数によって写像する特徴空間は異なる線形カーネル多項式カーネルガウスカーネル
  14. 14. • 自己紹介• カーネル法の概要• SVMの概要• 文字列カーネル入門• 文字列カーネルによるツイート分類アジェンダ
  15. 15. SVMの概要
  16. 16. SVMの概要どのように境界面を定めると ”最適な” 分類ができるか?
  17. 17. +−00g(x) = wTx + w0wSVMの概要マージンを最大化するように境界面を決定する
  18. 18. +−00マージンこの軸の取り方だとマージンが小さい!サポートベクトルg(x) = wTx + w0wSVMの概要マージンを最大化するように境界面を決定する
  19. 19. SVMの概要境界面を変えてみる
  20. 20. +−00g(x) = wTx + w0wSVMの概要
  21. 21. +−00マージンサポートベクトルg(x) = wTx + w0wSVMの概要
  22. 22. SVMの概要完全に分類できない場合(ソフトマージンの最大化)罰則制約条件g(x) = wTx + w0w0+−0マージンサポートベクトル
  23. 23. SVMの解法(線形問題)目的関数最適解SV: サポートベクトル(ラグランジュ乗数)双対問題 + ラグランジュの未定乗数法s.t.マージン    を大きくし,罰則    を小さくしたい
  24. 24. SVMの解法(非線形問題)s.t.リプレゼンター定理非線形変換目的関数s.t.線形問題と同様に
  25. 25. SVMの解法(非線形問題)s.t.リプレゼンター定理非線形変換目的関数s.t.線形問題と同様に計算に関係する部分 を計算する必要がない!(カーネルトリック)
  26. 26. • 自己紹介• カーネル法の概要• SVMの概要• 文字列カーネル入門• 文字列カーネルによるツイート分類アジェンダ
  27. 27. 文字列カーネル入門
  28. 28. 文字列カーネルとは入力として文字列を扱い部分文字列の出現回数などで表現される特徴空間での内積を返すk(x, x) = xTxk(x, x) = (xTx+ c)p線形カーネル多項式カーネル文字列カーネル入力が数値ベクトル入力が文字列(1次元)(例)Gap-weighted String Kernel文字数で区切るので辞書いらず!k(s, t) =u∈Σni:u=s[i]j:u=t[j]λspan(i)+span(j)
  29. 29. 文字列カーネルの種類• Spectrum Kernel長さ n の連続な部分文字列の出現回数を素性とする特徴空間としては 文字 n-gram と同じ!• Gap-weighted String Kernel長さ n の部分文字列(gapがあってもOK)に対してマッチ始端からマッチ終端の距離に応じた値を素性とする• Mismatch String Kernel長さ n の連続な部分文字列の出現回数を素性とするが、m 文字の不一致があってもカウントするe. g. ) m = 1の場合 car という部分文字列に対して cat が現れても出現回数に含める• String Alignment Kernelというのもあるらしい・・・
  30. 30. 文字列カーネルの種類• Spectrum Kernel長さ n の連続な部分文字列の出現回数を素性とする特徴空間としては 文字 n-gram と同じ!• Gap-weighted String Kernel長さ n の部分文字列(gapがあってもOK)に対してマッチ始端からマッチ終端の距離に応じた値を素性とする• Mismatch String Kernel長さ n の連続な部分文字列の出現回数を素性とするが、m 文字の不一致があってもカウントするe. g. ) m = 1の場合 car という部分文字列に対して cat が現れても出現回数に含める• String Alignment Kernelというのもあるらしい・・・
  31. 31. Gap-weighted String Kernelφu(s) =i:u=s[i]λspan(i)tokyonlpnokunotokyonlpφon(tokyonlp) = λ5+ λ2φon(nokuno) = λ4span(i1 = 2, i2 = 6) = 5span(i1 = 5, i2 = 6) = 2span(i1 = 2, i2 = 5) = 4マッチしなければ空集合部分文字列 u の素性の値(素性ベクトルの1要素)(例)u = “on”, s = “nokuno”,“tokyonlp” の場合si1= u1, si2= u2, · · · , sin= unspan(i) = sin− si1+ 1decay factor λ ∈ (0, 1)
  32. 32. Gap-weighted String KernelKn(s, t) =u∈Σnφu(s)φu(t) =u∈Σni:u=s[i]λspan(i)j:u=t[j]λspan(j)=u∈Σni:u=s[i]j:u=t[j]λspan(i)+span(j)1つの計算量が c とすると全体の計算量は O(|Σ|n) !!カーネル関数(パラメータは n と λ の2つ)正規化(文字列の長さの違いを考慮)ˆK(s, t) = ˆφ(s)T ˆφ(t) =φ(s)Tφ(s)φ(t)φ(t)=1φ(s)φ(t)φ(s)Tφ(t) =K(s, t)K(s, s)K(t, t)長さ1になるように正規化した素性ベクトル長さ n の全ての文字列の集合
  33. 33. Dynamic Programming による効率化Kn(sx, t) = Kn(s, t) +(u の末尾が x のものの追加分)o-k o-n k-n …φ(nokun) λ2 λ4 λ3φ(tokyonlp) λ2 λ2 +λ5 λ4K2(nokun,tokyonlp) = λ4 +λ6 +λ7 +λ9K2(nokun,tokyonlp) = λ4 +λ6 +λ7 +λ9K2(nokun,tokyonlp) = λ4 +λ6 +λ7 +λ9K2(nokun,tokyonlp) = λ4 +λ6 +λ7 +λ9K2(nokun,tokyonlp) = λ4 +λ6 +λ7 +λ9文字列 s の末尾に文字 x を追加した場合o-k o-n k-n o-o k-o …φ(nokuno) λ2 λ4 λ3 λ5 λ4φ(tokyonlp) λ2 λ2 +λ5 λ4 λ4 λ3K2(nokuno,tokyonlp) = λ4 +λ6 +λ7 +λ9 +λ7 +λ9K2(nokuno,tokyonlp) = λ4 +λ6 +λ7 +λ9 +λ7 +λ9K2(nokuno,tokyonlp) = λ4 +λ6 +λ7 +λ9 +λ7 +λ9K2(nokuno,tokyonlp) = λ4 +λ6 +λ7 +λ9 +λ7 +λ9K2(nokuno,tokyonlp) = λ4 +λ6 +λ7 +λ9 +λ7 +λ9K2(nokuno,tokyonlp) = λ4 +λ6 +λ7 +λ9 +λ7 +λ9K2(nokuno,tokyonlp) = λ4 +λ6 +λ7 +λ9 +λ7 +λ9例1(nokun に o を追加)
  34. 34. Dynamic Programming による効率化Kn(sx, t) = Kn(s, t) +(u の末尾が x のものの追加分)文字列 s の末尾に文字 x を追加した場合例2(nokun に n を追加)o-k o-n k-n …φ(nokunn) λ2 λ4 +λ5 λ3 +λ4φ(tokyonlp) λ2 λ2 +λ5 λ4K2(nokunn,tokyonlp) = λ4 +λ6 +λ7 +λ9 +λ7 +λ8 +λ10K2(nokunn,tokyonlp) = λ4 +λ6 +λ7 +λ9 +λ7 +λ8 +λ10K2(nokunn,tokyonlp) = λ4 +λ6 +λ7 +λ9 +λ7 +λ8 +λ10K2(nokunn,tokyonlp) = λ4 +λ6 +λ7 +λ9 +λ7 +λ8 +λ10K2(nokunn,tokyonlp) = λ4 +λ6 +λ7 +λ9 +λ7 +λ8 +λ10u の末尾が x の素性の値を修正する必要あり!o-k o-n k-n …φ(nokun) λ2 λ4 λ3φ(tokyonlp) λ2 λ2 +λ5 λ4K2(nokun,tokyonlp) = λ4 +λ6 +λ7 +λ9K2(nokun,tokyonlp) = λ4 +λ6 +λ7 +λ9K2(nokun,tokyonlp) = λ4 +λ6 +λ7 +λ9K2(nokun,tokyonlp) = λ4 +λ6 +λ7 +λ9K2(nokun,tokyonlp) = λ4 +λ6 +λ7 +λ9
  35. 35. Dynamic Programming による効率化Kn(sx, t) = Kn(s, t) +(u の末尾が x で終わるものの追加分)文字列 s の末尾に文字 x を追加した場合stuu xxx|s| + 1i1j1txjn−1 + 1 k|s| + 1 − i1 + 1u が x より手前にある t の部分文字列の集合Kn(sx, t) = Kn(s, t) +u∈Σn−1i:u=s[i]k:tk=xj:u=t[j],jn−1kλ|s|+1−i1+1λk−j1+1= Kn(s, t) +k:tk=xλ2u∈Σn−1i:u=s[i]j:u=t[j],jn−1kλ|s|−i1+1λk−1−j1+1= Kn(s, t) +k:tk=xλ2Kn−1(s, t[1 : k − 1])Kn(s, t) =u∈Σni:u=s[i]j:u=t[j]λ|s|−i1+1λ|t|−j1+1※ は文字列 の長さ|s| s
  36. 36. Dynamic Programming による効率化sxxxKn(s, t) =u∈Σni:u=s[i]j:u=t[j]λ|s|−i1+1λ|t|−j1+1t[1 : k − 1]t[1 : k − 1]Kn(sx, t) = Kn(s, t) +k:tk=xλ2Kn−1(s, t[1 : k − 1])stj1i1|s| + i1 + 1|t| + j1 + 1ukの意味Kn(s, t)改めて     の意味Kn(s, t)
  37. 37. Dynamic Programming による効率化Kn(sx, t) = λKn(s, t) +u∈Σn−1i:u=s[i]k:tk=xj:u=t[j],jn−1kλ|s|+1−i1+1λ|t|−j1+1= λKn(s, t) +k:tk=xλ|t|−k+2u∈Σn−1i:u=s[i]j:u=t[j],jn−1kλ|s|−i1+1λk−1−j1+1= λKn(s, t) +k:tk=xλ|t|−k+2Kn−1(s, t[1 : k − 1])= λKn(s, t) + Kn(sx, t)Kn(s, t) の更新式(    と同様)Kn(s, t)Kn(sx, t) =k:tk=xλ|t|−k+2Kn−1(s, t[1 : k − 1])
  38. 38. Kn(sx, ty) =λKn(sx, t) if x = yλKn(sx, t) + λ2Kn−1(s, t) otherwiseDynamic Programming による効率化の更新式単純に2つの項に分解t= ty とおくとよってKn(s, t)Kn(sx, t) =k:tk=xλ|t|−k+2Kn−1(s, t[1 : k − 1])= λk:tk=x,k|t|λ|t|−k+2Kn−1(s, t[1 : k − 1]) + λ2Kn−1(s, t)[[tk = x, k = |t|]]= λKn(sx, t) + λ2Kn−1(s, t)[[tk = x, k = |t|]]
  39. 39. Ki (sx, ty) =λKi (sx, t) if x = yλKi (sx, t) + λ2Ki−1(s, t) otherwiseGap-weighted String Kernel の更新式i = 1, · · · , n − 1K0(s, t) = 1 ∀s, tKi (s, t) = 0 if min(|s|, |t|) iKi(s, t) = 0 if min(|s|, |t|) iKi(sx, t) = λKi(s, t) + Ki (sx, t)Ki(s, t) = 0 if min(|s|, |t|) iKn(sx, t) = Kn(s, t) +k:tk=xλ2Kn−1(s, t[1 : k − 1])
  40. 40. Gap-weighted String Kernel の”擬似”コード(1)l = 0.7 # lambdadef indices(t, x):ret = [];pos = -1;while 1:pos = t.find(x, pos + 1)if pos != -1:ret.append(pos)else:breakreturn retdef K(i, s, t):if min(len(s), len(t)) i:return 0return K(i, s[0:-1], t) + l ** 2 * sum([K1(i - 1, s[0:-1], t[0:j]) for j inindices(t, s[-1])])Ki(s, t) = 0 if min(|s|, |t|) iKn(sx, t) = Kn(s, t) +k:tk=xλ2Kn−1(s, t[1 : k − 1])
  41. 41. Ki (sx, ty) =λKi (sx, t) if x = yλKi (sx, t) + λ2Ki−1(s, t) otherwisedef K1(i, s, t):if i == 0:return 1if min(len(s), len(t)) i:return 0return l * K1(i, s[0:-1], t) + K2(i, s, t)Gap-weighted String Kernel の”擬似”コード(2)K0(s, t) = 1 ∀s, tKi (s, t) = 0 if min(|s|, |t|) iKi(s, t) = 0 if min(|s|, |t|) iKi(sx, t) = λKi(s, t) + Ki (sx, t)def K2(i, s, t):if min(len(s), len(t)) i:return 0if s[-1] == t[-1]:return l * (K2(i, s, t[0:-1]) + l * K1(i -1, s[0:-1], t[0:-1]))else:return l * K2(i, s, t[0:-1])
  42. 42. • 自己紹介• カーネル法の概要• SVMの概要• 文字列カーネル入門• 文字列カーネルによるツイート分類アジェンダ
  43. 43. 文字列カーネルによるツイート分類
  44. 44. データの取得#!/usr/bin/env python# -*- coding: utf-8 -*-import tweepyimport reimport codecsdef format_tweet(tweet):tweet = re.sub(r[rn], , tweet) # remove CR and LFtweet = re.sub(rs*https?://[-w.#%@/?=]*s*, , tweet) # remove URLtweet = re.sub(r(^|s+)#[^s]+s*, , tweet) # remove hash tagstweet = re.sub(rs*(?!w)@w+(?!@)s*, , tweet) # remove user namesreturn tweetapi = tweepy.API()f = open(tweets.dat, w)f = codecs.lookup(utf_8)[-1](f)for c, user in zip((-1, 1), (a_bicky, midoisan)):print userfor i in range(1, 4):while True:print itry:statuses = api.user_timeline(user, count = 200, page = i)breakexcept:print ’Try again...’for tweet in map(lambda s:format_tweet(s.text), statuses):f.write(%s #%sn % (c, tweet))f.close()# 1人あたり約500ツイート取得# SVMlightで使えるデータ形式で保存
  45. 45. データセットuser train test337 tweets 163 tweets305 tweets 186 tweets5文字以上のツイートのみ抽出し、約2対1の割合で学習データとテストデータに分割何故か midoisan の方が 2対1 にはほど遠い割合ということに今更気付く・・・a_bicky: いろいろとやばい状況…midoisan: 狂気∼ッ!!(例)← ネガティブツイートが多い← 特徴的な言葉遣いと狂った発言が多い文字 n-gram, Gap-weighted 文字列カーネル(   ), 単語 unigram で正解率を比較λ = 0.7
  46. 46. 結果文字 n-gram文字 n-gram と Gap-weighted 文字列カーネルで約4.0%の差Gap-weighted 文字列カーネル
  47. 47. nokuno さんでもやってみた文字 n-gram Gap-weighted 文字列カーネル文字 n-gram と Gap-weighted 文字列カーネルで約3.6%の差
  48. 48. まとめ
  49. 49. • カーネル法によって入力データを複雑な空間に射影した上で線形多変量解析の手法が適用可能• SVMはマージン最大化に基づく線形判別手法であり、カーネル法が適用できる代表的な手法• 文字列カーネルは入力として文字列を使用• 文字列カーネルSVMによって文字 n-gramよりもツイート分類の正解率が数%向上• 計算量が格段に増える割にはパフォーマンスが上がらないとの会場の声まとめ
  50. 50. • 赤穂昭太郎, カーネル多変量解析, 岩波書店, 2008前半部分は全てこの内容• H. Lodhi, C. Saunders, J. Shawe-Taylor, N. Cristianini, and C.Watkins.TextClassification using String Kernels. Journal of Machine Learning Research,Vol. 2, pp.419–444, 2002.Gap-weighted String Kernel の元論文• カーネル法の応用 http://www.ism.ac.jp/~fukumizu/ISM_lecture_2006/Lecture2006_application.pdf• 文書分類と Kernel あれこれ(仮称) http://www.ism.ac.jp/~fukumizu/ISM_lecture_2006/Lecture2006_application.pdf• Juho Rousu , John Shawe-Taylor. Efficient Computation of Gapped SubstringKernels on Large Alphabets,The Journal of Machine Learning Research,Vol. 6, pp.1323-1344, 2005.余裕があればこっちの方を理解して紹介したかった・・・参考文献
  51. 51. おまけ
  52. 52. 本発表の関連コードhttps://github.com/abicky/tokyonlp07_abicky以下にアップしたのでご自由にお使い下さい!
  53. 53. SVMlight で文字列カーネルdouble custom_kernel(KERNEL_PARM *kernel_parm, SVECTOR *a, SVECTOR *b){char* s = a-userdefined;char* t = b-userdefined;char param[BUFSIZE];strcpy(param, kernel_parm-custom);...}SVMlight で文字列カーネルを実装してみたい!-1 #おぉ、SVMlightのデータ形式のうち、コメントの情報が格納されるのか!-1 #こんなこと書くぐらいならspectrum kernelぐらい組み込んどいてほしい。kernel.h ( kernel.c として Makefile をいじってもいい)# コマンド引数で -u “parameters” と指定した内容が格納されているデータサンプル ハッシュ以下の内容が SVECTOR-userdefined に格納される
  54. 54. 変更履歴• 2013/06/02‣ pp. 33-34 の上の表の値が間違っていたので修正

×