Mysql 多对多,并编写了一个半智能匹配算法
我正在学习使用RubyonRails编程,我已经完成了最艰巨的任务。我有两张桌子,每张桌子上都有一份商业类别的清单(即泰国餐馆、水管工、办公用品商店)。这两个表来自两个不同的API,在这两个API中,我基本上充当它们之间的中间人。它们列出的类别或多或少是相同的,但通常会有不同的表述(即车身修理和喷漆与车身修理和喷漆) 我的第一个目标是为这个任务设计模型。我选择了一个“多对多”,并通过手动映射两行来测试它完成。测试。棒极了。 我的第二个目标是编写一个算法,将两个表中的行相互匹配,根据相似性给出优先级。我猜很多工作都可以在MySQL中完成。以下是我目前为止的伪代码:Mysql 多对多,并编写了一个半智能匹配算法,mysql,ruby-on-rails,ruby,algorithm,search,Mysql,Ruby On Rails,Ruby,Algorithm,Search,我正在学习使用RubyonRails编程,我已经完成了最艰巨的任务。我有两张桌子,每张桌子上都有一份商业类别的清单(即泰国餐馆、水管工、办公用品商店)。这两个表来自两个不同的API,在这两个API中,我基本上充当它们之间的中间人。它们列出的类别或多或少是相同的,但通常会有不同的表述(即车身修理和喷漆与车身修理和喷漆) 我的第一个目标是为这个任务设计模型。我选择了一个“多对多”,并通过手动映射两行来测试它完成。测试。棒极了。 我的第二个目标是编写一个算法,将两个表中的行相互匹配,根据相似性给出优先
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,这是一个简单的查询。谢谢你的意见。如果你认为我错了,一定要让我知道。谢谢你的帮助