7

改行に関係なく 2 つの文書を比較したい。内容は同じでも改行の位置や量が違う場合、一方の文書の行を他方の文書の行にマッピングしたい。

与えられた:

資料1

I went to Paris in July 15, where I met some nice people.
And I came back
to NY in Aug 15.
I am planning
to go there soon
after I finish what I do.

資料2

I went
to Paris
in July 15,
where I met
some nice people.
And I came back to NY in Aug 15.
I am planning to go
there soon after I finish what I do.

ドキュメント 1 の 1 行目にドキュメント 2 の 1 行目から 5 行目までと同じテキストが含まれていること、ドキュメント 1 の 2 行目と 3 行目にドキュメント 2 の 6 行目と同じテキストが含まれていることなどを判断できるアルゴリズムが必要です。

1 = 1,2,3,4,5
2,3 = 6
4,5,6 = 7,8

正規表現が他のドキュメントの複数の行にまたがる場合、各ドキュメントの各行を一致させる方法はありますか?

4

3 に答える 3

3
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.commons.io.FileUtils;

public class Compare {
    public static void main(String[] args) throws IOException {
        String doc1 = FileUtils.readFileToString(new File("Doc1.txt"));
        String doc2 = FileUtils.readFileToString(new File("Doc2.txt"));
        String[] array1 = doc1.split("\n");
        String[] array2 = doc2.split("\n");
        int[] count1 = new int[array1.length];
        int[] count2 = new int[array2.length];
        int sum1 = 0;
        int sum2 = 0;
        for (int i=0;i<count1.length;i++) {
            count1[i] = sum1 + array1[i].split(" ").length;
            sum1 = count1[i];
        }
        for (int i=0;i<count2.length;i++) {
            count2[i] = sum2 + array2[i].split(" ").length;
            sum2 = count2[i];
        }
        ArrayList<Integer> result1 = new ArrayList<Integer>();
        ArrayList<Integer> result2 = new ArrayList<Integer>();
        for (int j=0; j<count1.length; ) {
            for (int k=0; k<count2.length; ) {
                if (count1[j]==count2[k]) {
                    result1.add(j+1);
                    result2.add(k+1);
                    System.out.println(result1.toString()+" = "+result2.toString());
                    result1 = new ArrayList<Integer>();
                    result2 = new ArrayList<Integer>();
                    j++;k++;
                } else if (count1[j]>count2[k]) {
                    result2.add(k+1);
                    k++;
                } else {
                    result1.add(j+1);
                    j++;
                }
            }
        }
    }
}

サンプル出力:

[1] = [1, 2, 3, 4, 5]
[2, 3] = [6]
[4, 5, 6] = [7, 8]

完全で機能するJavaコード。これは正規表現ソリューションではないため、ニーズに合わない可能性があります。

アイデアは、ドキュメントごとに配列を作成することです。配列のサイズは、各ドキュメントの行数と同じです。配列のn番目の要素には、ドキュメントのn行目までに表示される単語の数が格納されます。次に、両方の配列でこれらの等しい要素を識別します。これらのインデックスは、出力の範囲を定義します。

于 2013-02-01T19:44:03.813 に答える
2

私はPythonプログラマーではありませんが、これは正規表現で解決できる問題のようには見えません。

代わりに、最初にドキュメントを比較して、内容が同じであることを確認する必要があります(事前にすべての改行を一時的に削除します)。そうでなければ、あなたが何をしたいのかわからないので、私はそれに対処するつもりはありません。

と呼ばれる整数コレクションのコレクションを作成しますlinemappings

ループを開始します。ループは、各ドキュメントの各文字を同時にステップスルーします。4つのカウンター変数が必要です。charindex1ドキュメント1の現在の文字インデックスとドキュメント2の現在の文字インデックスがcharindex2含まれます。lineindex1ドキュメント1lineindex2の現在の行インデックスとドキュメント2の現在の行インデックスが含まれます。

charインデックス変数を0に、ラインインデックス変数を1に初期化して開始します。

ループの開始:

各ドキュメントから現在の文字を取得します:char1ドキュメント1とchar2ドキュメント2から。

char1ANDが両方の改行であるか、どちらも改行でない場合は、両方と1char2ずつ進みます。ElseIfが改行の 場合は、 1ずつ進みます 。ElseIfが改行の場合は、1ずつ進みます。 charindex1charindex2
char1charindex1
char2charindex2

char1またはが改行の場合char2は、コレクションに新しいレコードを挿入しますlinemappings(最後の結果は次のようになります[[1,1],[1,2],[1,3],[1,4],[1,5],[2,6],[3,6],[4,7],[5,7],[6,7],[6,8]

char1が改行の場合は1ずつ進みますlineindex1。が改行の
場合char2は1ずつ進みますlineindex2

入力の終わりに達するまでループします。

(私はPythonプログラマーではないため、これを実際にテストすることはできませんでしたが、要点を理解し、ニーズに合わせて変更できることを願っています。)

于 2013-02-01T19:23:32.560 に答える
0

doc1 の各行を反復して、次のようにすることができます。

searchstring = line.replace(' ', '[ |\n]')

次に、この検索文字列を使用して doc2 を検索します。

match = re.search(searchstring, contents)

の場合、一致はありませんでしたmatchNULLそれ以外のmatch.group(0)場合は、doc 2 の一致するコンテンツが表示されます。

'I went\nto Paris\nin July 15,\nwhere I met\nsome nice people.'

次に、それを '\n' で分割し、doc2 のどの行から来たかを割り出す簡単な演習です。

于 2013-02-01T18:59:43.117 に答える