小。速度很快。可靠。
选择任意三个选项。
Spellfix1虚拟表

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默认为单词自身。

下面列出了一些可能需要添加其他内容的情况类似声音的条目。具体条目取决于应用程序和目标语言。

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数字代码脚本。当前实现理解以下脚本:
  • 215-拉丁语
  • 220-西里尔文
  • 200-希腊语
未来版本中可能会添加其他语言代码。

spellfix1_translit(X)

此例程将unicode文本音译为纯ascii,返回输入文本X的纯ascii表示。这是函数内部用于将词汇转换为K1影子表的列。

8editdist3函数

editdist3算法是一个计算最小编辑的函数两个输入字符串之间的距离(也称为Levenshtein距离)。editdist3算法是默认算法的可配置替代方案编辑spellfix1的距离函数。editdist3的功能包括:

9editdist3 COST表

要对editdist3的成本进行编程,请创建如下表:

创建表格编辑成本(iLang INT,--语言IDcFrom 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()”直接测试editdistSQL函数。editdist3()SQL函数有3种形式:

  1. editdist3(“标签名称”);
  2. editdist3(“字符串1”,“字符串2”);
  3. editdist3('string1','string2',langid);

第一个表单从名为“表格名称”。任何先前的系数都将被丢弃。因此,在进行实验时随着权重和权重表的更改,只需重新运行单个参数以editdist3()的形式重新加载修改后的系数。请注意编辑距离editdist3()SQL函数使用的权重独立于spellfix1虚拟表使用的权重。

第二和第三种形式返回字符串之间计算的编辑距离“string1”和“string2”。在第二种形式中,使用语言id 0。语言id以第三种形式指定。

此页面上次修改时间2023-10-10 17:29:48联合技术公司