在原版词典上自动插入中文内容的方法

有好几本词典都是有准确的原版文本,但是中文版是OCR得到的,对不同来源文本进行比较然后插入到原版文本可以节省不少校对和结构化的时间。
虽然最直接的方法是把中文版文本解析,然后形成语法树再和原文版对比插入,但实际要处理各种规则不统一,而且要和原版结构一致才能方便比较,比较麻烦。
我想了个反向的方法,就是去掉原版文本的格式然后再比较,但是还能再还原格式标记的方法。就是把文本分为原文和编辑操作符列表两部分,编辑操作符为插入,删除,替换三种,对当前文本逐步应用操作符就能还原文本。 然后数据结构支持三种可逆操作和三种不可逆操作,可逆操作可以修改文本,但同时插入逆向操作符,不可逆操作修改文本后更新操作符。
另外对html标签特殊处理,保存一个位置列表,这样可以在去掉标签的文本后仍然能查询每个字符在原文本的位置。
有了这个数据结构就可以把文本去除格式然后比较,然后得到另一组操作符,也是插入,删除和替换(这个是python标准库SequenceMatcher自带的功能。 然后删除操作就是原文多出来的内容,插入操作就是需要插入的文本,替换操作比较麻烦,需要具体分析,可能是OCR错误或者是需要插入的地方错位了。
把这个想法让AI实现了一遍,然后只处理插入的情况。
代码:
extractable_text.py (25.4 KB)

测试样例:

日汉双解词典

原文:

<link rel="stylesheet" href="HYOKOKU8.css" /><div id="id_00000008" class="item item_ippan"><div class="head"><span class="head_kana">アーケード</span><span class="head_gen"><span class="ka_gen">〔</span><span class="lang">英</span>arcade<span class="ka_gen">〕</span></span></div><div class="mean_normal"><span class="pos"><span class="ka_pos_s">(</span>名<span class="ka_pos_e">)</span></span></div><div class="mean_lv_2 mean_no_1">❶半円形の屋根のある通路。</div><div class="mean_lv_2 
mean_no_2">❷商店街などで、屋根のようなおおいのある通路。また、その屋根のようなおおい。</div><img id="id_0003" class="img_sashie" src="media/01-01.png"/></div>

显示效果:

アーケードarcade
❶半円形の屋根のある通路。
❷商店街などで、屋根のようなおおいのある通路。また、その屋根のようなおおい。

中文: アーケード③①(名)❶半円形の屋根のある通路。/拱廊。连拱廊。❷商店街などで、屋根のようなおおいの ある道路。また、その屋根のようなおおい。/拱廊街(有拱顶的商店街)。拱形棚。▷英arcade
去格式原文: アーケード〔英arcade〕(名)❶半円形の屋根のある通路。❷商店街などで、屋根のようなおおいのある通路。また、その屋根のようなおおい。

差异比较:
replace [5, 15]〔英arcade〕( → ③①(
replace [16, 17]) → )
insert [29] → 。/拱廊。连拱廊
replace [50, 51]通 → 道
insert [68] → /拱廊街(有拱顶的商店街)。拱形棚。▷英arcade

插入后:

<link rel="stylesheet" href="HYOKOKU8.css" /><div id="id_00000008" class="item item_ippan"><div class="head"><span class="head_kana">アーケード</span><span class="head_gen"><span class="ka_gen">〔</span><span class="lang">英</span>arcade<span class="ka_gen">〕</span></span></div><div class="mean_normal"><span class="pos"><span class="ka_pos_s">(</span>名<span class="ka_pos_e">)</span></span></div><div class="mean_lv_2 mean_no_1">❶半円形の屋根のある通路。/拱廊。连拱廊。</div><div class="mean_lv_2 mean_no_2">❷商店街などで、屋根のようなおおいのある通路。また、その屋根のようなおお 
い。/拱廊街(有拱顶的商店街)。拱形棚。▷英arcade</div><img id="id_0003" class="img_sashie" src="media/01-01.png"/></div>
アーケードarcade
❶半円形の屋根のある通路。/拱廊。连拱廊。
❷商店街などで、屋根のようなおおいのある通路。また、その屋根のようなおお い。/拱廊街(有拱顶的商店街)。拱形棚。▷英arcade

罗贝尔法语词典

注意这个解释是没有原文的,不考虑替换的话实际只能插入例句,需要特殊处理。
原文:

<word>A</word> <pron>[ɑ]</pron> <pos>n. m.</pos> <def><num> 1.</num> LE A ou L'A : la première lettre de l'alphabet du français. Le a est une voyelle. Le mot « autre » commence par un a.</def> <def><num> 2.</num> De A à Z [dəɑazɛd], du début à la fin. Il faut prouver par A+B [ɑplysbe] ce que vous affirmez, prouver avec précision.</def><rem>REM. On prononce aussi [a].</rem>

去格式原文: A [ɑ] n. m. 1. LE A ou L’A : la première lettre de l’alphabet du français. Le a est une voyelle. Le mot « autre » commence par un a. 2. De A à Z [dəɑazɛd], du début à la fin. Il faut
prouver par A+B [ɑplysbe] ce que vous affirmez, prouver avec précision.REM. On prononce aussi [a].
中文: a[a] n. m.❶法语字母表第1个字母: Le a est une voyelle.字母a是元音。 Le mot《 autre》 com-mence par un a.单词“autre”由“a”开始。❷de AàZ[dəaazed]从头到尾,自始至终: Il faut prouverpar A+B[aplysbe] ce que vous affirmez.应确切证明您所确认的事。

差异比较:
replace [0, 2]A → a
replace [3, 4]ɑ → a
replace [11, 13] → ❶法语字母表第
replace [14, 28]. LE A ou L’A → 个字母
delete [29] la première lettre de l’alphabet du français. →
insert [97] → 字母a是元音。
replace [104, 106] « → 《
replace [112, 114] » → 》
insert [118] → -
replace [133, 139] 2. D → 单词“autre”由“a”开始。❷d
delete [142] →
delete [144] →
delete [146] →
replace [150, 151]ɑ → a
replace [153, 154]ɛ → e
insert [156] → 从头到尾
replace [157, 176] du début à la fin. → 自始至终:
delete [192] →
delete [200] →
replace [202, 203]ɑ → a
delete [231], prouver avec précision →
replace [256, 283]REM. On prononce aussi [a]. → 应确切证明您所确认的事。

插入后:

<word>A</word> <pron>[ɑ]</pron> <pos>n. m.</pos> <def><num> 1.</num> LE A ou L'A : la première lettre de l'alphabet du français. Le a est une voyelle.字母a是元音。 Le mot « autre » com-mence par un a.</def> <def><num> 2.</num> De A à Z [dəɑazɛd]从头到尾, du début à la fin. Il faut prouver par A+B [ɑplysbe] ce que vous affirmez, prouver avec précision.</def><rem>REM. On prononce aussi [a].</rem>

A [ɑ] n. m. 1. LE A ou L’A : la première lettre de l’alphabet du français. Le a est une voyelle.字母a是元音。 Le mot « autre » com-mence par un a. 2. De A à Z [dəɑazɛd]从头到尾, du début à la fin. Il faut prouver par A+B [ɑplysbe] ce que vous affirmez, prouver avec précision.REM. On prononce aussi [a].

朗氏德语词典

原文:

<p style="padding-left:2em;margin:0"><font color="chocolate"><b><font color="blue">A,</font> a</b></font> [a:] <font color="forestgreen"><i>das</i></font>; <font color="forestgreen"><i>-, -/<i class="p"><font color="green">gespr</font></i> auch -s</i></font></p><p style="padding-left:2em;margin:0"><font color="chocolate"><b>1.</b></font> der erste Buchstabe des Alphabets &lt;ein großes 
A; ein kleines a&gt;</p><p style="padding-left:2em;margin:0"><font color="chocolate"><b>2.</b></font> <font color="forestgreen"><i><i class="p"><font color="green">MUS</font></i></i></font>; der sechste Ton der C-Dur-Tonleiter</p><p style="padding-left:2em;margin:0">|| <i class="p"><font color="green">K-:</font></i> <font color="chocolate"><b>A-Dur</b></font>, <font color="chocolate"><b>a-Moll</b></font></p><p style="padding-left:2em;margin:0">|| <i class="p"><font color="green">ID</font></i> <font color="forestgreen"><i><font color="chocolate"><b>das A und O</b></font></i></font> + <font color="forestgreen"><i><i class="p"><font color="green">Gen</font></i><font color="chocolate"><b>/von etwas</b></font></i></font> das Wichtigste; <font color="forestgreen"><i><font color="chocolate"><b>von A bis Z</b></font></i></font> von Anfang bis Ende <i class="p"><font color="green">≈</font></i> gänzlich; <font color="forestgreen"><i><font color="chocolate"><b>Wer A sagt, muss auch B sagen</b></font></i></font> wer eine Sache beginnt, muss sie auch zu Ende bringen</p>

A, a [a:] das; -, -/gespr auch -s

1. der erste Buchstabe des Alphabets <ein großes A; ein kleines a>

2. MUS; der sechste Ton der C-Dur-Tonleiter

|| K-: A-Dur, a-Moll

|| ID das A und O + Gen/von etwas das Wichtigste; von A bis Z von Anfang bis Ende gänzlich; Wer A sagt, muss auch B sagen wer eine Sache beginnt, muss sie auch zu Ende bringen

中文: A, a [a:] das; ,- /gespr auch [口]也用-s 1. der erste Buchstabe des Alphabets,字母表第一个字母〈ein großes A 大写A; ein kleines a 小写a〉 2. MUS【音】; der sechste Ton der C-Dur-Tonleiter C大调音阶的第六个音 || K-(复合): A-Dur, a-Moll || ID [谚] das A und O + Gen(二格)/von etw. das Wichtigste 核心,关键,根本,最重要的事; von A bis Z von Anfang bis Ende 始末,从头到尾,完完全全 ≈ gänzlich; Wer A sagt, muss auch B sagen wer e-e Sache beginnt, muss sie auch zu Ende bringen 凡事开了头,就得干到底,(做事要有始有终)

去格式原文: A, a [a:] das; -, -/gespr auch -s1. der erste Buchstabe des Alphabets <ein großes A; ein kleines a>2. MUS; der sechste Ton der C-Dur-Tonleiter|| K-: A-Dur, a-Moll|| ID das A und O + Gen/von etwas das Wichtigste; von A bis Z von Anfang bis Ende ≈ gänzlich; Wer A sagt, muss auch B sagen wer eine Sache beginnt, muss sie auch zu Ende bringen

差异比较:
replace [15, 19]-, - → ,-
replace [31, 33]-s → [口]也用-s
replace [69, 73] &lt → ,字母表第一个字母〈ein großes A 大写A
delete [74]ein großes A; →
replace [101, 105]> → 小写a〉
insert [111] → 【音】
insert [148] → C大调音阶的第六个音
insert [153] → (复合)
insert [168] →
insert [174] → [谚]
insert [191] → (二格)
replace [199, 201]as → .
insert [216] → 核心,关键,根本,最重要的事
insert [250] → 始末,从头到尾,完完全全
replace [297, 299]in → -
insert [345] → 凡事开了头,就得干到底,(做事要有始有终)

插入后:

A, a [a:] das; -, -/gespr auch -s

1. der erste Buchstabe des Alphabets <ein großes A; ein kleines a>

2. MUS【音】;
der sechste Ton der C-Dur-Tonleiter C大调音阶的第六个音

|| K-(复合): A-Dur, a-Moll

|| ID [谚] das A und O + Gen(二格)/von etwas das Wichtigste 核心,关键,根本,最重要的事; von A bis Z von Anfang bis Ende 始末,从头到尾,完完全全 gänzlich; Wer A sagt, muss auch B sagen wer eine Sache beginnt, muss sie auch zu Ende bringen 凡事开了头,就得干到底,(做事要有始有终)

6 Likes

朗氏德汉相比原版有很多缩写,也能这么干吗?

可以,缩写标记都是替换标记,缩写一般最后得到的指令都是把几个字母替换成.或者-之类的,忽略这些就行。

1 Like

我的处理思路基本相同,只比对两个单词,只有一个的话比对一个。但这个方法中文只能插入到西文文本之后紧跟西文文本,要使用西文文本的标签。

1 Like

不一定要用原标签的,如果在标签边界的话程序是能知道有哪些标签的的,可以插入到外层单独加一个标签。

需要判断插入点是否原文标签内最后一个单词。插在原标签内也可以加标签,不过可能会叠加原标签效果。