4

我需要逐字比较两个字符串。类似于 diff 的东西,但是对于文字,而不是对于线条。

就像在维基百科 http://en.wikipedia.org/w/index.php?title=Horapollo&action=historysubmit&diff=21895647&oldid=21893459

结果我想返回两个单词索引的两个数组,它们在两个字符串中是不同的。

.NET 是否有任何库/框架/独立方法可以做到这一点?

PS我想比较几千字节的文本

4

7 回答 7

4

实际上,您可能想要实现我们在 DNA序列比对中使用的局部比对/全局比对算法的变体。这是因为您可能无法对两个字符串进行逐字比较。IE:

敏捷的棕色狐狸跳过懒惰的狗
敏捷的狐狸跳过懒惰的狗

换句话说,如果您无法识别整个单词的插入和删除,您的比较算法可能会变得非常严重。看看Smith-Waterman算法和Needleman-Wunsch算法,并找到一种方法来使它们适应您的需求。由于如果字符串很长,这样的搜索空间会变得非常大,您还可以查看 BLAST。BLAST 是一种非常常见的启发式算法,几乎是遗传搜索的标准。

于 2010-11-08T01:05:08.070 回答
3

看来我找到了需要的解决方案:

DiffPlex 是 .NET 差异库与 Silverlight 和 HTML 差异查看器的组合。 http://diffplex.codeplex.com/

但它有一个错误。在“Hello-Kitty”“Hello - Kitty”这些行中,“Hello”这个词将被标记为差异。虽然区别是空间符号。

于 2010-12-01T16:28:56.820 回答
2

使用正则表达式。

就像在示例中一样:

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));
        }
    }
}
于 2009-11-27T15:42:29.157 回答
1

您可以用唯一的数字替换 2 个文本中的所有单词,使用一些现成的代码进行编辑距离计算,并将其字符与字符的比较替换为数字与数字的比较,您就完成了!

我不确定是否存在任何你想要的库。但是你肯定会发现很多编辑距离的代码。

此外,根据您是否真的希望在编辑距离计算中允许替换,您可以更改动态编程代码中的条件。

看到这个。http://en.wikipedia.org/wiki/Levenshtein_distance

于 2009-11-23T22:08:51.100 回答
1

你可以试试这个,虽然我不确定你在找什么 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 或源代码以查看可以找到的内容。

祝你好运。

于 2009-11-23T22:10:53.310 回答
0

看来我会使用这里使用的/端口算法

http://www.google.com/codesearch/p?hl=en&sa=N&cd=6&ct=rc#Jc4aufN53J8/src/main/net/killingar/WordDiff.java&q=worddiff

于 2009-11-25T03:10:35.657 回答
0

C# 的另一个库是 diff-match-patch - http://code.google.com/p/google-diff-match-patch/

它发现字符差异的坏处。好消息是,您必须添加说明以区分单词。

于 2011-06-25T11:22:32.413 回答