gpt4 book ai didi

mysql - 反向搜索 : Phrases per document

转载 作者:可可西里 更新时间:2023-11-01 08:22:59 25 4
gpt4 key购买 nike

我有一个充满短语(80-100 个字符)和一些较长文档(50-100Kb)的数据库,我想要给定文档的短语排名列表;而不是搜索引擎的通常输出,而是给定短语的文档列表。

我以前用过MYSQL全文索引,也研究过lucene,但没用过。他们似乎都适合比较短期(搜索词)和长期(文档)。

你如何得到它的倒数?

最佳答案

我对维基百科标题数据库做了类似的事情,并设法将每个 ~50KB 文档的时间减少到几百毫秒。这仍然不够快,无法满足我的需求,但也许对您有用。

基本上,我们的想法是尽可能多地使用哈希,并且只对可能的匹配项进行字符串比较,这种情况很少见。

首先,您获取数据库并将其转换为哈希数组。如果您有数十亿个短语,这可能不适合您。计算哈希值时,请确保将短语传递给将删除标点符号和空格的分词器。这部分只需要做一次。

然后,您使用相同的分词器遍历文档,保留最后 1,2,..,n 个分词的运行列表,并进行哈希处理。在每次迭代中,您都会对哈希数据库中的哈希进行二进制搜索。

找到匹配项后,您将进行实际的字符串比较以查看是否找到匹配项。

这里有一些代码,让你体会我的意思,这个例子实际上并没有进行字符串比较:

            HashSet<Long> foundHashes = new HashSet<Long>();

LinkedList<String> words = new LinkedList<String>();
for(int i=0; i<params.maxPhrase; i++) words.addLast("");

StandardTokenizer st = new StandardTokenizer(new StringReader(docText));
Token t = new Token();
while(st.next(t) != null) {
String token = new String(t.termBuffer(), 0, t.termLength());
words.addLast(token);
words.removeFirst();

for(int len=params.minPhrase; len<params.maxPhrase; len++) {
String term = Utils.join(new ArrayList<String>(words.subList(params.maxPhrase-len,params.maxPhrase)), " ");

long hash = Utils.longHash(term);

if(params.lexicon.isTermHash(hash)) {
foundHashes.add(hash);
}
}
}

for(long hash : foundHashes) {
if(count.containsKey(hash)) {
count.put(hash, count.get(hash) + 1);
} else {
count.put(hash, 1);
}
}

关于mysql - 反向搜索 : Phrases per document,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1986351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com