文本相似度的算法/库
algorithm/library for text similarity
我需要实现算法(或在开源库中找到一个)来评估文本相似度。对于给定的任意两组文档(相对较少的大块文本),我需要一个有效的算法来创建它们之间的匹配对-哪个文档最有可能从哪个文档生成。
我想我会把它分成两部分——定义每一对的相似系数——然后应用一些分配问题算法。对于分配算法,我可以找到很多解决方案,但对于计算相似系数,我找不到一个好的解决方案。
注意文档是事先不知道的——计算文本索引(如果有的话)也必须很快。
我知道Hamming距离,Levenshtein距离的一些其他算法的字符串差异。这不是我想要的-我故意使用单词文本而不是字符串。
我不寻找短语搜索算法以及像Lucene和Xapian这样的库是为(至少看起来是)。
可能是基于tf-idf。
我想问题是,是否有什么东西已经解决了这个问题,或者是否有可能使用像lucete这样的库来解决这个问题。
我将这样做作为起点(只是因为它既简单又快速):
- 使用共享映射或hash_map将单词映射到数字
- 对于每个文本,构建相应的词级三元组计数图
- 比较重叠
我们可以假设字典的大小为<1m(或21bit),所以我们可以在int64中编码一个三元组。
void CountTrigrams(const vector<string>& words,
map<string, int> * dict,
map<int64, int> * result) {
int64 trigram = 0;
for (int i = 0; i < words.size(); i++) {
const& word = words[i];
int id;
auto di = dict->find(word);
if (di == dict->end()) {
id = dict.size();
dict[word] = id;
} else {
id = di->second;
}
trigram = ((trigram << 21) | id) & 0x7fffffffffffffff;
if (i > 2) {
auto ti = result->find(trigram);
if (ti == result->end()) {
result[trigram] = 1;
} else {
ti->second++;
}
}
}
}
然后比较每对的结果:
int Compare(const map<int64, int> & t1, const map<int64, int> & t2) {
int score = 0;
for (auto i = t1.first(); i != t1.end(); i++) {
auto j = t2.find(t1->first);
if (j != t2.end()) {
score += MAX(i->second, j->second);
}
}
return score;
}
以某种方式标准化分数可能是有意义的,例如除以三元组的总数。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 模板元程序查找相似的连续类型名称
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- 文本相似度的算法/库
- 通过发音找到相似的单词——算法、方法、库