2008-10-26 65 views
14

我想提出一个测验系统,当quizmakers插入到问题的试题库,我检查DB重复/非常非常类似的问题。全文检索相关性在?

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

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

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

我的问题是如何测试的相关值,如果一个字符串是重复的。如果它是100%重复,请阻止它插入问题库。但是,如果它只是如此相似,请提示测验者验证,插入与否。那我该怎么做?对于100%相同的字符串,30+不是百分比,所以我是残缺的。

在此先感谢。

回答

4

andygeers是在正确的轨道上:这些数字比他们的关系,彼此之间没有经验意义,不能靠自己来确定什么是或不是“精确匹配”。你需要确定你自己。即使除了全文搜索排名的限制之外,还有一个悬而未决的问题,就是您认为构建“完全匹配”的问题。 (仅限于实际文本还是soundex匹配计数?同义词(例如,“沙发”与“沙发”)计为匹配还是不同?是否尝试补偿拼写错误等)

如果我有必要执行这样的检查,我只抓取全文搜索返回的排名最高的条目,删除任何指定的停用词,规范化空格,转换为小写,进行比较,并将其留在那,直到遇到一个案例这呼吁进一步提炼。它不是全部很多额外的工作 - 如果你指定你的应用程序使用的语言,你可能会在这里找到可以在十几行代码中编写规范化函数的人。

1

我不知道你正在使用MySQL的函数的具体情况,但我想这可能是因为没有对这些数字没有绝对意义 - 他们只是设计为与利用所产生的其他值进行比较功能相同。要检查绝对匹配,可以选择文本本身并手动比较。

+0

我更喜欢尽可能使用MySQL搜索引擎。如果我要比较自己,我需要做很多准备和检查,例如删除所有的空格和特殊字符,将全部转换为大写,以及不要。这是我的最后一招。 – syaz 2008-10-26 13:23:59

7

用于文本检索系统中的基本数据结构是Inverted Index。这基本上是文档集合中的单词列表,其中包含它们出现的文档列表。它还可以包含有关每个文档的出现次数的元数据,例如单词出现的次数。

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

基于每个文档中的出现加权的类似载体可以从与在与轴线对每个搜索项对应的所述向量中的每个轴的反向索引来构建。如果计算这些向量的点积,则可以得到它们之间角度的余弦。 1.0等同于cos(0),它将假定矢量占据了从原点开始的一条共同线。矢量越接近,角度越小,余弦越接近1.0。

如果排序的余弦的搜索结果(或他们塞子成优先级队列为mg做),你获得最相关的。 Cleverer相关算法倾向于摆弄搜索词的权重,使得点积偏向于高度相关的词。

如果你想挖一点,Managing Gigabytes作者:BellMoffet讨论文本检索系统的内部架构。