Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何模糊地搜索字典中的单词?_Algorithm_Search_Nlp_Search Engine - Fatal编程技术网

Algorithm 如何模糊地搜索字典中的单词?

Algorithm 如何模糊地搜索字典中的单词?,algorithm,search,nlp,search-engine,Algorithm,Search,Nlp,Search Engine,我在这里读了很多讨论编辑距离模糊搜索的文章,这些工具如Elasticsearch/Lucene提供了开箱即用的功能,但我的问题有点不同。假设我有一个单词词典,{'cat','cot','catalyst'},和一个字符相似关系f(x,y) (程序员可以指定这些“相似性”) 比如说, f('t', 'l') = 1 f('a', 'o') = 1 f('f', 't') = 1 但是, 现在,如果我们有一个查询“cofatyst”,那么算法应该报告以下匹配: ('cot', 0) ('cat',

我在这里读了很多讨论编辑距离模糊搜索的文章,这些工具如Elasticsearch/Lucene提供了开箱即用的功能,但我的问题有点不同。假设我有一个单词词典,{'cat','cot','catalyst'},和一个字符相似关系f(x,y)

(程序员可以指定这些“相似性”)

比如说,

f('t', 'l') = 1
f('a', 'o') = 1
f('f', 't') = 1
但是,

现在,如果我们有一个查询“cofatyst”,那么算法应该报告以下匹配:

('cot', 0)
('cat', 0)
('catalyst', 0)
其中,数字是找到的匹配项的从0开始的索引。我已经尝试了,虽然它对于精确匹配非常有效,并且当一个字符的“相似”字符数相对较少时,它的性能会随着我们增加一个字符的相似字符数而呈指数下降。有人能告诉我一个更好的方法吗?模糊是绝对必要的,它必须考虑到角色的相似性(即,不盲目地依赖编辑距离)

需要注意的一点是,在野外,这本词典将会非常大。

我正在为我的一个项目使用。它是一个在JSON数据集上工作的javascript文件。它相当快。看一看。
它已经实现了一个完整的Bitap算法,利用了谷歌(从他的网站)改进的Diff、Match和Patch工具


代码很容易理解所完成的算法实现。

我可能会尝试使用余弦相似性,使用每个字符的位置作为特征,并使用基于字符关系的匹配函数在特征之间映射乘积

我知道这不是一个非常具体的建议,但我希望它能帮助你

编辑:扩展答案

使用余弦相似性,您将计算两个向量的相似程度。在您的情况下,标准化可能没有意义。因此,我要做的是一件非常简单的事情(我可能过于简化了这个问题):首先,将CxC的矩阵视为一个依赖矩阵,两个字符有关联的概率(例如,P('t'|'l')=1)。这还允许您使用部分依赖项来区分完全匹配和部分匹配。在这之后,我将计算每个位置,每个单词的字母不相同的概率(使用P(t_I,t_j)的补码),然后您可以使用和来聚合结果


它将统计特定词对中不同的词的数量,并允许您定义部分依赖项。此外,实现非常简单,应该具有良好的可扩展性。这就是为什么我不确定我是否误解了你的问题。

我一直在玩弄它,但我不确定如果字典很大,这会有什么帮助-我仍然需要将字典中的单词逐个与查询进行匹配。当您有一些大的文本和从该文本生成grep的模式时,BITAP似乎工作得很好。我用JSON测试了它,JSON由表生成,有7个属性和大约420行。将较大的文本添加到grep肯定会提高性能,但即使使用简单的2个字符,性能也令人满意。。这是我做的测试。希望这些信息有帮助。这听起来很有趣。你能把你的答案修改得更详细一点吗?将每个字符的位置作为特征,是指该字符在查询字符串中的位置吗?
f('a', 'z') = 0
etc.
('cot', 0)
('cat', 0)
('catalyst', 0)