430 likes | 568 Views
テキスト検索は 文字列検索でも木検索でもない. 京都大学人文科学研究所附属漢字情報研究センター 安岡孝一. テキスト処理とコンピュータの出会い. IBM 704 (1954) 入出力に CPY 命令を使用 連続したメモリの内容を順次入出力 FORTRAN I (1956) 「 Hollerith field 」を FORMAT 文に導入 定数長の連続した文字の列 メモリ空間上に連続的に配置. 文字列 (string) の登場. ALGOL 60 (1960) BNF によって定式化 「 string 」を 1 次元の文字の列として定義.
E N D
テキスト検索は文字列検索でも木検索でもないテキスト検索は文字列検索でも木検索でもない 京都大学人文科学研究所附属漢字情報研究センター 安岡孝一
テキスト処理とコンピュータの出会い • IBM 704 (1954) 入出力にCPY命令を使用 • 連続したメモリの内容を順次入出力 • FORTRAN I (1956) 「Hollerith field」をFORMAT文に導入 • 定数長の連続した文字の列 • メモリ空間上に連続的に配置
文字列(string)の登場 • ALGOL 60 (1960) BNFによって定式化 「string」を1次元の文字の列として定義 <proper string> ::= <any sequence of basic symbols not containing ‘ or ’>|<empty> <open string> ::= <proper string>|‘<open string>’|<open string><open string> <string> ::= ‘<open string>’ 多くの実装では「string」をメモリに連続配置
文字列処理の実用化 • IBM System/360 (1964) メモリ単位を8bit=1byteに 1文字=1byte (EBCDIC) • PL/I (1964) CHARACTER型を規定 文字列に対する比較操作が可能に
文字列検索アルゴリズムの登場 • Morris-Pratt (1970) 部分マッチング後の検索キーのシフト量を増加 • Knuth-Morris-Pratt (1974) Morris-Prattをさらに改良 • Aho-Corasick (1975) 複数の検索キーに対し平行して検索
T A L Y I E I T U L A I Aho-Corasickアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
T A L Y I E I T U L A I Aho-Corasickアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
T A L Y I E I T U L A I Aho-Corasickアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
T A L Y I E I T U L A I Aho-Corasickアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
T A L Y I E I T U L A I Aho-Corasickアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
T A L Y I E I T U L A I Aho-Corasickアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
T A L Y I E I T U L A I Aho-Corasickアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
T A L Y I E I T U L A I Aho-Corasickアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
T A L Y I E I T U L A I Aho-Corasickアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
逆方向文字列マッチング • Boyer-Moore (1977) 検索キーの末尾からマッチングをおこなう 非マッチング時の検索キーのシフト量を増加 • Commentz-Walter (1979) 複数の検索キーに対しBoyer-Mooreを適用
I T A L 7 6 5 4 Y T I E 5 4 T U L I A 7 6 5 3 Commentz-Walterアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
I T A L 7 6 5 4 Y T I E 5 4 T U L I A 7 6 5 3 Commentz-Walterアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
I T A L 7 6 5 4 Y T I E 5 4 T U L I A 7 6 5 3 Commentz-Walterアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
I T A L 7 6 5 4 Y T I E 5 4 T U L I A 7 6 5 3 Commentz-Walterアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
I T A L 7 6 5 4 Y T I E 5 4 T U L I A 7 6 5 3 Commentz-Walterアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
I T A L 7 6 5 4 Y T I E 5 4 T U L I A 7 6 5 3 Commentz-Walterアルゴリズム ex) ITALYとTIEとTULIAを検索 INSTITUTE FOR RESEARCH IN HUMANITIES
漢字テキスト検索への応用 • 1文字≠1byte ex) 「安岡の1族」を日本語EUCで表現 安 岡 の 1 族 B0 C2 B2 AC A4 CE 31 C2 B2 単純なバイト列マッチングでは検索に失敗?
漢字テキスト検索への応用 • 1文字≠1byte • 異体字による曖昧検索 ex) 「帝國大學」の検索 「帝国大学」も「帝國大学」も「帝国大學」も… 「國」の異体字: 国、囯、囻、圀、囶 「學」の異体字: 学、斈、斆、斅 幾何級数的に組み合わせが増える
BD BD BD B5 B5 D9 A1~AF B1~FE BC A1~FE FE 漢字テキスト検索への応用 • 篠原-有川 (1985) Aho-Corasickを漢字テキスト用に改良 ex) 日本語EUCで「十週休」と「十周休」を検索
漢字における逆方向マッチング • 日本語EUCやシフトJISでは難しい • UTF-8を考案(1993) • ISO 10646 (Unicode)の変形の一種 • 1文字を1~6バイトで表現 • 1バイト目には00~7F、C0~FEを使用 • 2バイト目以降には80~BFを使用 安 岡 の 1 族 E5 AE 89 E5 B2 A1 E3 81 AE 31 E6 97 8F 安 岡 の 1 族 E5 AE 89 E5 B2 A1 E3 81 AE 31 E6 97 8F
AD 8 7 E5 A6 E5 A4 A7 B8 E5 AD 8 7 11 10 9 E6 88 96 8 7 UTF-8での逆方向マッチング • Commentz-Walterを使用可能 ∵ 文字間にマッチングすることはありえない ex) 「大学」「大學」「大斈」を検索
漢字テキスト検索への応用 • 1文字≠1byte • 異体字による曖昧検索 • テキストの非1次元性
やす おか こう いち やす おか こう いち 私は安岡孝一です。 私は安岡孝一です。 漢字テキストの非1次元性 • ルビつきテキストの検索 安岡孝一です
やす おか こう いち やす おか こう いち 私は安岡孝一です。 私は安岡孝一です。 漢字テキストの非1次元性 • ルビつきテキストの検索 私はやすおか
やす おか こう いち やす おか こう いち 私は安岡孝一です。 私は安岡孝一です。 漢字テキストの非1次元性 • ルビつきテキストの検索 安岡こういち
やす おか こう いち 私は安岡孝一です。 漢字テキストの非1次元性 • ルビつきテキストの検索
漢字テキストの非1次元性 • ルビつきテキストの検索 • 本文に埋め込まれた注の検索 故宮の神(玄の避諱)武門に向かった。 故宮の神(玄の避諱)武門に向かった。 神武門
漢字テキストの非1次元性 • ルビつきテキストの検索 • 本文に埋め込まれた注の検索 故宮の神(玄の避諱)武門に向かった。 故宮の神(玄の避諱)武門に向かった。 故宮の玄武門
漢字テキストの非1次元性 • ルビつきテキストの検索 • 本文に埋め込まれた注の検索 故宮の神(玄の避諱)武門に向かった。
テキスト検索は文字列検索ではない • テキストの非1次元性にどう対処するか • XML/XHTMLを使う? ex) XHTMLにおけるRuby Annotation (2001) <p>私は<ruby xml:lang=“ja”> <rbc><rb>安</rb><rb>岡</rb><rb>孝</rb><rb>一</rb></rbc> <rtc><rt>やす</rt><rt>おか</rt><rt>こう</rt><rt>いち</rt></rtc> </ruby>です。</p>
p ruby 私は です。 rbc rtc rb rb rb rb rt rt rt rt 安 岡 孝 一 やす おか こう いち <p>私は<ruby xml:lang=“ja”> <rbc><rb>安</rb><rb>岡</rb><rb>孝</rb><rb>一</rb></rbc> <rtc><rt>やす</rt><rt>おか</rt><rt>こう</rt><rt>いち</rt></rtc> </ruby>です。</p>
p ruby 私は です。 rbc rtc rb rb rb rb rt rt rt rt 安 岡 孝 一 やす おか こう いち 木構造がテキストの流れと合致しない
テキスト検索は文字列検索ではない • テキストの非1次元性にどう対処するか • Directed Acyclic Graphでテキストを実装? 検索アルゴリズムは?
DAGテキストの検索アルゴリズム • Aho-Corasick風アルゴリズム • 深さ優先で容易に実装可能 • パスが縮退した際の打ち切りは容易 • Commentz-Walter風アルゴリズム • 深さ優先で実装可能 通ってきたノードを記憶する必要あり • パスが縮退した際の打ち切り条件が複雑
DAGテキストの検索アルゴリズム • 分岐と縮退によるパス数の爆発 • 縮退時の打ち切りは? • Aho-Corasick風アルゴリズム 初期状態に戻れば確実に打ち切れる • Commentz-Walter風アルゴリズム 「その他」が起これば確実に打ち切れる
今後の課題 • DAGテキスト検索アルゴリズムの高速化 • パス数の爆発を抑えられるか? • 縮退時の打ち切り条件をtightにできるか? • もっと効率のよいアルゴリズムはないか?
テキスト検索は文字列検索でも木検索でもないテキスト検索は文字列検索でも木検索でもない 京都大学人文科学研究所附属漢字情報研究センター 安岡孝一