刑法や地方自治法等の条文の機械学習をAIがしてくれないのは、Ngramのベクトル化の影響なのか定かでないが、とりあえず条文の漢数字を変換するプログラムを作成しナレッジベースにぶち込むことにしました。
phpの漢数字変換プログラム:kanjinum.phpは以下。
(Usage:php kanjinum.php 刑法.html > 刑法_漢数字変換.html)
<?php
if (!function_exists('mb_str_split')) {
function mb_str_split($string, $length = 1, $encoding = 'UTF-8') {
$result = [];
$strlen = mb_strlen($string, $encoding);
for ($i = 0; $i < $strlen; $i += $length) {
$result[] = mb_substr($string, $i, $length, $encoding);
}
return $result;
}
}
// 漢数字 → 数字変換関数(簡易版)
function kanjiToNumber($kanji) {
$nums = ['〇'=>0, '一'=>1, '二'=>2, '三'=>3, '四'=>4, '五'=>5, '六'=>6, '七'=>7, '八'=>8, '九'=>9];
$units = ['十'=>10, '百'=>100, '千'=>1000];
$largeUnits = ['万'=>10000, '億'=>100000000];
// mb_str_split の代替
if (!function_exists('mb_str_split')) {
function mb_str_split($string, $length = 1, $encoding = 'UTF-8') {
$result = [];
$strlen = mb_strlen($string, $encoding);
for ($i = 0; $i < $strlen; $i += $length) {
$result[] = mb_substr($string, $i, $length, $encoding);
}
return $result;
}
}
$chars = mb_str_split($kanji);
$result = 0;
$section = 0;
$number = 0;
foreach ($chars as $char) {
if (isset($nums[$char])) {
$number = $nums[$char];
} elseif (isset($units[$char])) {
$unit = $units[$char];
if ($number === 0) $number = 1;
$section += $number * $unit;
$number = 0;
} elseif (isset($largeUnits[$char])) {
$unit = $largeUnits[$char];
if ($number === 0 && $section === 0) $section = 1;
$result += ($section + $number) * $unit;
$section = 0;
$number = 0;
} else {
// 未知の文字は無視
}
}
$result += $section + $number;
return $result;
}
// コマンドライン引数からファイルパス取得
if ($argc < 2) {
fwrite(STDERR, "Usage: php convert.php \n");
exit(1);
}
$filePath = $argv[1];
// ファイル存在チェック
if (!file_exists($filePath)) {
fwrite(STDERR, "Error: File not found - $filePath\n");
exit(1);
}
// HTMLファイル読み込み
$html = file_get_contents($filePath);
// 漢数字を検出して変換
$convertedHtml = preg_replace_callback('/[〇一二三四五六七八九十百千万]+/u', function($matches) {
return kanjiToNumber($matches[0]);
}, $html);
// 標準出力に表示
echo $convertedHtml;
?>