4

2 つの文字列を単語単位で比較する必要があります。diff のようなものですが、行ではなく単語です。

ウィキペディアで行われているように http://en.wikipedia.org/w/index.php?title=Horapollo&action=historysubmit&diff=21895647&oldid=21893459

結果として、2 つの文字列が異なる単語のインデックスの 2 つの配列を返したいと思います。

これを実行できる .NET 用のライブラリ/フレームワーク/standalone_methods はありますか?

PS数キロバイトのテキストを比較したい

4

7 に答える 7

4

実際には、DNA配列アラインメントで使用するローカル アラインメント/グローバル アラインメント アルゴリズムのバリエーションを実装したいと思うでしょう。これは、おそらく 2 つの文字列を単語ごとに比較できないためです。すなわち:

速い茶色のキツネは怠惰な犬を
飛び越えます 速いキツネは怠惰な犬を飛び越えます

つまり、単語全体の挿入と削除を識別できない場合、比較アルゴリズムは非常に不正確になる可能性があります。Smith-WatermanアルゴリズムとNeedleman-Wunschアルゴリズムを見て、それらをニーズに適合させる方法を見つけてください。文字列が長い場合、このような検索スペースが非常に大きくなる可能性があるため、BLAST もチェックしてください。BLAST は非常に一般的なヒューリスティック アルゴリズムであり、遺伝子検索のほぼ標準となっています。

于 2010-11-08T01:05:08.070 に答える
3

必要な解決策を見つけたようです:

DiffPlex は、.NET 差分ライブラリと、Silverlight および HTML 差分ビューアーの両方を組み合わせたものです。 http://diffplex.codeplex.com/

しかし、それには1つのバグがあります。「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

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 に答える
1

2 つのテキスト内のすべての単語を一意の数字に置き換え、編集距離の計算用に既製のコードを取得し、その文字と文字の比較を数字と数字の比較に置き換えると、完了です!

まさにあなたが望むライブラリが存在するかどうかはわかりません。しかし、編集距離のコードがたくさん見つかるはずです。

さらに、実際に編集距離の計算で置換を許可するか許可しないかによって、動的計画法コードの条件を変更できます。

これを参照してください。http://en.wikipedia.org/wiki/Levenshtein_distance

于 2009-11-23T22:08:51.100 に答える
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# 用のもう 1 つのライブラリは diff-match-patch です - http://code.google.com/p/google-diff-match-patch/

キャラクターの違いを見つける悪いこと。良いことは、単語を比較するために追加する必要がある指示があります。

于 2011-06-25T11:22:32.413 に答える