我需要逐字比较两个字符串。类似于 diff 的东西,但是对于文字,而不是对于线条。
结果我想返回两个单词索引的两个数组,它们在两个字符串中是不同的。
.NET 是否有任何库/框架/独立方法可以做到这一点?
PS我想比较几千字节的文本
我需要逐字比较两个字符串。类似于 diff 的东西,但是对于文字,而不是对于线条。
结果我想返回两个单词索引的两个数组,它们在两个字符串中是不同的。
.NET 是否有任何库/框架/独立方法可以做到这一点?
PS我想比较几千字节的文本
实际上,您可能想要实现我们在 DNA序列比对中使用的局部比对/全局比对算法的变体。这是因为您可能无法对两个字符串进行逐字比较。IE:
敏捷的棕色狐狸跳过懒惰的狗
敏捷的狐狸跳过懒惰的狗
换句话说,如果您无法识别整个单词的插入和删除,您的比较算法可能会变得非常严重。看看Smith-Waterman算法和Needleman-Wunsch算法,并找到一种方法来使它们适应您的需求。由于如果字符串很长,这样的搜索空间会变得非常大,您还可以查看 BLAST。BLAST 是一种非常常见的启发式算法,几乎是遗传搜索的标准。
看来我找到了需要的解决方案:
DiffPlex 是 .NET 差异库与 Silverlight 和 HTML 差异查看器的组合。 http://diffplex.codeplex.com/
但它有一个错误。在“Hello-Kitty”“Hello - Kitty”这些行中,“Hello”这个词将被标记为差异。虽然区别是空间符号。
使用正则表达式。
就像在示例中一样:
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));
}
}
}
您可以用唯一的数字替换 2 个文本中的所有单词,使用一些现成的代码进行编辑距离计算,并将其字符与字符的比较替换为数字与数字的比较,您就完成了!
我不确定是否存在任何你想要的库。但是你肯定会发现很多编辑距离的代码。
此外,根据您是否真的希望在编辑距离计算中允许替换,您可以更改动态编程代码中的条件。
你可以试试这个,虽然我不确定你在找什么 StringUtils.difference() ( http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringUtils.html#差异%28java.lang.String,%20java.lang.String%29 )
或者,Eclipse (eclipse.org) 项目具有差异比较功能,这意味着它们还必须具有确定差异的代码,您可以浏览他们的 API 或源代码以查看可以找到的内容。
祝你好运。
看来我会使用这里使用的/端口算法
C# 的另一个库是 diff-match-patch - http://code.google.com/p/google-diff-match-patch/。
它发现字符差异的坏处。好消息是,您必须添加说明以区分单词。