我正在制作一个测验系统,当测验员向问题库插入问题时,我会检查数据库是否存在重复/非常相似的问题。
测试MySQL的MATCH() ... AGAINST(),当我测试100%相似的字符串时,我获得的最高相关性是30+。
究竟什么是相关性?引用manual:
相关性值是非负浮点数。零相关意味着没有相似性。根据行中单词的数量,该行中唯一单词的数量,集合中单词的总数以及包含特定单词的文档(行)的数量来计算相关性。
我的问题是如果字符串是重复的,如何测试相关性值。如果它是100%重复,则阻止它插入问题库。但如果它只是如此相似,则提示测验者验证,插入或不插入。那我该怎么做? 30%的100%相同的字符串不是百分比,所以我是残局。
提前致谢。
答案 0 :(得分:8)
文本检索系统的基本数据结构是Inverted Index。这基本上是在文档集合中找到的单词列表,其中包含它们出现的文档列表。它还可以包含有关每个文档出现次数的元数据,例如单词出现的次数。
可以通过匹配搜索词来查询包含单词的文档。为了确定相关性,在命中计算了一个称为Cosine Ranking的启发式算法。这通过为n个搜索项中的每一个构建具有一个分量的n维向量来工作。如果需要,您还可以对搜索字词进行加权。此向量在n维空间中给出与搜索词对应的点。
可以从反向索引构造基于每个文档中的加权出现的类似向量,其中向量中的每个轴对应于每个搜索项的轴。如果计算这些向量的点积,则得到它们之间角度的余弦值。 1.0等价于cos(0),它假定向量占据了来自原点的公共线。矢量越接近,角度越小,余弦越接近1.0。
如果您按余弦对搜索结果进行排序(或将其按照mg将其按进优先级队列排序),则会获得最相关的搜索结果。更聪明的相关性算法倾向于调整搜索术语的权重,使点积偏向于高相关性的术语。
如果您想稍微挖掘一下,Managing Gigabytes Bell和Moffet讨论了文本检索系统的内部架构。
答案 1 :(得分:5)
如果我需要执行这样的检查,我只会抓取全文搜索返回的排名最高的条目,删除任何指定的停用词,规范化空格,转换为小写,进行比较,并将其保留在直到我遇到一个要求进一步完善的案例。并不是所有 更多的额外工作 - 如果你指定了你正在使用的语言,你可能会找到一个可以在十几行代码中编写规范化函数的人
答案 2 :(得分:2)
我不知道您正在使用的MySQL函数的细节,但我想可能是这些数字没有绝对意义 - 它们只是被设计为与其生成的其他值进行比较功能。要检查绝对匹配,您可以选择文本本身并手动比较。