【发布时间】:2014-05-08 10:38:41
【问题描述】:
我在网站中有数千个页面,我将其解析并存储为倒排索引即
文档
- docid (PK,FK)
- 网址
- 字符数
- 字数
Charactercount 和 wordcount 帮助我确定长文档和短文档,以便以后使用。
单词
- wordid (PK,FK)
- 字
- doc_freq
- inverse_doc_freq
对于 inverse_doc_freq 计算,我使用虚构的高数 (100000000) 来防止总文档重新计算。
定位
- wordid
- 文档
- word_freq
- 重量
(wordid & docid 组合唯一)
权重是根据标题中的单词 + url 中的单词 + 单词频率等简单基础计算得出的分数。
我在为搜索词构建 sql 查询时遇到问题。对于 3 字搜索,我正在这样做
- 将查询分解为每个单词
- 检查每个单词的 inverse_doc_freq 并移除低 idf 单词(移除停用词)
- 词干剩余的单词(假设还剩下 3 个单词)
- 查询每个单词
我在第 4 阶段卡住了!我的 SQL 查询是这样的
SELECT d.docid,url,inverse_doc_freq,word_freq,weight from document d,word w,loc l WHERE d.docid=l.docid AND w.wordid=l.wordid AND (word='word1' OR word='word2' OR word='word3') ORDER BY weight DESC
返回的文件不正确。相信我可能必须搜索三次才能找到每个单词的文档,然后尝试找到常见的文档,但是如何?是否可以只使用 1 个 MySQL 查询?也可以使用TF-IDF 吗?
【问题讨论】:
-
“返回的文件不正确”是什么意思?
-
存在重复文件。虽然最好显示包含所有 3 个单词的文档,但当前查询仅显示包含 1 个常用单词的文档,如果我将
OR更改为AND然后它显示零个文档。 ;-(
标签: php mysql sql inverted-index