我正在制作一个测验系统,当测验员向问题库插入问题时,我要检查数据库是否存在重复/非常相似的问题.
测试MySQL的MATCH()... AGAINST(),当我测试100%相似的字符串时,我获得的最高相关性是30+.
那么相关性究竟是什么呢?引用手册:
相关性值是非负浮点数.零相关意味着没有相似性.相关性是根据行中的单词数,该行中唯一单词的数量,集合中的单词总数以及包含特定单词的文档(行)数计算的.
我的问题是如果字符串是重复的,如何测试相关性值.如果它是100%重复,则阻止它插入问题库.但如果它只是如此相似,则提示测验者验证,插入或不插入.那我该怎么做?30%的100%相同的字符串不是百分比,所以我是残局.
提前致谢.
文本检索系统的基本数据结构是反向索引.这基本上是在文档集合中找到的单词列表,其中包含它们出现的文档列表.它还可以包含有关每个文档的出现次数的元数据,例如单词出现的次数.
可以通过匹配搜索词来查询包含单词的文档.为了确定相关性,在命中数上计算称为余弦排名的启发式算法.这通过为n个搜索项中的每一个构建具有一个分量的n维向量来工作.如果需要,您还可以对搜索字词进行加权.此向量在n维空间中给出与搜索项对应的点.
可以从反向索引构造基于每个文档中的加权出现的类似向量,其中向量中的每个轴对应于每个搜索项的轴.如果计算这些向量的点积,则得到它们之间角度的余弦值.1.0等价于cos(0),它假定向量占据了来自原点的公共线.矢量越接近,角度越小,余弦越接近1.0.
如果您按余弦对搜索结果进行排序(或将其按照mg的方式将它们按优先级排列),您将获得最相关的结果.更聪明的相关性算法倾向于调整搜索项的权重,使点积偏向于高相关性的项.
如果你想深入一点,管理千兆字节由贝尔和莫菲特讨论文本检索系统的内部结构.
andygeers走在正确的轨道上:这些数字除了彼此之间的关系之外没有任何经验意义,也不能单独用来确定什么是"完全匹配"或"不完全匹配".你需要自己确定一下.即使除了全文搜索排名的限制之外,还有一个公开的问题,即你认为什么是"精确匹配".(仅限实际文本或soundex匹配计数?同义词(例如,"沙发"与"沙发")是否匹配或不同?是否应该尝试补偿拼写错误?等等)
如果我需要执行这样的检查,我只会抓取全文搜索返回的排名最高的条目,删除任何指定的停用词,规范化空格,转换为小写,进行比较,并保留它直到我遇到一个要求进一步完善的案例.这是不是真的是多的工作-如果你指定你使用你的应用程序的语言,你很可能发现有人在这里谁可以代码十几行内编写标准化功能.