More Related Content
PPTX
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices PDF
PDF
PDF
PDF
PDF
ACPC 2018 Day3 F: 01 文字列と窓 (Binary String with Slit) PDF
PPTX
What's hot
PDF
PDF
[ML論文読み会資料] Teaching Machines to Read and Comprehend PDF
PDF
PDF
PDF
AtCoder Regular Contest 048 ODP
区間をキーとして保持する分散KVSの効率的な実現法 Similar to 文字列処理
PDF
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート] PPT
PDF
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜 PDF
自然言語処理はじめました - Ngramを数え上げまくる KEY
Algebraic DP: 動的計画法を書きやすく PDF
PDF
PDF
PDF
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」 DOCX
PDF
プログラミング講座 #6 競プロのテクニック(初級) PDF
PDF
PDF
PPT
PDF
PDF
PDF
PPTX
Python による 「スクレイピング & 自然言語処理」入門 PPTX
More from Ryunosuke Iwai
ODP
ODP
ODP
ODP
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PPTX
文字列処理
- 1.
- 2.
- 3.
- 4.
- 5.
身の回りの文字列
● 概算してみる
● 例1 : NPCA の Skype 部屋
1 つのコメントが 10~50 文字くらい
1 日平均 100 コメントくらい?
1 年の量 : (1000~5000) 365✕
≒ 10^5~6
- 6.
身の回りの文字列
● 例 2: Twitter
1 ヶ月で約 20 億ツイート
1 年の量 : 2×10^9×12
≒2×10^10
● 例 3 : ウェブサイト
サイトの数だけでも n 億
中身も入れると…
- 7.
例えば
● 文字列 Sに部分文字列 T が何回現れるかを
求めたい ( 検索エンジンなど)
● 愚直にやると O((|S|-|T|)×|T|)
- 8.
- 9.
- 10.
例えば
● 文字列 Sに部分文字列 T が何回現れるかを
求めたい
● 愚直にやると O((|S|-|T|)*|T|)
→ 死
● O(Alog B) (A,B |S|,|T|)≦ ぐらいで求めたい
- 11.
- 12.
- 13.
- 14.
- 15.
完備辞書
● ビット列 Tに対して (b=0,1)
access(T,p) = T[p]
rankb(T,p) = T の p 番目より前の b の数
selectb(T,p) = T の中で (p+1) 番目の b の位置
を求める機能を備えたデータ構造
● 簡潔!
- 16.
単純な実装方法
● D[i]=i 番目より前に1 が何個あるか
とすると
rank1(p) = D[p] : O(1)
rank0(p) = p – D[p] : O(1)
access(p) = D[p] – D[p-1] : O(1)
selectb(p) = rankb(x) = p+1
となる x を二分探索 : O(log |D|)
- 17.
- 18.
- 19.
- 20.
- 21.
a b ca c d a
00 01 10 00 10 11 00
0010110(abcacda)
0100(abaa) 001(ccd)
a b c d
0
0 0
1
11
1 ビット目
2 ビット目
文字
- 22.
- 23.
ウェーブレット木
● 文字を 2進数で表したとき、次に見るビッ
トが 0 なら左、 1 なら右の子に下り、各頂
点にはそれぞれの文字の次に下るビットを
追加する
● できたビット列それぞれに対し完備辞書を
適用することで各操作を実現する
● 深さは log σ (σ は文字の種類 )
- 24.
各操作
● access(p): 元の文字列のp 番目を復元する
● rankc(p): p 番目より前の c の数を求める
● selectc(p): (p+1) 番目の c の位置を求める
● quantile(s,e,r): s 番目〜 (e-1) 番目で (r+1) 番
目に大きいものを求める
● topk(s,e,k) : s~e で頻度の多い順に k 個返す
● rangefreq(s,e,a,b) :
s~e で a~b の値の出現数を返す
- 25.
- 26.
- 27.
接尾辞 (suffix)
● Sk: 文字列 S の (k+1) 番目から最後までの
部分文字列
● S = “thatzatthatthatzatstar” なら
– S2 = “atzatthatzatstar”
– S4 = “zatthatzatstar”
– S16 = “zatstar”
- 28.
接尾辞配列 (suffix array)
●S0~S|S|-1 を辞書順にならべた配列
● ソートされていることからある文字列は連
続した区間内の接尾辞配列の接頭辞として
現れる
● O(|S|log |S|) ほどで構築するアルゴリズムが
存在する
- 29.
- 30.
- 31.
接尾配列の特徴
● S0~S|S|-1 を辞書順にならべた配列
●ソートされていることからある文字列は連
続した区間内の接尾辞配列の接頭辞として
現れる
● T が接頭辞となっている区間を s~e とする
と、 T が S 内に現れる回数は e-s+1
● e,s は二分探索で O(log |S|) で求められる
● よって最初の問題は O(|T|log |S|) で解ける
- 32.
- 33.
- 34.
- 35.
BWT(Burrows Wheeler Transform)
●より使用メモリを少なくするために接尾配
列を圧縮したもの
接尾配列を SA とすると
Bt[p] = T[SA[i]-1] (SA[i]>0)
T[|T|-1] (SA[i]=0)
● Wheeler が考案し、現在でも文字列解析に
欠かせないものとなっている
- 36.
- 37.
FM-index
● 接尾配列上で文字列 Qが区間 [s,e] に対応
しているとき c+Q に対応する区間について
s = rankc(Bt,s)+C[c]
e = rankc(Bt,e)+C[c]
(C[c] は T の中の c 未満の文字の数 )
が成り立ち、ウェーブレット木を用いて最
初の問題に O(Mlog σ) で答えられる
(M はクエリ文字列の長さ ,σ は文字種類 )
- 38.
- 39.
その他の操作
● 文書 d1,…,dnとそれぞれの重み w1,...,wn を考
えるとき、
df(Q) : Q が出現する文書数
mdf(Q) : Q の出現数の合計
cd(Q1,...,Qm) :
Q1,...,Qm を全て含む文書を求める
● 文書の種類 ( 論文の分野の特定 ) 判別など
- 40.
- 41.
- 42.
- 43.
cd(Q)
● 各 Qkについて対応する範囲 [sk,ek] を求め、
それらの共通要素 intersect をウェーブレッ
ト木で求める
- 44.
- 45.
- 46.
- 47.