15

我正在制作一个测验系统,当测验制作者将问题插入问题库时,我将检查数据库中是否存在重复/非常相似的问题。

测试 MySQL 的MATCH() ... AGAINST(),当我针对 100% 相似的字符串进行测试时,我得到的最高相关性是 30+。

那么相关性究竟是什么?引用手册

相关性值是非负浮点数。零相关性意味着没有相似性。相关性是根据行中的单词数、该行中的唯一单词数、集合中的单词总数以及包含特定单词的文档(行)数来计算的。

我的问题是如果字符串重复,如何测试相关性值。如果它是 100% 重复的,请防止它被插入到问题库中。但如果只是如此相似,提示测验者验证,插入与否。那么我该怎么做呢?100% 相同字符串的 30+ 不是百分比,所以我很难过。

提前致谢。

4

3 回答 3

8

文本检索系统的基本数据结构是倒排索引。这本质上是在文档集合中找到的单词列表以及它们出现的文档列表。它还可以包含有关每个文档出现的元数据,例如单词出现的次数。

可以通过对搜索词进行匹配来查询包含这些词的文档。为了确定相关性,对命中计算称为余弦排名的启发式方法。这通过为 n 个搜索词中的每一个构建具有一个分量的 n 维向量来工作。如果需要,您还可以对搜索词进行加权。这个向量在 n 维空间中给出了一个与您的搜索词相对应的点。

可以从倒排索引构造基于每个文档中的加权出现的相似向量,其中向量中的每个轴对应于每个搜索词的轴。如果你计算这些向量的点积,你会得到它们之间夹角的余弦值。1.0 等价于 cos (0),假设向量从原点占据一条公共线。向量越接近,角度越小,余弦越接近 1.0。

如果您按余弦对搜索结果进行排序(或像mg那样将它们放入优先级队列中),您将获得最相关的结果。更聪明的相关性算法倾向于调整搜索词的权重,使点积偏向具有高相关性的词。

如果您想深入了解一下,BellMoffet的《管理千兆字节》讨论了文本检索系统的内部架构。

于 2008-10-26T14:31:16.510 回答
5

andygeers 走在正确的轨道上:这些数字除了彼此之间的关系之外没有任何经验意义,并且不能单独用于确定什么是“精确匹配”或不是“精确匹配”。你需要自己确定。即使除了全文搜索排名的限制之外,还有一个悬而未决的问题,即您认为什么才能构成“完全匹配”。(仅实际文本或 soundex 匹配是否计算在内?同义词(例如,“couch”与“sofa”)是否计为匹配或不同?是否应该尝试弥补拼写错误?等等)

如果我需要执行这样的检查,我将只获取全文搜索返回的排名最高的条目,删除任何指定的停用词,规范化空格,转换为小写,进行比较,然后将其保留,直到遇到一个需要进一步完善的案例。这实际上并没有那么额外的工作——如果你指定你的应用程序使用的语言,你可能会在这里找到可以用十几行代码编写规范化函数的人。

于 2008-10-26T15:47:28.447 回答
2

我不知道您正在使用的 MySQL 函数的细节,但我想这些数字可能没有绝对意义——它们只是被设计用于与同一函数产生的其他值进行比较。要检查绝对匹配,您可以选择文本本身并手动比较。

于 2008-10-26T13:11:58.590 回答