1 概述
此拼写修复1 虚拟表 可用于搜索 用于近距离比赛的大量词汇。 例如,spellfix1 可用于建议对拼写错误的单词进行更正。 或者, 它可以与 飞行时间4 使用潜在的 拼写错误的单词。
spellfix1虚拟表的实现保存在 杂项扩展文件夹和中的SQLite源树 特别是在文件中 ext/misc/spellfix1.c . SQLite中不包括spellfix1虚拟表 合并 并且不是任何标准SQLite构建的一部分。 它是一个 可加载扩展 .
加载spellfix1扩展后,spellfix1的实例 虚拟表的创建方式如下:
使用spellfix1创建虚拟表格演示;
“spellfix1”术语是spellfix模块的名称,必须是 如图所示输入。 “演示”术语是 您将要创建的虚拟表的名称,可以进行更改 以满足应用程序的需要。 虚拟表最初是 为空。 为了使虚拟表有用,您需要 用你的词汇填充它。 假设你 在名为“bigvocabulary”的表中列出单词。 然后执行以下操作:
INSERT INTO demo(word)SELECT word FROM big_vocationary;
如果您打算与 飞行时间4 表(用于搜索词的拼写更正),然后可以提取 使用 fts4辅助 表:
插入演示(单词)SELECT term FROM search_aux WHERE col='*';
您还可以为虚拟表提供每个单词的“排名”。 “秩”是对单词的常见程度的估计。较大的数字 意思是这个词更常见。 如果在填充时忽略排名 表中,则假定秩为1。 但如果你有地位 信息,您可以提供它,虚拟表将显示一个 稍微倾向于选择更常用的术语。 收件人 从fts4aux表“searchaux”填充排名 这样地:
插入演示(单词、等级) SELECT term,documents FROM search_aux WHERE col='*';
要查询虚拟表,请在WHERE中包含MATCH运算符 条款。 例如:
从演示中选择单词,单词匹配“kennasaw”;
使用美国地名数据集(源自 http://geonames.usgs.gov/domestic/download_data.htm )上面的查询 返回20个以以下字符开头的结果:
肯尼索 基诺沙 肯尼索 肯尼亚 基纳克
如果在模式末尾附加字符“*”,则 执行前缀搜索。 例如:
从演示中选择单词,单词匹配“kennes*”;
从以下开始产生20个结果:
肯尼索 坚石 肯尼森 犬舍 基恩斯 基恩斯
2 搜索优化
默认情况下,spellfix1表返回的结果不超过20个。 (如果好的匹配项较少,则返回的值可能小于20。) 您可以通过以下方式更改返回行数的上限 在查询的WHERE子句中添加“top=N”项,其中N 是新的最大值。 例如,要查看5个最佳匹配项:
从演示中选择单词,单词匹配“kennes*”,顶部=5;
spellfix1虚拟表中的每个条目都与 一种特定的语言,由整数“langid”列标识。 默认的langid为0,如果没有采取其他操作 整个词汇表是0语言的一部分。 但如果您的申请 需要使用多种语言操作,然后可以指定不同的 通过指定langid字段为每种语言指定词汇表项 填充表时。 例如:
INSERT INTO demo(word,langid)SELECT word,0 FROM en_vocage; INSERT INTO demo(word,langid)SELECT word,1 FROM de_vocage; INSERT INTO demo(word,langid)SELECT word,2 FROM fr_vocage; INSERT INTO demo(word,langid)SELECT word,3 FROM ru_vocage; INSERT INTO demo(单词,langid)选择单词,4 FROM cn_vocabulary;
使用来自多个 语言,使用“langid=N”术语指定感兴趣的语言 在查询的WHERE子句中:
从演示中选择单词WHERE单词匹配'hildes*'AND langid=1;
注意,如果在WHERE子句中没有包含“langid=N”术语, 搜索将针对语言0(在上面的示例中为英语) 所有spellfix1搜索都针对单个语言id。没有 一次搜索所有语言的方法。
三。 虚拟表详细信息
spellfix1虚拟表中的每一行都有一个唯一的rowid 有七列加上五个额外的隐藏列。 这些列如下:
罗伊德
与每个关联的唯一整数 表中的词汇项目。 这可以使用 作为数据库中其他表的外键。 单词
与模式匹配的单词的文本。 单词和模式都可以包含unicode字符 可以是混合情况。 等级
这是单词的等级,如 原始INSERT语句。 距离
这是编辑距离或Levenshtein距离 从模式到单词。 兰吉德
这是单词的语言id。 所有查询都是 针对单个语言id,该id默认为0。 对于任何给定的查询,该值在所有行上都是相同的。 分数
分数是等级和距离的组合。 这个 想法是分数越低越好。 虚拟表 尝试查找得分最低的单词 默认情况下(除非被ORDER by覆盖)返回 结果按得分递增的顺序排列。 火柴
在前缀搜索中,matchlen是 与前缀匹配的字符串。 对于非重复搜索, 这与长度(单词)相同。 电话散列
此列显示用于限制 搜索。 对于任何给定的查询,此列应与 每一行。 此信息可用于诊断目的,并且 在实际应用中通常不被认为有用。 顶部
(HIDDEN)对于任何查询,此值在所有 排。 它是一个整数,是 将输出的行。 实际行数 输出可能小于此数字,但它永远不会 变得更伟大。 top的默认值是20,但是 可以通过包含以下项来更改每个查询 查询的WHERE子句中的形式“top=N”。 范围
(HIDDEN)对于任何查询,此值在所有 排。 范围是衡量虚拟 该表查找匹配的单词。 较小的值 范围导致更广泛的搜索。 范围通常为 自动选择,上限为4。 应用 可以通过包含表单的术语来更改范围 查询的WHERE子句中的“scope=N”。 增加的 范围将使查询运行更快,但会减少 可能的更正。 srchcnt公司
(HIDDEN)对于任何查询,此值在所有 排。 此值是一个整数,它是 使用编辑-距离算法检查单词 找到最终显示的最匹配项。 这个 该值仅用于诊断。 声音类似
(HIDDEN)插入词汇条目时,此字段 可以设置为与单词匹配的拼写 听起来像。 了解如何应对不寻常和困难 下面的SPELLINGS部分了解详细信息。 命令
(HIDDEN)“命令”列的值始终为NULL。 然而, 应用程序可以按顺序在“command”列中插入特殊字符串 激发spellfix1虚拟表中的某些行为。 例如,将字符串“reset”插入“command”列 将导致虚拟表重新读取其编辑距离权重 (如果有)。
4 算法
spellfix1虚拟表创建单个 名为“%_vocab”的影子表(其中%替换为 虚拟表; 例如:“demo_vocab”表示“demo”虚拟表)。 影子表包含以下列:
身份证件
唯一id(整数主键) 等级
单词的等级。 兰吉德
此条目的语言id。 单词
词汇单词的原始UTF8文本 千1
将单词音译为小写ASCII。 有一个标准的非ASCII映射表 字符转换为ASCII。 示例:“”->“ae”, “\254”->“th”,“\223”->“ss”,“á”->“a”。。。 这个 附件函数spellfix1_translit(X)可以 非ASCII到ASCII的映射。 内置下部(X) 函数将转换为小写。 因此: k1=更低(spellfix1_translit(单词))。 如果单词已经全部是小写ASCII,则k1列 将包含NULL。 这降低了 %vocab表并帮助spellfix运行得更快。 因此,填充尽可能多的拼写修复是有利的 表中尽可能使用小写ASCII词汇。 k2(平方公里)
该字段包含一个源自聚结(k1,单词)的语音代码。 发音相似的字母映射到同一个符号中。 例如,所有元音和元音簇都成为 单个符号“A”。 字母“p”、“b”、“f”和 “v”全部变为“B”。 所有的鼻音都被表示出来了 作为“N”。 等等。 映射基于 Soundex、Metaphone和其他 长期存在的语音匹配系统。 这把钥匙可以 由函数spellfix1_phonehash(X)生成。 因此:k2=spellfix1_phonehash(合并(k1,字))
还有一个计算Wagner编辑距离或 Levenstein表示模式和单词之间的距离。 此函数 显示为spellfix1_editdist(X,Y)。 编辑距离功能 返回将X转换为Y的“成本”。一些转换 比其他人花费更多。 将一个元音变为不同的元音, 例如,相对便宜,比如将常数加倍,或者 省略双常数的第二个字符。 其他转换 或者更贵。 其思想是编辑距离函数返回 相似单词的成本较低,而单词的成本较高 距离更远。 在此实施中,最大成本 任何单字符编辑(删除、插入或替换)的值为100, 一些编辑(例如转换元音)的成本更低。
比较的“分数”是模式之间的编辑距离 和单词,按单词秩以2为底的对数向下调整。 例如,距离为100但等级为1000的比赛将具有 得分为122(=100-log2(1000)+32),而比赛有距离 排名为1的100分为131分(100-log2(1)+32)。 (注意:常数32加在每个分数上,以防止其继续 如果编辑距离为零,则为负数。) 以这种方式,经常 使用过的单词的成本稍低,这往往会使它们朝着 备选拼写列表的顶部。
拼写校正器的一个简单实现是 将搜索词与词汇表中的每个单词进行比较 然后选择得分最低的20个。 然而 通常是在 词汇表,所以这种方法不够快。
假设拼写正确的术语是X 使用 相当于:
key=spellfix1_phonehash(下部(spellfix1_translit(X)))
然后,该键被限制为“范围”字符。 默认范围 值为4,但可以使用 WHERE子句中的“scope=N”术语。 键被截断后, 编辑距离与词汇表中 具有以缩写键开头的k2值。
例如,假设输入单词是“Paskagula”。 语音 关键是“BACACALA”,然后将其截断为4个字符“BACA”。 然后在4980个条目上运行编辑距离(共 共272597个条目),其k2值以 BACA将“帕斯卡古拉”评为最佳组合。
只搜索具有匹配langid的词汇表的词汇。 因此,同一个表可以包含来自多种语言的条目 并且只使用请求的语言。 默认语言ID 为0。
5 可配置编辑距离
具有固定权重的内置Wagner编辑距离功能可以是 替换为 编辑员3() 编辑-距离函数 通过指定应用程序定义的权重和对unicode的支持 “编辑成本表”= 表名 “spellfix1模块的参数 创建虚拟表时。 例如:
使用spellfix1创建虚拟表格demo2(edit_cost_TABLE=APPCOST);
这个 编辑员3() 也可以选择edit-distance函数或 在运行时通过在 虚拟表的“命令”列:
插入demo2(命令)值('edit_cost_table=APPCOST');
在上述示例中,将查询APPCOST表以查找 编辑距离系数。 它是“edit_cost_table=”的存在 导致使用editdist3()的spellfix1模块名称的参数 代替内置的编辑距离功能。 如果APPCOST为空 字符串,则使用内置的Wagner编辑距离函数。
编辑距离系数通常从APPCOST表中读取 一次又一次地存储在内存中。 因此,运行时更改为 APPCOST表格通常不会影响编辑距离结果。 但是,将特殊字符串“reset”插入 虚拟表使编辑距离系数被重新读取 APPCOST表格。 因此,应用程序应该运行类似于 当APPCOST表发生更改时,更改为:
插入demo2(命令)值(“重置”);
6 处理不寻常和困难的拼写
上述算法在大多数情况下都能很好地工作,但有 例外情况。 这些例外情况可以通过增加 使用“soundslike”列的虚拟表中的条目。
例如,许多源自希腊语的单词以字母“ps”开头,其中 “p”是无声的。 例如:圣歌,笔名,牛皮癣,精神病。 在 另一个例子,许多苏格兰姓氏可以用 首字母“Mac”或“Mc”。 因此,“麦凯”和“麦凯 相同的。
可以对拼写不正确的单词进行调整 通过在虚拟表中为 相同的单词,但在“soundslike”中添加了另一种拼写 列。 例如,“诗篇”的规范条目如下:
插入演示(单词)值(“salm”);
提高将“salm”的拼写改为 “诗篇”,加上这样的词条:
插入演示(单词,声音类似)价值观(“salm”,“lm”);
可以为同一个单词创建多个条目,只要 每个条目具有不同的类音值。 注意,如果没有 指定了soundslike值,soundsloke默认为单词 自身。
下面列出了一些可能需要添加其他内容的情况 类似声音的条目。 具体条目取决于应用程序 和目标语言。
以“ps”开头的单词中无声的“p”:诗篇,心灵 单词中以“pn”开头的无声“p”:肺炎,气动 以“pt”开头的单词中的无声“p”:翼手龙,托勒密语 单词中以“dj”开头的无声“d”:djinn,Djikarta 以“kn”开头的单词中的无声“k”:knight,Knuthson 以“gn”开头的单词中的无声“g”:gnarly、gnome、gnat 以苏格兰姓氏开头的“Mac”与“Mc” 斯拉夫语中的“Tch”发音:柴可夫斯基vs.查可夫斯基 字母“j”在西班牙语中发音像“h”:LaJolla 以“wr”和“r”开头的单词:write vs.rite 其他问题词,如“debt”、“tsetse”、, “Nguyen”、“Van Nuyes”。
7 辅助功能
实现spellfix1虚拟表的源代码模块也 实现了几个可能对应用程序有用的SQL函数 在开发过程中使用spellfix1或用于测试或诊断工作的 使用spellfix1的应用程序。 以下辅助功能是 可用:
编辑3(P,W) 编辑3(P,W,L) 编辑3(T)
这些例程可直接访问Wagner版本 edit-distance函数,允许应用程序定义的权重 关于编辑操作。 此函数的前两种形式比较 模式P对应单词W并返回编辑距离。 在第一个 函数中,假设langid为0,在第二个函数中 langid由L参数给出。 此函数的第三种形式 重载从T命名的表中编辑距离系数。 拼写修复1_editist(P,W)
此例程提供对内置Wagner编辑数据的访问 使用默认固定成本的功能。 返回的值为 将W转换为P所需的编辑距离。 spellfix1_phonehash(X)
此例程构造纯ascii输入单词X的语音哈希 并返回该散列。 此例程由中的spellfix1内部使用 以便将阴影表的K1列转换为K2 列。 拼写修复1_脚本代码(X)
给定一个输入字符串X,此例程尝试确定 脚本,并返回该脚本的ISO-15924数字代码 脚本。 当前实现理解以下脚本: 未来版本中可能会添加其他语言代码。 spellfix1_translit(X)
此例程将unicode文本音译为纯ascii,返回 输入文本X的纯ascii表示。这是函数 内部用于将词汇转换为K1 影子表的列。
8 editdist3函数
editdist3算法是一个计算最小编辑的函数 两个输入字符串之间的距离(也称为Levenshtein距离)。 editdist3算法是默认算法的可配置替代方案 编辑spellfix1的距离函数。 editdist3的功能包括:
它使用unicode(UTF8)文本。
插入、删除和替换成本表可以是 由应用程序提供。
多字符插入、删除和替换可以是 在成本表中列举。
9 editdist3 COST表
要对editdist3的成本进行编程,请创建如下表:
创建表格编辑成本( iLang INT,--语言ID cFrom TEXT,--转换此 cTo TEXT,--将文本转换为此 iCost INT—进行转换的成本 );
成本表可以命名为任何您想要的名称-它不必是 称为“编辑成本”。 并且该表可以包含其他列。 唯一的要求是 表中必须包含上面显示的四列,并精确显示名称。
iLang列是一个非负整数,用于标识一组成本 适用于特定语言。 editdist3函数将只使用 任何给定编辑-距离计算的单个iLang值。 默认值 值为0。 建议只需要使用 对于所有条目,单一语言始终使用iLang==0。
iCost列是将cFrom转换为cTo的数字成本。 这个 值应该是非负整数,并且可能小于100。 默认的单字符插入和删除成本为100 默认的单字符到单字符替换成本为150。 A类 10000或以上的成本被视为“无限”,并导致规则 忽略。
cFrom和cTo列显示编辑转换字符串。 要么两者兼而有之 列可以包含多个字符。 或任一列(但不是两列) 可能包含空字符串。当cFrom为空时,这是插入的成本 c收件人。 当cTo为空时,这是删除cFrom的成本。
在spellfix1算法中,cFrom是用户输入的文本 cTo是数据库中拼写正确的文本。 目标 editdist3算法的作用是确定用户输入文本的距离 到字典文本。
成本表中有三个特殊情况条目:
c来自 c收件人 含义
'' '?' 默认插入成本
'?' '' 默认删除成本
'?' '?' 默认替代成本
如果省略了上面显示的任何特殊情况条目,则 值100用于插入和删除,150用于 替代。 禁用默认插入、删除和/或替换 将其各自的成本设置为10000或更多。
成本表特定转换中的其他条目 字符。 特定转换的成本应小于默认成本,否则 默认成本优先,特定转换永远不会 使用。
例如,成本表条目:
插入编辑成本(iLang、cFrom、cTo、iCost) 值(0,“a”,“ä”,5);
上面的规则说,用户输入中的字母“a”可以与之匹配 字典中的字母“ä”将被罚5分。
插入编辑成本(iLang、cFrom、cTo、iCost) 值(0,'ss','\223',8);
cFrom和cTo中的字符数不必相同。 这个 上面的规则说,用户输入的“ss”将与“ß”匹配,惩罚为8。
10 试用editcost3()函数
spellfix1虚拟表 如果“edit_cost_table=table”选项,则使用editdist3 在创建spellfix1虚拟表时指定为参数。 但也可以使用内置的“editdist3()”直接测试editdist SQL函数。 editdist3()SQL函数有3种形式:
editdist3(“标签名称”); editdist3(“字符串1”,“字符串2”); editdist3('string1','string2',langid);
第一个表单从名为 “表格名称”。 任何先前的系数都将被丢弃。 因此,在进行实验时 随着权重和权重表的更改,只需重新运行单个参数 以editdist3()的形式重新加载修改后的系数。 请注意 编辑距离 editdist3()SQL函数使用的权重独立于 spellfix1虚拟表使用的权重。
第二和第三种形式返回字符串之间计算的编辑距离 “string1”和“string2”。在第二种形式中,使用语言id 0。 语言id以第三种形式指定。
此页面上次修改时间 2023-10-10 17:29:48 联合技术公司