我们正在开发一个系统,使用 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 个字符组成。通过将这些字符序列表示为 UCS-2 或 UCS-4 代码点序列,可以直接将 Levenshtein 距离应用于这些字符序列。由于大多数单词都很短(尤其是长度为 1 或 2 个字符的单词),但它的用途可能有限。
但是,由于您的问题是关于单个字符之间的编辑距离,我认为需要采用不同的方法,而且确实可能非常困难。
首先,您必须将每个字符表示为它所包含的组件/笔划的序列。有两个问题:
一些组件本身由更小的组件组成,因此如何将字符分解为“原子”组件并不是唯一定义的。如果您将其降低到单个笔画的级别,则需要对每个笔画进行表征(字符内的位置、形状、方向等)。我不认为任何人都这样做(如果有人告诉我,我会最感兴趣)。
您需要将笔画或组件放入order中。明显的候选者是字符的规范笔顺,它在词典中进行了描述,甚至还有带有动画笔顺图的字典网站。但是,我知道的数据源(日语)将这些动画生成为位图图形序列;我从未见过以适合编辑距离计算的形式表示笔画序列(甚至单个笔画名称)的人类或机器可读代码。
不过,您可以尝试的最后一件事是渲染字符字形并根据需要更改多少像素(或矢量)以将一个字符转换为另一个字符来计算编辑距离。我曾经在 OCR 后校正的上下文中对拉丁字符和字符组合(以像素为基础)进行此操作,结果非常令人鼓舞。
对以下 larsmans 评论的快速回答:Unicode 标准定义了两个相关概念(在下面我指的是6.0 版本,第 12 章):
基于部首和笔画计数的索引。每个汉字由几个部分组成,其中一个是部首。部首/笔画计数索引是按部首排序的字符列表(即,共享相同部首的所有字符组合在一起),并且每个部首特定组在内部按字符其余部分中使用的笔画数排序。不幸的是,即使这也不是唯一定义的——有些字符的部首在不同的传统词典中定义不同,笔画计数也可能很困难。这是 Unicode 标准所说的:
为了加快在码表中定位特定的汉字表意字符,Unicode 网站上提供了部首笔画索引。[...] 最有影响力的部首信息权威是 18 世纪的康熙字典,其中包含 214 个部首。今天使用康熙部首的主要问题是,许多简体字在214个康熙部首中的任何一个下都难以分类。结果,引入了各种现代激进集。然而,没有一个是普遍使用的,214 个康熙部首仍然是最广为人知的。[...] Unicode 部首笔画图表基于康熙部首。Unicode 标准遵循许多不同的字根笔划分类来源。当两个来源在给定字符的部首或笔画计数方面存在分歧时,
请注意,即使我们假设部首/笔画索引是明确和正确的,它也不足以作为将字符转换为组件序列的信息源,因为由此完全描述的字符的唯一组件是激进的。
表意描述序列(第 12.2 节):Unicode 为字符的基本组成部分定义了代码点(无论如何,它们中的大多数本身都可以用作独立字符),并且有一些代码点用于将它们粘合在一起以形成描述字符的组件序列组成更复杂的角色。所以它的工作方式类似于组合 characters,但有重要的区别:
该标准建议使用表意描述序列来描述任何现有代码点都不表示的复杂或稀有字符;但它明确不鼓励使用描述序列代替普通字符:
特别是,表意文字描述序列不应用于在数据交换中提供编码表意文字的替代图形表示。搜索、整理和其他基于内容的文本操作将会失败。
我写了一个python包fuzzychinese
来纠正中文单词的拼写错误。
正如@jogojapan 所说,如果您真的想计算 Levenshtein 距离,使用诸如部首或笔画之类的子字符结构更有意义。您可以使用Stroke()
orRadical()
类fuzzychinese
来分解字符,然后计算 Levenshtein 距离。
但是,我不确定 Levenshtein 距离是否能很好地纠正拼写错误的中文单词。在我编写的包中,我计算了 n-gram 笔划的 tf-idf 向量,并使用余弦相似度来匹配单词。