我们正在开发一种系统,使用UTF-8,UTF-16和UTF-32 Unicode字符标准对50多种国际语言进行模糊匹配。到目前为止,我们已经能够使用Levenshtein距离来检测德语Unicode扩展字符单词的拼写错误。
我们希望扩展这个系统来处理用Unicode表示的普通话中文表意文字。我们如何在相似的汉字之间进行Levenshtein距离计算?
我们正在开发一种系统,使用UTF-8,UTF-16和UTF-32 Unicode字符标准对50多种国际语言进行模糊匹配。到目前为止,我们已经能够使用Levenshtein距离来检测德语Unicode扩展字符单词的拼写错误。
我们希望扩展这个系统来处理用Unicode表示的普通话中文表意文字。我们如何在相似的汉字之间进行Levenshtein距离计算?
首先,只是为了澄清:汉字并不等同于德语或英语 字。大多数你认为是单词的东西(使用“单词”的语义或句法定义)由1-3个字符组成。通过将Levenshtein距离表示为UCS-2或UCS-4代码点的序列,可以直接将Levenshtein距离应用于这些字符序列。由于大多数单词很短(特别是长度为1或2个字符的单词),但它的用途可能有限。
但是,正如你的问题具体是关于 编辑之间的距离 个性人物,我认为需要采用不同的方法,确实可能非常困难。
首先,您必须将每个字符表示为它所包含的组件/笔画的序列。有两个问题:
有些组件本身甚至更小 组件,所以如何将一个字符分解为“原子”组件并不是唯一定义的。如果你做到了个人的水平 招,你需要描述每一个笔画(角色,形状,方向等位置)。我不认为每个人都这样做(如果有人告诉我,我会感兴趣)。
你需要将笔画或组件放入 订购。明显的候选者是角色的规范笔画顺序,在lexica中有描述,甚至还有带有动画笔画顺序图的字典网站。但是,我所知道的数据源(日语)生成这些动画作为位图图形的序列;我从未见过以适合编辑距离计算的形式表示笔画序列(甚至是单个笔画名称)的人或机器可读代码。
但是,你可以尝试的最后一件事就是渲染角色 字形 并根据计算编辑距离 多少像素 (或向量)需要更改为将一个字符转换为另一个字符。我曾经在OCR后期校正的背景下对拉丁字符和字符组合(以像素为基础)这样做,结果非常令人鼓舞。
快速回答larsmans评论如下:Unicode标准定义了两个相关的概念(在下面我指的是 6.0版,第12章):
基于部首和中风计数的指数。每个汉字都由几个部分组成, 一 其中激进的。基础/笔划计数索引是按部首排序的字符列表(即,共享同一基团的所有字符组合在一起),并且每个基础特定组在内部按字符的其余部分中使用的笔划数排序。不幸的是,即使这不是唯一的定义 - 有些字符的根本由不同的传统词汇定义不同,并且笔画计数也可能很难。以下是Unicode标准所说的内容:
为了加快在代码表中定位特定的汉字表意字符,Unicode网站上提供了基本笔画索引。 [...] 对激进中风信息最有影响力的权威是十八世纪 康熙字典,其中包含214个激进分子。今天使用康熙激进派的主要问题是许多简化字符很难在214中的任何一个下进行分类 康熙激进分子。结果,引入了各种现代激进集。然而,没有一个是普遍使用的,214康熙的激进分子仍然是最知名的。 [...] Unicode激进笔画图基于康熙激进派。 Unicode标准 遵循许多不同来源进行根治性卒中分类。两个来源 对于给定角色的激进或笔画计数存在争议,角色在激进笔画图中的两个位置都显示出来。
请注意,即使我们假设激进/笔划索引是明确和正确的,它也不足以作为将字符转换为组件序列的信息源,因为完全描述的字符的唯一组成部分是激进。
表意描述序列(第12.2节):Unicode定义了字符基本组件的代码点(大多数字符本身可以用作独立字符),并且有一些代码点用于将这些代码点粘合在一起形成一系列描述构成一个更复杂的角色。所以这种方式类似于 结合人物,但有重要的区别:
标准建议使用表意描述序列来描述任何现有代码点都没有表示的复杂或罕见的特征;但它明确地不鼓励使用描述序列代替普通字符:
特别是,表意文字描述序列不应用于提供替代方案 数据交换中编码的表意文字的图形表示。搜索,整理, 然后,其他基于内容的文本操作将失败。