Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ふりがな付きHTML文書に対する文字列探索の過去と未来
Search
Tadashi Saito
January 07, 2024
Research
0
10
ふりがな付きHTML文書に対する文字列探索の過去と未来
第65回 プログラミング・シンポジウム 山内奨励賞受賞講演
https://prosym.org/65/program.html#day2
https://prosym.org/awards/
Tadashi Saito
January 07, 2024
Tweet
Share
More Decks by Tadashi Saito
See All by Tadashi Saito
Rubyと研究と私 − 開発助成採択者の10年後
tadd
0
49
Integrating Static Optimization and Dynamic Nature in JavaScript (GPCE 2025)
tadd
0
170
ふりがな付きHTML文書に対する文字列探索
tadd
0
260
From String undump to String unescape
tadd
0
350
Other Decks in Research
See All in Research
離散凸解析に基づく予測付き離散最適化手法 (IBIS '25)
taihei_oki
PRO
1
630
SREのためのテレメトリー技術の探究 / Telemetry for SRE
yuukit
13
2.6k
Earth AI: Unlocking Geospatial Insights with Foundation Models and Cross-Modal Reasoning
satai
2
210
GPUを利用したStein Particle Filterによる点群6自由度モンテカルロSLAM
takuminakao
0
710
Satellites Reveal Mobility: A Commuting Origin-destination Flow Generator for Global Cities
satai
3
270
Thirty Years of Progress in Speech Synthesis: A Personal Perspective on the Past, Present, and Future
ktokuda
0
140
Attaques quantiques sur Bitcoin : comment se protéger ?
rlifchitz
0
110
生成的情報検索時代におけるAI利用と認知バイアス
trycycle
PRO
0
120
その推薦システムの評価指標、ユーザーの感覚とズレてるかも
kuri8ive
1
290
AWSで実現した大規模日本語VLM学習用データセット "MOMIJI" 構築パイプライン/buiding-momiji
studio_graph
2
1.1k
Sat2City:3D City Generation from A Single Satellite Image with Cascaded Latent Diffusion
satai
4
410
ロボット学習における大規模検索技術の展開と応用
denkiwakame
1
180
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.4k
Visualization
eitanlees
150
16k
The Spectacular Lies of Maps
axbom
PRO
1
400
The SEO identity crisis: Don't let AI make you average
varn
0
39
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
2
66
Automating Front-end Workflow
addyosmani
1371
200k
So, you think you're a good person
axbom
PRO
0
1.8k
Between Models and Reality
mayunak
0
150
YesSQL, Process and Tooling at Scale
rocio
174
15k
Unsuck your backbone
ammeep
671
58k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
59
Transcript
ふりがな付きHTML文書に対する文字列探索の 過去と未来 第 65 回 プログラミング・シンポジウム 齋藤 ただし 匡 1
岩崎 英哉2 2024 年 1 月 7 日 1 電気通信大学 大学院情報理工学研究科 博士後期課程 2 年 2 明治大学 理工学部
発表の概要 昨年の発表と論文「ふりがな付き HTML 文書に 対する文字列探索」に対して「山内奨励賞」を いただくこととなり,深く感謝申し上げます. 発表の全体は大きく 2 つに分かれます. 1.
前回発表の要約・振り返り 2. 過去の経緯・未来への展望 1 / 17
ふりがなとは ふりがなは日本語に欠かせない存在.漢字の読みを仮名で注釈するためによ く用いられる.ふりがなで注釈される文字は 親文字と呼ばれる. わがはい は 吾輩 ふりがな 親文字 利用例
• 難読漢字の読み • 日本語・漢字の学習 • 文芸作品での特徴的な表現 近年,HTML を通して Web ページでふ りがなに触れる機会も増えている. 2 / 17
<ruby> タグ HTML のふりがなは <ruby> タグで表す.
例えば, わがはい 吾輩 は は以下のように表現する. <ruby> 吾輩 <rp>(</rp> <rt>わがはい</rt> <rp>)</rp> </ruby> は <ruby> ふりがな・親文字の全体 <ruby> 直下 親文字 <rt> ふりがな <rp> 古いブラウザ用, <ruby> 対応ブラウザでは無視 これらの入れ子になった 4 要素によって <ruby> タグ全体が成り立つ. 3 / 17
主要ブラウザの問題点 現在普及する主要なブラウザ 3 つは,ふりがなのページ内検索においてそれ ぞれ,別の問題を抱えている. Google Chrome 120 の例 Chrome
<ruby> の各要素やタグの前後を跨ぐ検索 がマッチしない わがはい 吾輩 は... Firefox ふりがながテキストにならない 吾輩は... Safari 親文字とふりがなが 1 つのテキストとし て連結される 吾輩わがはいは... 4 / 17
本研究の目的 ふりがな付き HTML 文書での自然な文字列探索を実現し, 主要ブラウザすべての問題を解決する 方針 • 「自然な文字列探索」として望ましい挙動を考察・定義 • ふりがなに適したデータ構造・アルゴリズムを設計
• すぐ使い始められる JavaScript ライブラリとして実装 5 / 17
望ましい挙動の考察 「親文字」と「ふりがな」は区別せず検索できることが望ましい. ユーザが「親文字か,ふりがなか」 「タグの境界を跨ぐか」といった条件まで 悩むべきではない. • 任意の箇所・数の <ruby>
内部をテキストと見做す • 親文字とふりがなを「重なった」文字列として対等に探索する 6 / 17
テキスト構造の再考 ふりがな付きテキスト全体を分岐・合流する文字列であると捉える. わがはい ねこ なまえ な ⋯⋯ は はまだ である�
�輩 � 名前 � い�⋯⋯ ⋯⋯ • 内部に通常の文字列を複数持つ • 冒頭の「は」は,親文字「猫」 ・ふりがな「ねこ」の両方へつながる • 親文字・ふりがなの両方が後続の「である。」へつながる このようなグラフ構造を分岐文字列と呼ぶ. 7 / 17
分岐文字列の探索 (1) 力任せ法 安直に連結して通常文字列にすると,分岐数に対し O(2n) 個の文字列が必要 となる.そのため,グラフ構造を保ったままの探索を実装した. ねこ 猫 は
である。 8 / 17
分岐文字列の探索 (1) 力任せ法 安直に連結して通常文字列にすると,分岐数に対し O(2n) 個の文字列が必要 となる.そのため,グラフ構造を保ったままの探索を実装した. ねこ 猫 は
である。 ① ③ ② ④ 8 / 17
分岐文字列の探索 (1) 力任せ法 安直に連結して通常文字列にすると,分岐数に対し O(2n) 個の文字列が必要 となる.そのため,グラフ構造を保ったままの探索を実装した. ねこ 猫 は
である。 ① ③ ② ④ 1 1 1 1 2 3 4 2 ただし,力任せで列挙するのは探索開始位置のみ.そこから JS の組込文字列 関数 startsWith() を利用し,効率化を図った. 8 / 17
分岐文字列の探索 (2) 力任せ法の改良 パターンの 1 文字目が各通常文字列に含まれている場合のみ,残りの探索を 行うよう改良を施した.判定には組込の indexOf()
を活用した. ねこ 猫 は である。 ① ③ ② ④ 1 パターンが ねこである の場合, indexOf() をノード数 = 4 回分呼び出した 後は,従来 8 回だった探索の開始が 1 回で済む. 9 / 17
実装 有効性評価のため,JavaScript ライブラリ Ruby Finder として実装した. 一般ユーザの利用例 (Firefox 121) •
DOM ノードから分岐文字列を構築・探索 • ブラウザで動作する通常のライブラリ • 外部依存はなく,ページへの組込が容易 • 主要 3 ブラウザすべてで動作確認済み 10 / 17
評価: 概要 文字列探索実行の時間を計測した.現実的なサイズ (約 44 KB) の短編小説 「手紙」に対し,パターン 2 文字を
10 回探索した平均時間 (マイクロ秒). 探索方式 Firefox Chromium WebKit 力任せ 16,042 33,738 18,598 改良力任せ 4,315 1,819 3,376 (組み込み) 912 471 480 • 力任せ法: 最悪でも約 0.034 秒,十分実用的 • 改良力任せ法: 最大で 18.5 倍以上の高速化 • (組み込み): 連結済みの通常文字列による参考値 • 現状の Safari と同等のもの.例 吾輩わがはいは猫ねこである 11 / 17
まとめ • ふりがな付き文書での自然な文字列探索を考察 • ふりがな付き HTML 文書の文字列探索手法を設計・実装 • 評価によって望ましい探索結果と十分な性能を確認 今後の課題
• オープンソースソフトウェアとして公開 • アルゴリズムの改良 • HTML 以外の領域への応用 12 / 17
過去の経緯・未来への展望
前回の議論 発表での質疑とその後を含め,多くの有益なコメントをいただいた. • W3C による Issue ページ • 各ブラウザのバグトラッカーページ •
Q. 複数の親文字・ふりがなの対応を自動で割り振れないか? A. HTML での構造を保つ前提で実装を行ったため未検討 A2. 「 き ょ う 今日」のような「熟字訓」を考えると,分割は困難 自由闊達で興味深い意見交換と雰囲気に勇気付けられた. 13 / 17
発表までの経緯 (1) 完全な「趣味のプログラム」のつもりで,登壇・発表という予定もなく, ローペースな開発だった. 2019 2020 2021 2022 2023 2018
プ ロ シ ン で の 発 表 14 / 17
発表までの経緯 (1) 完全な「趣味のプログラム」のつもりで,登壇・発表という予定もなく, ローペースな開発だった. 2019 2020 2021 2022 2023 趣
味 の サ イ ト 製 作 ~ 問 題 を 自 覚 2018 プ ロ シ ン で の 発 表 14 / 17
発表までの経緯 (1) 完全な「趣味のプログラム」のつもりで,登壇・発表という予定もなく, ローペースな開発だった. 2019 2020 2021 2022 2023 趣
味 の サ イ ト 製 作 ~ 問 題 を 自 覚 最 初 の コ ミ ッ ト 2018 プ ロ シ ン で の 発 表 14 / 17
発表までの経緯 (1) 完全な「趣味のプログラム」のつもりで,登壇・発表という予定もなく, ローペースな開発だった. 2019 2020 2021 2022 2023 趣
味 の サ イ ト 製 作 ~ 問 題 を 自 覚 最 初 の コ ミ ッ ト ~ 大 半 を 実 装 2018 プ ロ シ ン で の 発 表 14 / 17
発表までの経緯 (1) 完全な「趣味のプログラム」のつもりで,登壇・発表という予定もなく, ローペースな開発だった. 2019 2020 2021 2022 2023 趣
味 の サ イ ト 製 作 ~ 問 題 を 自 覚 最 初 の コ ミ ッ ト ~ 大 半 を 実 装 大 学 院 へ 入 学 2018 社会人 学生 プ ロ シ ン で の 発 表 14 / 17
発表までの経緯 (1) 完全な「趣味のプログラム」のつもりで,登壇・発表という予定もなく, ローペースな開発だった. 2019 2020 2021 2022 2023 趣
味 の サ イ ト 製 作 ~ 問 題 を 自 覚 最 初 の コ ミ ッ ト ~ 大 半 を 実 装 大 学 院 へ 入 学 2018 社会人 学生 指 導 教 員 (共 著 者 ) に 相 談 ? プ ロ シ ン で の 発 表 14 / 17
発表までの経緯 (1) 完全な「趣味のプログラム」のつもりで,登壇・発表という予定もなく, ローペースな開発だった. 2019 2020 2021 2022 2023 趣
味 の サ イ ト 製 作 ~ 問 題 を 自 覚 最 初 の コ ミ ッ ト ~ 大 半 を 実 装 大 学 院 へ 入 学 2018 社会人 学生 指 導 教 員 (共 著 者 ) に 相 談 ? 久 々 に 開 発 , 現 状 を ま と め る プ ロ シ ン で の 発 表 14 / 17
発表までの経緯 (2) 技術要素 「趣味のプログラム」として,技術要素の選定で大いにリスクを冒した. • 自分にとっての JS:「カーソルを猫が追いかける」 「画面に雪を降らせる」 ⇒ 人気のある言語の新しい機能を全く知らなかった,知りたい
2019 2020 2021 2022 2023 問 題 の 自 覚 2018 プ ロ シ ン で の 発 表 15 / 17
発表までの経緯 (2) 技術要素 「趣味のプログラム」として,技術要素の選定で大いにリスクを冒した. • せっかくなので,新しい言語仕様・機能を使ってみよう 2019 2020 2021 2022
2023 問 題 の 自 覚 最 初 か ら ES M odules+C lasses 2018 プ ロ シ ン で の 発 表 15 / 17
発表までの経緯 (2) 技術要素 「趣味のプログラム」として,技術要素の選定で大いにリスクを冒した. • せっかくなので,新しいツールでテストしてみよう 2019 2020 2021 2022
2023 問 題 の 自 覚 最 初 か ら ES M odules+C lasses +Puppeteer で ユ ニ ッ ト テ ス ト 2018 プ ロ シ ン で の 発 表 15 / 17
発表までの経緯 (2) 技術要素 「趣味のプログラム」として,技術要素の選定で大いにリスクを冒した. • =⇒ 思ったより新し過ぎて定番ツールが使えず,自分で治す 2019 2020 2021
2022 2023 問 題 の 自 覚 最 初 か ら ES M odules+C lasses +Puppeteer で ユ ニ ッ ト テ ス ト +M ocha に 手 パ ッ チ 2018 プ ロ シ ン で の 発 表 15 / 17
発表までの経緯 (2) 技術要素 「趣味のプログラム」として,技術要素の選定で大いにリスクを冒した. • 新しいツールでもっとたくさんの環境を 2019 2020 2021 2022
2023 問 題 の 自 覚 最 初 か ら ES M odules+C lasses +Puppeteer で ユ ニ ッ ト テ ス ト +M ocha に 手 パ ッ チ Playw right 化 で 3 ブ ラ ウ ザ 対 応 2018 プ ロ シ ン で の 発 表 15 / 17
発表までの経緯 (2) 技術要素 「趣味のプログラム」として,技術要素の選定で大いにリスクを冒した. • 定番に変化があったので移行しよう 2019 2020 2021 2022
2023 問 題 の 自 覚 最 初 か ら ES M odules+C lasses +Puppeteer で ユ ニ ッ ト テ ス ト +M ocha に 手 パ ッ チ Playw right 化 で 3 ブ ラ ウ ザ 対 応 Jest に 乗 り 換 え 2018 プ ロ シ ン で の 発 表 15 / 17
発表までの経緯 (2) 技術要素 「趣味のプログラム」として,技術要素の選定で大いにリスクを冒した. • =⇒ 新しければより良くなるとは限らない 2019 2020 2021
2022 2023 問 題 の 自 覚 最 初 か ら ES M odules+C lasses +Puppeteer で ユ ニ ッ ト テ ス ト +M ocha に 手 パ ッ チ Playw right 化 で 3 ブ ラ ウ ザ 対 応 Jest に 乗 り 換 え , 少 し 遅 く な る 2018 プ ロ シ ン で の 発 表 15 / 17
未来への展望: 1 年間での差分 1. オープンソースソフトウェア化 • 自分にとっての “MVP” (Minimum-Viable Product):
ハイライトできる • 手を付けると思った以上に辛く,一区切りまでの足枷に • =⇒ 来月 20 日ごろ楽に (CSS Custom Hightlight API) 2. アルゴリズムの改良 • KMP の利用に挑戦 =⇒ 間に合わず⋯⋯ • 途中だが,改良に必要な理解・仮説が得られたのは成果 16 / 17
未来への展望: 中途成果・まとめ • あと一日 (×n) で動きそうな実装 • 現実 (Chrome/V8 実装)
の startsWith の複雑さ • BM 法/BMS 法を含めて場合分けが 6 つ • 仮説: 失敗時の情報が豊富な KMP 関数が内部に必要? • 成功時よりも失敗時のインデックスが欲しい まとめ • 知らない技術を学ぶのは楽しい • プログラミングは楽しい ねこ 猫 は である。 ① ③ ② ④ 1 1 1 1 2 3 4 2 17 / 17