我需要逐字逐句比较两个字符串。 像diff这样的东西,但是对于单词而言,不是为了行。
就像它在维基百科中完成的一样 http://en.wikipedia.org/w/index.php?title=Horapollo&action=historysubmit&diff=21895647&oldid=21893459
结果我想返回两个单词索引数组,两个字符串不同。
.NET是否有可以执行此操作的库/框架/ standalone_method?
P.S。我想比较几千字节的文本
答案 0 :(得分:4)
实际上,您可能希望实现我们在DNA sequence alignments中使用的局部对齐/全局对齐算法的变体。这是因为您可能无法对两个字符串进行逐字比较。即:
快速的棕色狐狸跳过了 懒狗
快速的狐狸跳过了 懒狗
换句话说,如果你无法识别整个单词的插入和删除,你的比较算法就会变得非常sc。(r)。看一下 Smith-Waterman 算法和 Needleman-Wunsch 算法,找到一种方法使它们适应您的需求。如果字符串很长,这样的搜索空间会变得非常大,你也可以查看BLAST。 BLAST是一种非常常见的启发式算法,几乎是遗传搜索的标准。
答案 1 :(得分:3)
似乎我找到了所需的解决方案:
DiffPlex是.NET Diffing Library与Silverlight和HTML diff查看器的组合。 http://diffplex.codeplex.com/
但它有一个错误。在那些行“Hello-Kitty”“Hello - Kitty”中,单词“Hello”将被标记为差异。虽然区别在于空格符号。
答案 2 :(得分:2)
使用RegularExpressions。
与示例中一样:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections.Specialized;
namespace WindowsApplication10
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
decimal discrimation = 0.75M;
string formHeading = "The brown dog jumped over the red lazy river, and then took a little nap! Fun!";
string userSearch = "The brown dog jumped over the red lazy river, and then took a little ";
//string userSearch = "brown dog nap fun";
decimal res = CompareText(formHeading, userSearch);
if (res >= discrimation)
{
MessageBox.Show("MATCH!" + res.ToString());
}
else
{
MessageBox.Show("does not match! " + res.ToString());
}
}
/// <summary>
/// Returns a percentage of 1 on how many words were matched
/// </summary>
/// <returns></returns>
private decimal CompareText(string formHeading, string userSearch)
{
StringCollection formHeadingWords = new StringCollection();
StringCollection userSearchWords = new StringCollection();
formHeadingWords.AddRange(System.Text.RegularExpressions.Regex.Split(formHeading, @"\W"));
userSearchWords.AddRange(System.Text.RegularExpressions.Regex.Split(userSearch, @"\W"));
int wordsFound = 0;
for (int i1 = 0; i1 < userSearchWords.Count; i1++)
{
if (formHeadingWords.Contains(userSearchWords[i1]))
wordsFound += 1;
}
return (Convert.ToDecimal(wordsFound) / Convert.ToDecimal(formHeadingWords.Count));
}
}
}
答案 3 :(得分:1)
你可以用唯一的数字替换2个文本中的所有单词,为编辑距离计算取一些现成的代码,并将它的字符替换为字符比较,数字与数字比较,你就完成了!
我不确定是否存在任何您想要的库。但是你肯定会找到很多编辑距离的代码。
此外,根据您是否想要在编辑距离计算中实际允许替换,您可以更改动态编程代码中的条件。
答案 4 :(得分:1)
你可以试试这个,虽然我不确定你正在寻找的是StringUtils.difference()(http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#difference%28java.lang.String,%20java.lang.String%29)
或者,Eclipse(eclipse.org)项目具有差异比较功能,这意味着它们还必须具有用于确定差异的代码,您可以浏览其API或源以查看可以找到的内容。
祝你好运。答案 5 :(得分:0)
似乎我将使用此处使用的/ port算法
答案 6 :(得分:0)
c#的另一个库是diff-match-patch - http://code.google.com/p/google-diff-match-patch/。
它在字符中找到了不同之处。好的,有指令你必须添加什么来区分单词。