Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Mysql 多对多,并编写了一个半智能匹配算法_Mysql_Ruby On Rails_Ruby_Algorithm_Search - Fatal编程技术网

Mysql 多对多,并编写了一个半智能匹配算法

Mysql 多对多,并编写了一个半智能匹配算法,mysql,ruby-on-rails,ruby,algorithm,search,Mysql,Ruby On Rails,Ruby,Algorithm,Search,我正在学习使用RubyonRails编程,我已经完成了最艰巨的任务。我有两张桌子,每张桌子上都有一份商业类别的清单(即泰国餐馆、水管工、办公用品商店)。这两个表来自两个不同的API,在这两个API中,我基本上充当它们之间的中间人。它们列出的类别或多或少是相同的,但通常会有不同的表述(即车身修理和喷漆与车身修理和喷漆) 我的第一个目标是为这个任务设计模型。我选择了一个“多对多”,并通过手动映射两行来测试它完成。测试。棒极了。 我的第二个目标是编写一个算法,将两个表中的行相互匹配,根据相似性给出优先

我正在学习使用RubyonRails编程,我已经完成了最艰巨的任务。我有两张桌子,每张桌子上都有一份商业类别的清单(即泰国餐馆、水管工、办公用品商店)。这两个表来自两个不同的API,在这两个API中,我基本上充当它们之间的中间人。它们列出的类别或多或少是相同的,但通常会有不同的表述(即车身修理和喷漆与车身修理和喷漆)

我的第一个目标是为这个任务设计模型。我选择了一个“多对多”,并通过手动映射两行来测试它完成。测试。棒极了。

我的第二个目标是编写一个算法,将两个表中的行相互匹配,根据相似性给出优先级。我猜很多工作都可以在MySQL中完成。以下是我目前为止的伪代码:

for each row in table 1
    split phrase up into words by spaces

    SELECT name, id FROM joined_table
        SELECT name, id FROM table2 AS word1 WHERE name LIKE '% word1 %'
        SELECT name, id FROM table2 AS word2 WHERE name LIKE '% word2 %'
        SELECT name, id FROM table2 AS word3 WHERE name LIKE '% word3 %'
        JOIN word1, word2, word3 WHERE word1.id == word2.id 
                                    OR word2.id == word3.id
        order by count of matches of each word

    insert relationships into map table
end
我以前从未设计过搜索算法,因此非常感谢您提供的任何帮助。我很高兴能弄明白这一点,但我想我会主动向专业人士寻求一些建议

干杯


更新:一位同事建议我查看一个名为的网站,这是最经济有效的分类方法。我所要做的就是创建一个简单的表单,它的成本大约为每1000场比赛3美元。

你不应该这样做

更好的方法是规范化数据,然后简单地匹配它

如果“auto”=“automobile”,则将所有“automobile”更改为“auto”。很像您将所有内容从大小写转换为大写或小写

存储实际值,“规范化”数据并将其存储,然后可以匹配规范化数据

这还允许您拥有比SQL中可用的规则“任意”复杂的规范化规则,并且您也只运行一次,而不是针对每个查询

编辑--供评论

那么这个怎么样

我仍然认为你可以在不做很多工作的情况下将其正常化。有一些工作,是的,但不是很多

运行所有数据,并执行一些基本的自由格式文本处理。规范化大小写、词干、抛出“无趣”单词或所谓的“停止”单词。您可以在web上找到此类处理的基础知识。这并不难

最后,你会有一个独特的文字列表。你应该浏览一下这个列表,毫无疑问,你会找到其他你可能想去掉的单词作为“停止”词。如果您发现一些“明显的”同义词,您可以制作一个同义词映射作为规范化过程的一部分。由你决定。最终,可能不会有大量“有趣”的词语

此时要做的一件好事是创建一个反向索引表。例如,如果有3个带有“auto”一词的条目,则反向索引表中有3行:

"auto", 123
"auto", 456
"auto", 789
如果您想要查找哪些行具有“auto”,则可以加入该索引表

现在,您正在对数据集进行迭代

您使用上述技术转换文本,即规范化文本,现在有一个“有趣”单词列表

您可以使用倒排索引查找所有符合条件的行,这些行甚至可能是匹配的候选行,即在“有趣”列表中至少有一个单词的所有行

最后,规范化这些行的文本,将您感兴趣的单词集与其感兴趣的单词集进行交集。这会给出匹配单词的数量。然后,您可以简单地将“匹配单词数/候选单词数”更改为基本百分比评级

您可以看到,您可以动态地进行一些处理,您可以存储大量中间结果(如规范化文本),或者只需获取高于阈值(例如,75%分数)的行,并将它们粘贴到联接表中

而且,这项工作可以迭代完成。您不必再次重新处理整个数据集

当你得到一个新行时,找到那些有共享单词的行,然后将它们和新的一起重新排序。删除行时,只需删除反转的索引项和joiner项。当一行被更新时,只需先“删除”它,然后再“添加”它。(即,删除所有旧关系,然后重新存储更新的行和共享单词的行)


最后应该很快。

没有完整的答案,一定要有建议

如果我明白你想做什么,我想可能很难完全自动化

如果每个数据集都有“1%的古怪”,那么您可以预期需要几百个手动映射

从一开始,假设一些比赛很容易,一些很难,并且需要一些规则

您的第一条规则可能是“精确短语匹配”,而您描述的“最大化匹配字数”规则可能与第二条规则一样好。但是你可能有一些错误的匹配。在您引用的示例中,不匹配的单词“auto vs automobile”是认识到存在匹配的关键

你需要有一些方法来处理那些在另一边没有等价物的类别,在一组15K中肯定会有


当你得到数据更新时,比较新的和旧的,只处理更改-尽量减少工作量。

Will,这是一个有趣的观点,我相信对于这类任务来说是一个非常好的方法。但我不确定它是否适用。。。首先,其中一个表中有15k+行,因此规范化所有这些单词需要花费大量的工时。其次,我只需要运行一次(或者每次更新表时都运行一次)来填充我的连接模型表,那么Rails只需要执行cat1.cat2,这是一个简单的查询。谢谢你的意见。如果你认为我错了,一定要让我知道。谢谢你的帮助