yukichant 3.1.0-beta.6 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules +58 -0
- package/.husky/commit-msg +2 -0
- package/.releaserc.json +26 -0
- package/AGENTS.md +505 -0
- package/CHANGELOG.md +84 -0
- package/README.md +107 -0
- package/__tests__/fuzzy-kanji-match.js +33 -0
- package/__tests__/index.js +1 -1
- package/__tests__/typo-correction.js +56 -0
- package/benchmark/CHATGPT_BENCHMARK.md +90 -0
- package/benchmark/README.md +99 -0
- package/benchmark/magi_ocr_data/README.md +53 -0
- package/benchmark/magi_ocr_data/dataset.tsv +836 -0
- package/benchmark/results/.gitkeep +0 -0
- package/benchmark/results/summary/latest_comparison.tsv +9 -0
- package/benchmark/scripts/compare-algorithms.js +54 -0
- package/benchmark/scripts/compare-and-report.js +35 -0
- package/benchmark/scripts/generate-report.js +324 -0
- package/benchmark/scripts/prompt-template.txt +118 -0
- package/benchmark/scripts/run-accuracy-test.js +155 -0
- package/benchmark/scripts/run-chatgpt-test.js +284 -0
- package/commitlint.config.js +21 -0
- package/doc/develop.md +88 -0
- package/doc/typo-correction-algorithm.md +79 -0
- package/package.json +38 -7
- package/src/browser.js +115 -0
- package/src/cli.js +12 -1
- package/src/fuzzy-kanji-match.js +102 -0
- package/src/index.js +56 -88
- package/src/jaro-winkler.js +120 -0
- package/src/logger.js +22 -0
- package/src/node.js +35 -0
- package/src/typo-correction.js +363 -0
- package/test_data/help_message.js +3 -0
package/.cursor/rules
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# yukichant プロジェクトルール
|
|
2
|
+
|
|
3
|
+
## 言語設定
|
|
4
|
+
|
|
5
|
+
**このプロジェクトでは、すべてのコミュニケーションを日本語で行ってください。**
|
|
6
|
+
|
|
7
|
+
- すべての説明・応答は日本語で記述する
|
|
8
|
+
- コミットメッセージは日本語で記述する
|
|
9
|
+
- コードコメントは日本語で記述する
|
|
10
|
+
- レビューコメントは日本語で記述する
|
|
11
|
+
- エラーメッセージの説明は日本語で記述する
|
|
12
|
+
|
|
13
|
+
## コミットメッセージフォーマット
|
|
14
|
+
|
|
15
|
+
コミットメッセージは以下のフォーマットで記述してください:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
[種別] 簡潔な説明
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### 種別の例
|
|
22
|
+
- `[feat]`: 新機能追加
|
|
23
|
+
- `[fix]`: バグ修正
|
|
24
|
+
- `[perf]`: パフォーマンス改善
|
|
25
|
+
- `[refactor]`: コード整理
|
|
26
|
+
- `[test]`: テスト追加/修正
|
|
27
|
+
- `[docs]`: ドキュメント更新
|
|
28
|
+
- `[deps]`: 依存関係の更新
|
|
29
|
+
- `[chore]`: その他の変更
|
|
30
|
+
|
|
31
|
+
### 例
|
|
32
|
+
```
|
|
33
|
+
[feat] Levenshtein距離アルゴリズムを追加
|
|
34
|
+
[fix] デコード時の形態素解析エラーを修正
|
|
35
|
+
[docs] 誤字修正アルゴリズムの使い方を追加
|
|
36
|
+
[refactor] 類似度計算処理を関数化
|
|
37
|
+
[test] typo-correctionのテストケースを追加
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## コーディング規約
|
|
41
|
+
|
|
42
|
+
- ES Modules(`import`/`export`)を使用
|
|
43
|
+
- 非同期処理は`async`/`await`を使用
|
|
44
|
+
- 関数型プログラミングスタイル(`map`, `filter`, `reduce`を活用)
|
|
45
|
+
- Unicode正規表現(`\p{scx=Han}`など)を積極的に使用
|
|
46
|
+
|
|
47
|
+
## プロジェクト概要
|
|
48
|
+
|
|
49
|
+
yukichantは、テキストを日本語の詠唱呪文に変換し、元に戻すことができるNode.js製CLIツールです。
|
|
50
|
+
|
|
51
|
+
### 主要コンポーネント
|
|
52
|
+
- `src/index.js`: エンコード/デコードのコアロジック
|
|
53
|
+
- `src/typo-correction.js`: 誤字修正機能(Jaro-Winkler / Levenshtein)
|
|
54
|
+
- `src/machine-encrypt.js`: ローター型暗号実装
|
|
55
|
+
- `data/meisi.json`, `data/dousi.json`: 名詞・動詞辞書
|
|
56
|
+
|
|
57
|
+
詳細は `AGENTS.md` を参照してください。
|
|
58
|
+
|
package/.releaserc.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"branches": ["master"],
|
|
3
|
+
"plugins": [
|
|
4
|
+
["@semantic-release/commit-analyzer", {
|
|
5
|
+
"preset": "conventionalcommits",
|
|
6
|
+
"releaseRules": [
|
|
7
|
+
{ "breaking": true, "release": "major" },
|
|
8
|
+
{ "type": "feat", "release": "minor" },
|
|
9
|
+
{ "type": "fix", "release": "patch" },
|
|
10
|
+
{ "type": "perf", "release": "patch" },
|
|
11
|
+
{ "type": "refactor", "release": "patch" },
|
|
12
|
+
{ "type": "revert", "release": "patch" }
|
|
13
|
+
]
|
|
14
|
+
}],
|
|
15
|
+
["@semantic-release/release-notes-generator", {
|
|
16
|
+
"preset": "conventionalcommits"
|
|
17
|
+
}],
|
|
18
|
+
"@semantic-release/changelog",
|
|
19
|
+
"@semantic-release/npm",
|
|
20
|
+
["@semantic-release/git", {
|
|
21
|
+
"assets": ["package.json", "CHANGELOG.md"],
|
|
22
|
+
"message": "[release] ${nextRelease.version}"
|
|
23
|
+
}],
|
|
24
|
+
"@semantic-release/github"
|
|
25
|
+
]
|
|
26
|
+
}
|
package/AGENTS.md
ADDED
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
このドキュメントは、AIエージェント(コーディングアシスタント)がyukichantプロジェクトを理解し、効果的に開発支援を行うためのガイドです。
|
|
4
|
+
|
|
5
|
+
## 重要な指示
|
|
6
|
+
|
|
7
|
+
**このプロジェクトでは、すべてのコミュニケーションを日本語で行ってください。**
|
|
8
|
+
|
|
9
|
+
- コード提案時の説明は日本語で記述する
|
|
10
|
+
- コミットメッセージは日本語で記述する
|
|
11
|
+
- レビューコメントは日本語で記述する
|
|
12
|
+
- エラーメッセージの説明は日本語で記述する
|
|
13
|
+
- ドキュメント・コメントは日本語で記述する
|
|
14
|
+
|
|
15
|
+
## プロジェクト概要
|
|
16
|
+
|
|
17
|
+
**yukichant**は、テキストデータを日本語の詠唱呪文(魔法の言葉)に変換し、元のテキストに復号できるNode.js製のCLIツールです。
|
|
18
|
+
|
|
19
|
+
### 主な機能
|
|
20
|
+
- **エンコード**: 任意のテキストを呪文風の日本語文章に変換
|
|
21
|
+
- **デコード**: 呪文を元のテキストに復号
|
|
22
|
+
- **誤字修正**: 呪文のタイポを自動修正してデコード(Jaro-Winkler / Levenshtein)
|
|
23
|
+
- **ランダム生成**: ランダムな呪文を生成
|
|
24
|
+
|
|
25
|
+
### 技術スタック
|
|
26
|
+
- **言語**: JavaScript (ES Modules)
|
|
27
|
+
- **形態素解析**: kuromoji(yukidic辞書使用)
|
|
28
|
+
- **文字列類似度**: Jaro-Winkler(独自実装)、fastest-levenshtein
|
|
29
|
+
- **暗号化**: 独自のローター型暗号実装
|
|
30
|
+
|
|
31
|
+
## アーキテクチャ
|
|
32
|
+
|
|
33
|
+
### ディレクトリ構造
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
yukichant/
|
|
37
|
+
├── src/ # ソースコード
|
|
38
|
+
│ ├── cli.js # CLIエントリーポイント(commander使用)
|
|
39
|
+
│ ├── index.js # メインロジック(encode/decode/generate)
|
|
40
|
+
│ ├── machine-encrypt.js # ローター型暗号実装
|
|
41
|
+
│ ├── typo-correction.js # 誤字修正ロジック
|
|
42
|
+
│ ├── fuzzy-kanji-match.js # 漢字類似度マッチング
|
|
43
|
+
│ └── jaro-winkler.js # Jaro-Winkler実装
|
|
44
|
+
├── data/ # 名詞・動詞データ(JSON)
|
|
45
|
+
│ ├── meisi.json # 名詞辞書(16進数コード→名詞リスト)
|
|
46
|
+
│ └── dousi.json # 動詞辞書(16進数コード→動詞リスト)
|
|
47
|
+
├── dic/ # kuromoji用辞書(yukidic)
|
|
48
|
+
├── benchmark/ # ベンチマーク・精度測定
|
|
49
|
+
│ ├── magi_ocr_data/ # Magiプロジェクトから取得したOCRテストデータ
|
|
50
|
+
│ ├── results/ # 検証結果の保存先(.gitignore対象)
|
|
51
|
+
│ └── scripts/ # ベンチマーク実行スクリプト
|
|
52
|
+
├── __tests__/ # Jest単体テスト
|
|
53
|
+
└── raw_data/ # 辞書生成用スクリプト・元データ
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### データフロー
|
|
57
|
+
|
|
58
|
+
#### エンコード
|
|
59
|
+
```
|
|
60
|
+
テキスト
|
|
61
|
+
→ UTF-8バイト配列
|
|
62
|
+
→ ローター暗号でスクランブル
|
|
63
|
+
→ 16進数(2桁)に変換
|
|
64
|
+
→ 名詞/動詞マッピング(4語ごとに動詞)
|
|
65
|
+
→ 呪文文字列
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
#### デコード
|
|
69
|
+
```
|
|
70
|
+
呪文文字列
|
|
71
|
+
→ kuromoji形態素解析
|
|
72
|
+
→ 辞書マッチング(正規表現)
|
|
73
|
+
→ (オプション)誤字修正
|
|
74
|
+
→ 16進数コード復元
|
|
75
|
+
→ ローター暗号で復号
|
|
76
|
+
→ UTF-8テキスト
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 重要なコンポーネント
|
|
80
|
+
|
|
81
|
+
### 1. `src/index.js` - コアロジック
|
|
82
|
+
|
|
83
|
+
#### `encode(text, option, data, encoder)`
|
|
84
|
+
- テキストをUTF-8バイト配列に変換
|
|
85
|
+
- `simpleEnigma`でスクランブル
|
|
86
|
+
- 16進数コードを名詞・動詞にマッピング
|
|
87
|
+
- パターン: `名詞 名詞 名詞 動詞。` の繰り返し
|
|
88
|
+
|
|
89
|
+
#### `decode(text, option, data, decoder)`
|
|
90
|
+
- `kuromoji`で形態素解析
|
|
91
|
+
- 辞書から逆引き(名詞/動詞 → 16進数コード)
|
|
92
|
+
- オプションで誤字修正(`typo-correction.js`)
|
|
93
|
+
- `simpleEnigma`で復号
|
|
94
|
+
|
|
95
|
+
#### `generate(length, data, generater)`
|
|
96
|
+
- ランダムバイト配列を生成
|
|
97
|
+
- エンコードして呪文を生成
|
|
98
|
+
|
|
99
|
+
### 2. `src/typo-correction.js` - 誤字修正
|
|
100
|
+
|
|
101
|
+
#### 主要関数
|
|
102
|
+
|
|
103
|
+
##### `exec(text, option)`
|
|
104
|
+
誤字修正のメインエントリーポイント
|
|
105
|
+
- `kuromoji`で形態素解析
|
|
106
|
+
- 未知の形態素を検出・修正
|
|
107
|
+
- オプションに応じて類似度アルゴリズムを選択
|
|
108
|
+
|
|
109
|
+
##### `findClosestWord(word, wordList, useLevenshtein, option)`
|
|
110
|
+
最も近い単語を辞書から検索
|
|
111
|
+
- `useLevenshtein=true`: Levenshtein距離
|
|
112
|
+
- `useLevenshtein=false`: Jaro-Winkler距離(デフォルト)
|
|
113
|
+
|
|
114
|
+
##### `nearTokenMatch(tokenStr, option)`
|
|
115
|
+
TF-IDF重み付けを使った高度なマッチング
|
|
116
|
+
- 漢字の部首・構造情報を活用
|
|
117
|
+
- `fuzzy-kanji-match.js`と連携
|
|
118
|
+
|
|
119
|
+
##### `organizeUnknownTokens(ntokens, option)`
|
|
120
|
+
連続する未知の形態素をまとめる
|
|
121
|
+
- 副詞・助詞の処理
|
|
122
|
+
- 形態素の位置情報を保持
|
|
123
|
+
|
|
124
|
+
#### オプション
|
|
125
|
+
- `is_tfidf`: TF-IDF重み付けを使用(デフォルト: false)
|
|
126
|
+
- `Levenshtein`: Levenshtein距離を使用(デフォルト: false、Jaro-Winkler)
|
|
127
|
+
- `v`: デバッグ出力(修正前後を表示)
|
|
128
|
+
- `Vv`: 詳細デバッグ出力(類似度スコアなど)
|
|
129
|
+
|
|
130
|
+
### 3. `src/machine-encrypt.js` - ローター型暗号
|
|
131
|
+
|
|
132
|
+
Enigma機を模した暗号化アルゴリズム
|
|
133
|
+
- バイトコードの頻度分布を均等化
|
|
134
|
+
- 同じ入力に対して異なる暗号文を生成可能
|
|
135
|
+
|
|
136
|
+
### 4. `src/jaro-winkler.js` - 文字列類似度
|
|
137
|
+
|
|
138
|
+
#### `JaroWinklerDistance`クラス
|
|
139
|
+
- `similarity(s1, s2)`: 0~1の類似度スコア(1が完全一致)
|
|
140
|
+
- 接頭辞一致に高い重みを与える(日本語に適している)
|
|
141
|
+
- パラメータ:
|
|
142
|
+
- `prefixScale`: 0.1(接頭辞の重み)
|
|
143
|
+
- `boostThreshold`: 0.7
|
|
144
|
+
- `prefixLength`: 4
|
|
145
|
+
|
|
146
|
+
### 5. データ形式
|
|
147
|
+
|
|
148
|
+
#### `data/meisi.json`, `data/dousi.json`
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"00": ["単語1", "単語2", ...],
|
|
152
|
+
"01": [...],
|
|
153
|
+
...
|
|
154
|
+
"FF": [...]
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
- キー: 2桁16進数(00~FF、256種類)
|
|
158
|
+
- 値: その16進数に対応する単語のリスト
|
|
159
|
+
|
|
160
|
+
## 開発ガイドライン
|
|
161
|
+
|
|
162
|
+
### コーディング規約
|
|
163
|
+
- ES Modules(`import`/`export`)を使用
|
|
164
|
+
- 非同期処理は`async`/`await`
|
|
165
|
+
- 関数型プログラミングスタイル(`map`, `filter`, `reduce`多用)
|
|
166
|
+
- Unicode正規表現(`\p{scx=Han}`など)を積極的に使用
|
|
167
|
+
|
|
168
|
+
### テスト
|
|
169
|
+
```bash
|
|
170
|
+
npm test # Jestで単体テスト実行
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
テストファイル: `__tests__/*.js`
|
|
174
|
+
|
|
175
|
+
### ビルド・実行
|
|
176
|
+
```bash
|
|
177
|
+
# 開発モード(エンコード)
|
|
178
|
+
npm run dev unko
|
|
179
|
+
|
|
180
|
+
# 開発モード(デコード)
|
|
181
|
+
echo "呪文" | npm run dev -- -d
|
|
182
|
+
|
|
183
|
+
# 誤字修正付きデコード
|
|
184
|
+
echo "呪文" | npm run dev -- -d -s
|
|
185
|
+
|
|
186
|
+
# Levenshteinアルゴリズム使用
|
|
187
|
+
echo "呪文" | npm run dev -- -d -s --levenshtein
|
|
188
|
+
|
|
189
|
+
# デバッグ出力
|
|
190
|
+
echo "呪文" | npm run dev -- -d -s -vv
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### 辞書データ更新
|
|
194
|
+
```bash
|
|
195
|
+
# meisi.jsonを再生成
|
|
196
|
+
./raw_data/meisi_json_generator
|
|
197
|
+
|
|
198
|
+
# dousi.jsonの生成
|
|
199
|
+
./raw_data/json_generator
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### ベンチマーク
|
|
203
|
+
```bash
|
|
204
|
+
# 全アルゴリズム比較 + レポート生成(デフォルト)
|
|
205
|
+
npm run benchmark
|
|
206
|
+
|
|
207
|
+
# 単一アルゴリズムのテスト
|
|
208
|
+
npm run benchmark:single [algorithm]
|
|
209
|
+
|
|
210
|
+
# 全アルゴリズムの比較(レポートなし)
|
|
211
|
+
npm run benchmark:compare
|
|
212
|
+
|
|
213
|
+
# レポート生成のみ(既存のサマリーから)
|
|
214
|
+
npm run benchmark:report
|
|
215
|
+
|
|
216
|
+
# 最新結果を収集してレポート生成
|
|
217
|
+
npm run benchmark:report:latest
|
|
218
|
+
|
|
219
|
+
# ChatGPT APIを使用したテスト(上位50件、デフォルト: gpt-5-mini)
|
|
220
|
+
export OPENAI_API_KEY="sk-..."
|
|
221
|
+
npm run benchmark:chatgpt
|
|
222
|
+
npm run benchmark:chatgpt -- --model gpt-5 --limit 30
|
|
223
|
+
npm run benchmark:chatgpt -- --model gpt-5-nano --limit 100
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**注意**: ChatGPTの結果は`chatgpt/{model}/`ディレクトリにモデル別に保存されます。レポート生成時に各モデルの最新結果が自動的に集計され、比較レポートに表示されます。
|
|
227
|
+
|
|
228
|
+
## よくある変更タスク
|
|
229
|
+
|
|
230
|
+
### 1. 新しい名詞・動詞を追加
|
|
231
|
+
- `raw_data/spell.txt`を編集
|
|
232
|
+
- `npm run json-generate`で再生成
|
|
233
|
+
- テストで動作確認
|
|
234
|
+
|
|
235
|
+
### 2. 誤字修正アルゴリズムの調整
|
|
236
|
+
- `src/jaro-winkler.js`のパラメータ調整
|
|
237
|
+
- または`src/typo-correction.js`の閾値調整
|
|
238
|
+
- `__tests__/typo-correction.js`でテスト
|
|
239
|
+
|
|
240
|
+
### 3. 新しい類似度アルゴリズムの追加
|
|
241
|
+
- `src/typo-correction.js`の`calculateSimilarity()`に条件分岐追加
|
|
242
|
+
- `src/cli.js`にコマンドラインオプション追加
|
|
243
|
+
- テストケース追加
|
|
244
|
+
|
|
245
|
+
### 4. 暗号化方式の変更
|
|
246
|
+
- `src/machine-encrypt.js`を編集
|
|
247
|
+
- エンコード/デコード両方で一貫性を保つ
|
|
248
|
+
- バージョン互換性に注意
|
|
249
|
+
|
|
250
|
+
### 5. ベンチマークデータの追加
|
|
251
|
+
- `benchmark/magi_ocr_data/dataset.tsv`にテストケースを追加
|
|
252
|
+
- TSV形式: `id`, `ocr_result`, `expected`, `description`, `image_file`
|
|
253
|
+
- `npm run benchmark:compare`で全アルゴリズムの精度を測定
|
|
254
|
+
|
|
255
|
+
## デバッグ Tips
|
|
256
|
+
|
|
257
|
+
### 形態素解析の確認
|
|
258
|
+
```javascript
|
|
259
|
+
// typo-correction.jsのexec()内
|
|
260
|
+
if (option.Vv === true) {
|
|
261
|
+
console.log('ntokens', ntokens); // 形態素リスト表示
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### 類似度スコアの確認
|
|
266
|
+
```bash
|
|
267
|
+
echo "罹刹に烙印を秘術を帰ら。" | npm run dev -- -d -s -vv
|
|
268
|
+
# → アルゴリズム名、類似度スコア、候補単語数を表示
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### 辞書マッチング確認
|
|
272
|
+
```javascript
|
|
273
|
+
// index.jsのdecode()内
|
|
274
|
+
console.log('decodeHash', Object.keys(decodeHash).length); // 辞書サイズ
|
|
275
|
+
console.log('textCodeList', textCodeList); // マッチした単語リスト
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## 依存関係
|
|
279
|
+
|
|
280
|
+
### 重要な外部ライブラリ
|
|
281
|
+
- **kuromoji**: 日本語形態素解析(辞書: yukidic)
|
|
282
|
+
- **yukidic**: カスタム形態素解析辞書(git submodule)
|
|
283
|
+
- **fastest-levenshtein**: 高速Levenshtein距離計算
|
|
284
|
+
- **natural**: TF-IDF計算(NLP)
|
|
285
|
+
- **commander**: CLIフレームワーク
|
|
286
|
+
- **picocolors**: ターミナル色付け
|
|
287
|
+
|
|
288
|
+
### インストール時の注意
|
|
289
|
+
```bash
|
|
290
|
+
npm install
|
|
291
|
+
# → postinstallでyukidicをgit cloneする
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## パフォーマンス考慮事項
|
|
295
|
+
|
|
296
|
+
### ボトルネック
|
|
297
|
+
1. **kuromoji初期化**: 初回起動時に辞書読み込みが発生
|
|
298
|
+
2. **形態素解析**: 長文のデコード時に時間がかかる
|
|
299
|
+
3. **類似度計算**: 辞書サイズ×未知語数に比例
|
|
300
|
+
|
|
301
|
+
### 最適化ポイント
|
|
302
|
+
- kuromojiのtokenizerをキャッシュ(`typo-correction.js`でモジュールスコープ変数)
|
|
303
|
+
- `fastest-levenshtein`を使用(C++バインディングで高速)
|
|
304
|
+
- 正規表現を事前コンパイル
|
|
305
|
+
|
|
306
|
+
## セキュリティ考慮事項
|
|
307
|
+
|
|
308
|
+
### 制限事項
|
|
309
|
+
- **暗号学的に安全ではない**: 暗号化は難読化目的のみ
|
|
310
|
+
- **既知平文攻撃に弱い**: 辞書が公開されているため
|
|
311
|
+
- **機密情報の保護には使用しない**
|
|
312
|
+
|
|
313
|
+
### 適切な用途
|
|
314
|
+
- ✅ テキストの難読化・遊び
|
|
315
|
+
- ✅ データのエンコード(可逆圧縮的用途)
|
|
316
|
+
- ❌ パスワード保存
|
|
317
|
+
- ❌ 暗号通信
|
|
318
|
+
|
|
319
|
+
## トラブルシューティング
|
|
320
|
+
|
|
321
|
+
### 問題: デコードが失敗する
|
|
322
|
+
- 誤字修正モード(`-s`)を試す
|
|
323
|
+
- `-vv`オプションで詳細ログを確認
|
|
324
|
+
- 辞書に単語が存在するか確認
|
|
325
|
+
|
|
326
|
+
### 問題: 形態素解析エラー
|
|
327
|
+
- `yukidic`辞書が正しくインストールされているか確認
|
|
328
|
+
- `npm install`を再実行
|
|
329
|
+
|
|
330
|
+
### 問題: テストが失敗する
|
|
331
|
+
- Node.jsバージョン確認(>=12.22.8)
|
|
332
|
+
- `NODE_OPTIONS=--experimental-vm-modules jest`が必要
|
|
333
|
+
|
|
334
|
+
## レビュー・コミットガイドライン
|
|
335
|
+
|
|
336
|
+
### レビュー時のチェックポイント
|
|
337
|
+
- エンコード/デコードの一貫性が保たれているか
|
|
338
|
+
- 既存の呪文がデコード可能か(後方互換性)
|
|
339
|
+
- ユニットテストが追加/更新されているか
|
|
340
|
+
- パフォーマンスへの影響
|
|
341
|
+
- 日本語のドキュメント・コメントが適切か
|
|
342
|
+
|
|
343
|
+
### コミットメッセージ
|
|
344
|
+
**Conventional Commits形式**で記載すること。semantic-releaseによる自動バージョニングに使用される。
|
|
345
|
+
|
|
346
|
+
フォーマット: `種別: 簡潔な説明`(日本語の説明を推奨)
|
|
347
|
+
|
|
348
|
+
種別とリリースへの影響:
|
|
349
|
+
- `feat`: 新機能追加 → **マイナー**リリース(例: 1.0.0 → 1.1.0)
|
|
350
|
+
- `fix`: バグ修正 → **パッチ**リリース(例: 1.0.0 → 1.0.1)
|
|
351
|
+
- `perf`: パフォーマンス改善 → **パッチ**リリース
|
|
352
|
+
- `refactor`: コード整理 → **パッチ**リリース
|
|
353
|
+
- `revert`: 変更の取り消し → **パッチ**リリース
|
|
354
|
+
- `test`: テスト追加/修正 → リリースなし
|
|
355
|
+
- `docs`: ドキュメント更新 → リリースなし
|
|
356
|
+
- `chore`: その他の変更 → リリースなし
|
|
357
|
+
- `ci`: CI設定の変更 → リリースなし
|
|
358
|
+
- `deps`: 依存関係の更新 → リリースなし
|
|
359
|
+
|
|
360
|
+
破壊的変更がある場合はフッターに`BREAKING CHANGE:`を記載 → **メジャー**リリース
|
|
361
|
+
|
|
362
|
+
例:
|
|
363
|
+
```
|
|
364
|
+
feat: Levenshtein距離アルゴリズムを追加
|
|
365
|
+
fix: デコード時の形態素解析エラーを修正
|
|
366
|
+
docs: 誤字修正アルゴリズムの使い方を追加
|
|
367
|
+
refactor: 類似度計算処理を関数化
|
|
368
|
+
test: typo-correctionのテストケースを追加
|
|
369
|
+
|
|
370
|
+
feat: 暗号化方式を変更
|
|
371
|
+
|
|
372
|
+
BREAKING CHANGE: 既存の呪文との互換性がなくなります
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
**注意**: commitlint + huskyにより、ローカルでのコミット時にメッセージ形式がバリデーションされる。形式に沿わないコミットは拒否される。
|
|
376
|
+
|
|
377
|
+
### リリースフロー
|
|
378
|
+
|
|
379
|
+
バージョン管理とnpm公開はsemantic-releaseにより完全自動化されている。
|
|
380
|
+
|
|
381
|
+
1. 開発者がブランチで作業し、Conventional Commits形式でコミット
|
|
382
|
+
2. PRを作成すると、GitHub Actionsがdry-runでバージョン予告をPRにコメント
|
|
383
|
+
3. PRをmasterにマージすると、semantic-releaseが自動的に:
|
|
384
|
+
- コミットメッセージからバージョンを決定
|
|
385
|
+
- `package.json`のバージョンを更新
|
|
386
|
+
- `CHANGELOG.md`を生成
|
|
387
|
+
- Gitタグを作成
|
|
388
|
+
- npmに公開
|
|
389
|
+
- GitHubリリースを作成
|
|
390
|
+
|
|
391
|
+
**手動でのバージョン変更やタグ作成は不要。**
|
|
392
|
+
|
|
393
|
+
## ベンチマーク機能
|
|
394
|
+
|
|
395
|
+
### 概要
|
|
396
|
+
|
|
397
|
+
`benchmark/`ディレクトリには、誤字修正機能の精度を測定するためのテストデータとスクリプトが含まれています。
|
|
398
|
+
|
|
399
|
+
### データソース
|
|
400
|
+
|
|
401
|
+
- **Magi OCRデータ**: [Chantプロジェクト](https://github.com/xztaityozx/Chant)から取得したOCRテストデータ
|
|
402
|
+
- 画像に書かれた呪文をOCRで読み取った結果と正解データのペア
|
|
403
|
+
- yukichantの誤字修正機能の精度評価に使用
|
|
404
|
+
|
|
405
|
+
### ディレクトリ構造
|
|
406
|
+
|
|
407
|
+
```
|
|
408
|
+
benchmark/
|
|
409
|
+
├── magi_ocr_data/ # Magiプロジェクトから取得したOCRテストデータ
|
|
410
|
+
│ ├── dataset.tsv # テストデータ(TSV形式)
|
|
411
|
+
│ └── images/ # OCR元画像(オプション)
|
|
412
|
+
├── results/ # 検証結果の保存先(.gitignore対象)
|
|
413
|
+
│ ├── jaro-winkler/ # Jaro-Winklerアルゴリズムの結果
|
|
414
|
+
│ ├── levenshtein/ # Levenshteinアルゴリズムの結果
|
|
415
|
+
│ ├── tfidf/ # TF-IDF使用時の結果
|
|
416
|
+
│ ├── tfidf-levenshtein/ # TF-IDF + Levenshteinの結果
|
|
417
|
+
│ ├── chatgpt/ # ChatGPT APIを使用した結果(モデル別)
|
|
418
|
+
│ │ ├── gpt-5/ # GPT-5の結果
|
|
419
|
+
│ │ ├── gpt-5-mini/ # GPT-5-miniの結果
|
|
420
|
+
│ │ └── gpt-5-nano/ # GPT-5-nanoの結果
|
|
421
|
+
│ └── summary/ # 全体サマリー
|
|
422
|
+
└── scripts/ # ベンチマーク実行スクリプト
|
|
423
|
+
├── run-accuracy-test.js # 単一アルゴリズムのテスト
|
|
424
|
+
├── compare-algorithms.js # 全アルゴリズムの比較
|
|
425
|
+
├── generate-report.js # レポート生成
|
|
426
|
+
├── run-chatgpt-test.js # ChatGPT APIテスト
|
|
427
|
+
├── prompt-template.txt # ChatGPT用プロンプトテンプレート
|
|
428
|
+
└── README_CHATGPT.md # ChatGPTテストの詳細ドキュメント
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### データフォーマット
|
|
432
|
+
|
|
433
|
+
#### 入力データ(dataset.tsv)
|
|
434
|
+
```tsv
|
|
435
|
+
id ocr_result expected description image_file
|
|
436
|
+
001 罹刹に烙印を秘術を帰ら。 羅刹に烙印を秘術を刻ら。 漢字の誤認識(罹→羅、帰→刻) test001.png
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
#### 検証結果(results/{algorithm}/YYYYMMDD_HHMMSS_result.tsv)
|
|
440
|
+
```tsv
|
|
441
|
+
id input expected corrected is_correct algorithm options execution_time_ms
|
|
442
|
+
001 罹刹に烙印を秘術を帰ら。 羅刹に烙印を秘術を刻ら。 羅刹に烙印を秘術を刻ら。 true jaro-winkler {"is_tfidf":false} 45.2
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### 使用方法
|
|
446
|
+
|
|
447
|
+
```bash
|
|
448
|
+
# 全アルゴリズム比較 + レポート生成(デフォルト)
|
|
449
|
+
npm run benchmark
|
|
450
|
+
|
|
451
|
+
# 単一アルゴリズムのテスト
|
|
452
|
+
npm run benchmark:single [algorithm]
|
|
453
|
+
|
|
454
|
+
# 全アルゴリズムの比較(レポートなし)
|
|
455
|
+
npm run benchmark:compare
|
|
456
|
+
|
|
457
|
+
# レポート生成のみ(精度順にソート、最速・バランス推奨を表示)
|
|
458
|
+
npm run benchmark:report
|
|
459
|
+
|
|
460
|
+
# ChatGPT APIを使用したテスト(上位50件、コスト削減のため)
|
|
461
|
+
export OPENAI_API_KEY="sk-..."
|
|
462
|
+
npm run benchmark:chatgpt
|
|
463
|
+
npm run benchmark:chatgpt -- --model gpt-5 --limit 30
|
|
464
|
+
npm run benchmark:chatgpt -- --model gpt-5-nano --limit 100
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
**注意**: ChatGPTの結果は`chatgpt/{model}/`ディレクトリにモデル別に保存されます。レポート生成時に各モデルの最新結果が自動的に集計され、比較レポートに表示されます。
|
|
468
|
+
|
|
469
|
+
### ChatGPT APIテスト
|
|
470
|
+
|
|
471
|
+
ChatGPT APIを使用したプロンプトベースの誤字修正テストも利用可能です。
|
|
472
|
+
|
|
473
|
+
**特徴**:
|
|
474
|
+
- プロンプトテンプレートをカスタマイズ可能(`benchmark/scripts/prompt-template.txt`)
|
|
475
|
+
- 予算の都合上、デフォルトで上位50件のみテスト
|
|
476
|
+
- 複数のモデル(gpt-5-nano, gpt-5-mini, gpt-5)をサポート
|
|
477
|
+
- 結果は他のアルゴリズムと同様にサマリーに統合される
|
|
478
|
+
|
|
479
|
+
**詳細**: `benchmark/scripts/README_CHATGPT.md` を参照
|
|
480
|
+
|
|
481
|
+
### 精度指標
|
|
482
|
+
|
|
483
|
+
- **正解率(Accuracy)**: 完全一致した割合
|
|
484
|
+
- **平均実行時間**: 1件あたりの平均処理時間(ミリ秒)
|
|
485
|
+
|
|
486
|
+
### ベンチマーク結果の活用
|
|
487
|
+
|
|
488
|
+
1. **アルゴリズムの比較**: 各アルゴリズムの精度と速度を比較
|
|
489
|
+
2. **パラメータ調整**: アルゴリズムのパラメータを調整して精度向上
|
|
490
|
+
3. **リグレッションテスト**: コード変更後の精度低下を検出
|
|
491
|
+
4. **デフォルトアルゴリズムの選定**: 最適なアルゴリズムを選択
|
|
492
|
+
|
|
493
|
+
## 参考リンク
|
|
494
|
+
|
|
495
|
+
- [kuromoji.js](https://github.com/takuyaa/kuromoji.js)
|
|
496
|
+
- [yukidic辞書](https://github.com/amanoese/yukidic)
|
|
497
|
+
- [Jaro-Winkler距離](https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance)
|
|
498
|
+
- [Levenshtein距離](https://en.wikipedia.org/wiki/Levenshtein_distance)
|
|
499
|
+
- [Enigma暗号機](https://en.wikipedia.org/wiki/Enigma_machine)
|
|
500
|
+
- [Chantプロジェクト(Magi)](https://github.com/xztaityozx/Chant) - OCRテストデータの出典
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
**このドキュメントは、AIエージェントがプロジェクトを理解し、コンテキストに沿った提案を行うためのガイドです。人間の開発者が読む場合は、まず[README.md](./README.md)と[develop.md](./doc/develop.md)を参照してください。**
|
|
505
|
+
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
## [4.0.0](https://github.com/amanoese/yukichant/compare/v3.0.5...v4.0.0) (2026-02-28)
|
|
2
|
+
|
|
3
|
+
### ⚠ BREAKING CHANGES
|
|
4
|
+
|
|
5
|
+
* Node.js 18.x以前のサポートを廃止。
|
|
6
|
+
Node.js 20.x以上が必須になりました。
|
|
7
|
+
エントリポイントの構造が変更されています。
|
|
8
|
+
|
|
9
|
+
Made-with: Cursor
|
|
10
|
+
* Node.js 18.x以前はサポート対象外になります
|
|
11
|
+
|
|
12
|
+
Made-with: Cursor
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
* Add Jaro-Winkler algorithm support for typo correction ([4a5c9fa](https://github.com/amanoese/yukichant/commit/4a5c9faec266bdce66a9f9f5d75906ad53035a4c))
|
|
17
|
+
* v4.0.0リリース(破壊的変更の明示) ([598a4ad](https://github.com/amanoese/yukichant/commit/598a4ad452c7feb08405f7b7421b4dfdaa06f024))
|
|
18
|
+
* サポートNode.jsバージョンを20.x以上に更新 ([6615716](https://github.com/amanoese/yukichant/commit/66157167273b902276fbfdba8cde89ac2eeef9c1))
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
* BREAKING CHANGEがmajorリリースになるよう修正 ([87f8b62](https://github.com/amanoese/yukichant/commit/87f8b626bcd071ae4dbfc4c6677c48ec200b4c8a))
|
|
23
|
+
* ci環境でcommitlintフックをスキップするように修正 ([3f7c8ee](https://github.com/amanoese/yukichant/commit/3f7c8ee56507c3251bfb9cbb2bd7ccdfc32fbf35))
|
|
24
|
+
* dry-run実行時の環境変数を上書きしてブランチ認識を修正 ([49760c7](https://github.com/amanoese/yukichant/commit/49760c7fee5b9b56b6c2301f2b0f6acf5195f494))
|
|
25
|
+
* リリースプレビューで--branches masterを指定してブランチ認識を修正 ([4ea4ee3](https://github.com/amanoese/yukichant/commit/4ea4ee3fa467e8c2d1df5fd3617436be658147df))
|
|
26
|
+
* リリースプレビューにnpmトークン検証を追加 ([2085fb9](https://github.com/amanoese/yukichant/commit/2085fb9cb703d6108bb4da79017b4a31f5ce7f45))
|
|
27
|
+
* リリースプレビューのdry-run失敗とコメント表示を修正 ([358b05d](https://github.com/amanoese/yukichant/commit/358b05df2228af59384eeb32e94c6267831046e1))
|
|
28
|
+
* リリースプレビューのシェル互換性を修正 ([11d8a9d](https://github.com/amanoese/yukichant/commit/11d8a9d50b1bd13039cf79cf3b1401a39d9c5970))
|
|
29
|
+
* リリースプレビューをmasterシミュレートで実行し、コメント差分時のみ追加する方式に変更 ([559514e](https://github.com/amanoese/yukichant/commit/559514eda5b7927a9da50dce03d4404c5b5f4786))
|
|
30
|
+
* リリースプレビューをコミットメッセージ直接解析方式に変更 ([2383828](https://github.com/amanoese/yukichant/commit/2383828043248252f39a4358a4f2b0a15946f1cf))
|
|
31
|
+
|
|
32
|
+
## [3.1.0](https://github.com/amanoese/yukichant/compare/v3.0.5...v3.1.0) (2026-02-28)
|
|
33
|
+
|
|
34
|
+
### ⚠ BREAKING CHANGES
|
|
35
|
+
|
|
36
|
+
* Node.js 18.x以前のサポートを廃止。
|
|
37
|
+
Node.js 20.x以上が必須になりました。
|
|
38
|
+
エントリポイントの構造が変更されています。
|
|
39
|
+
|
|
40
|
+
Made-with: Cursor
|
|
41
|
+
* Node.js 18.x以前はサポート対象外になります
|
|
42
|
+
|
|
43
|
+
Made-with: Cursor
|
|
44
|
+
|
|
45
|
+
### Features
|
|
46
|
+
|
|
47
|
+
* Add Jaro-Winkler algorithm support for typo correction ([4a5c9fa](https://github.com/amanoese/yukichant/commit/4a5c9faec266bdce66a9f9f5d75906ad53035a4c))
|
|
48
|
+
* v4.0.0リリース(破壊的変更の明示) ([598a4ad](https://github.com/amanoese/yukichant/commit/598a4ad452c7feb08405f7b7421b4dfdaa06f024))
|
|
49
|
+
* サポートNode.jsバージョンを20.x以上に更新 ([6615716](https://github.com/amanoese/yukichant/commit/66157167273b902276fbfdba8cde89ac2eeef9c1))
|
|
50
|
+
|
|
51
|
+
### Bug Fixes
|
|
52
|
+
|
|
53
|
+
* ci環境でcommitlintフックをスキップするように修正 ([3f7c8ee](https://github.com/amanoese/yukichant/commit/3f7c8ee56507c3251bfb9cbb2bd7ccdfc32fbf35))
|
|
54
|
+
* dry-run実行時の環境変数を上書きしてブランチ認識を修正 ([49760c7](https://github.com/amanoese/yukichant/commit/49760c7fee5b9b56b6c2301f2b0f6acf5195f494))
|
|
55
|
+
* リリースプレビューで--branches masterを指定してブランチ認識を修正 ([4ea4ee3](https://github.com/amanoese/yukichant/commit/4ea4ee3fa467e8c2d1df5fd3617436be658147df))
|
|
56
|
+
* リリースプレビューにnpmトークン検証を追加 ([2085fb9](https://github.com/amanoese/yukichant/commit/2085fb9cb703d6108bb4da79017b4a31f5ce7f45))
|
|
57
|
+
* リリースプレビューのdry-run失敗とコメント表示を修正 ([358b05d](https://github.com/amanoese/yukichant/commit/358b05df2228af59384eeb32e94c6267831046e1))
|
|
58
|
+
* リリースプレビューのシェル互換性を修正 ([11d8a9d](https://github.com/amanoese/yukichant/commit/11d8a9d50b1bd13039cf79cf3b1401a39d9c5970))
|
|
59
|
+
* リリースプレビューをmasterシミュレートで実行し、コメント差分時のみ追加する方式に変更 ([559514e](https://github.com/amanoese/yukichant/commit/559514eda5b7927a9da50dce03d4404c5b5f4786))
|
|
60
|
+
* リリースプレビューをコミットメッセージ直接解析方式に変更 ([2383828](https://github.com/amanoese/yukichant/commit/2383828043248252f39a4358a4f2b0a15946f1cf))
|
|
61
|
+
|
|
62
|
+
## [3.1.0](https://github.com/amanoese/yukichant/compare/v3.0.5...v3.1.0) (2026-02-28)
|
|
63
|
+
|
|
64
|
+
### ⚠ BREAKING CHANGES
|
|
65
|
+
|
|
66
|
+
* Node.js 18.x以前はサポート対象外になります
|
|
67
|
+
|
|
68
|
+
Made-with: Cursor
|
|
69
|
+
|
|
70
|
+
### Features
|
|
71
|
+
|
|
72
|
+
* Add Jaro-Winkler algorithm support for typo correction ([4a5c9fa](https://github.com/amanoese/yukichant/commit/4a5c9faec266bdce66a9f9f5d75906ad53035a4c))
|
|
73
|
+
* サポートNode.jsバージョンを20.x以上に更新 ([6615716](https://github.com/amanoese/yukichant/commit/66157167273b902276fbfdba8cde89ac2eeef9c1))
|
|
74
|
+
|
|
75
|
+
### Bug Fixes
|
|
76
|
+
|
|
77
|
+
* ci環境でcommitlintフックをスキップするように修正 ([3f7c8ee](https://github.com/amanoese/yukichant/commit/3f7c8ee56507c3251bfb9cbb2bd7ccdfc32fbf35))
|
|
78
|
+
* dry-run実行時の環境変数を上書きしてブランチ認識を修正 ([49760c7](https://github.com/amanoese/yukichant/commit/49760c7fee5b9b56b6c2301f2b0f6acf5195f494))
|
|
79
|
+
* リリースプレビューで--branches masterを指定してブランチ認識を修正 ([4ea4ee3](https://github.com/amanoese/yukichant/commit/4ea4ee3fa467e8c2d1df5fd3617436be658147df))
|
|
80
|
+
* リリースプレビューにnpmトークン検証を追加 ([2085fb9](https://github.com/amanoese/yukichant/commit/2085fb9cb703d6108bb4da79017b4a31f5ce7f45))
|
|
81
|
+
* リリースプレビューのdry-run失敗とコメント表示を修正 ([358b05d](https://github.com/amanoese/yukichant/commit/358b05df2228af59384eeb32e94c6267831046e1))
|
|
82
|
+
* リリースプレビューのシェル互換性を修正 ([11d8a9d](https://github.com/amanoese/yukichant/commit/11d8a9d50b1bd13039cf79cf3b1401a39d9c5970))
|
|
83
|
+
* リリースプレビューをmasterシミュレートで実行し、コメント差分時のみ追加する方式に変更 ([559514e](https://github.com/amanoese/yukichant/commit/559514eda5b7927a9da50dce03d4404c5b5f4786))
|
|
84
|
+
* リリースプレビューをコミットメッセージ直接解析方式に変更 ([2383828](https://github.com/amanoese/yukichant/commit/2383828043248252f39a4358a4f2b0a15946f1cf))
|