距离在哪里我只在乎文字
Levenshtein distance where I only care about words
我想在插入/删除/编辑单词方面检查两个字符串之间的距离。这类似于levenshtein distance,但我只关心单词,而不是字符。例如:
"猫坐在垫子上","狗小心地坐在垫子上"
的词距离为3。
我正在从Rosetta Code c++脚本为levelshtein距离工作,但我看不出如何做到这一点。
#include <string>
#include <iostream>
using namespace std;
// Compute Levenshtein Distance
// Martin Ettl, 2012-10-05
size_t uiLevenshteinDistance(const std::string &s1, const std::string &s2)
{
const size_t m(s1.size());
const size_t n(s2.size());
if( m==0 ) return n;
if( n==0 ) return m;
size_t *costs = new size_t[n + 1];
for( size_t k=0; k<=n; k++ ) costs[k] = k;
size_t i = 0;
for ( std::string::const_iterator it1 = s1.begin(); it1 != s1.end(); ++it1, ++i )
{
costs[0] = i+1;
size_t corner = i;
size_t j = 0;
for ( std::string::const_iterator it2 = s2.begin(); it2 != s2.end(); ++it2, ++j )
{
size_t upper = costs[j+1];
if( *it1 == *it2 )
{
costs[j+1] = corner;
}
else
{
size_t t(upper<corner?upper:corner);
costs[j+1] = (costs[j]<t?costs[j]:t)+1;
}
corner = upper;
}
}
size_t result = costs[n];
delete [] costs;
return result;
}
int main()
{
string s0 = "rosettacode";
string s1 = "raisethysword";
cout << "distance between " << s0 << " and " << s1 << " : "
<< uiLevenshteinDistance(s0,s1) << std::endl;
return 0;
}
好吧,既然是周末,这个是免费的:)
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
typedef std::vector<std::string> Sentence;
Sentence &split(const std::string &s, char delim, Sentence &elems) {
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
Sentence split(const std::string &s, char delim) {
Sentence elems;
split(s, delim, elems);
return elems;
}
unsigned int edit_distance(const Sentence& s1, const Sentence& s2)
{
const std::size_t len1 = s1.size(), len2 = s2.size();
std::vector<std::vector<unsigned int>> d(len1 + 1, std::vector<unsigned int>(len2 + 1));
d[0][0] = 0;
for(unsigned int i = 1; i <= len1; ++i) d[i][0] = i;
for(unsigned int i = 1; i <= len2; ++i) d[0][i] = i;
for(unsigned int i = 1; i <= len1; ++i)
for(unsigned int j = 1; j <= len2; ++j)
{
d[i][j] = std::min(d[i - 1][j] + 1, d[i][j - 1] + 1);
d[i][j] = std::min(d[i][j], d[i - 1][j - 1] + (s1[i - 1] == s2[j - 1] ? 0 : 1));
}
return d[len1][len2];
}
int main(int argc, char *argv[])
{
Sentence s1 = split("The cat sat on the mat", ' ');
Sentence s2 = split("Dog sat carefully on the mat", ' ');
std::cout << "Distance between sentences: " << edit_distance(s1, s2) << std::endl;
return 0;
}
输出"3" ....
相关文章:
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 如何使用字符串文字作为宏参数
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 构造<int>具有 2 个字符串文字的向量
- 将数字打印成文字
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 方便地对C++中的所有字符串文字进行模糊处理
- C++17 十六进制浮点文字单精度后缀冲突?
- 常量函数,当其参数是对文字类型的引用时
- 连接 LPCSTR 变量和文字?
- 比较 std::string 和 C 样式字符串文字
- 如何从char16_t字符串文字中读取双精度?
- 指内置类型的文字
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 为什么带有指针子对象的文字类类型的 constexpr 表达式不能是非类型模板参数
- 为什么文字不是常量(字符串除外)?
- 模板接受常量,但不接受文字
- 距离在哪里我只在乎文字