2013-02-01 4 views
7

改行に関係なく2つのドキュメントを比較したいと思います。コンテンツが同じだが改行の位置と量が異なる場合は、あるドキュメントの行を別のドキュメントの行にマップしたいと思います。正規表現を使用して2つのドキュメントを比較する

は考える:私は文献1にその行1を決定できるアルゴリズムは5を通してライン1と同じテキストが含まれていたい

文献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. 

を文献2では、文献1の2行目と3行目は、文献2の6行目と同じテキストを含むことになる。

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

他のドキュメントの複数の行にまたがっている場合、各ドキュメントの各行に正規表現を使用する方法はありますか?

+0

数字は何ですか? –

+0

1つの方法は、両方の入力を単語に分割して、それらの単語の出現を維持し、単語が1つずつ(単語が同じであると仮定して)対応させることです。 – nneonneo

+0

各文書と一致する行 – hmghaly

答えて

0

あなたはDOC1の各行を反復処理し、このような何かを行うことができます。

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

は次に、この検索文字列を使用してDOC2の検索を行います。

match = re.search(searchstring, contents)

matchNULLであれば、一致するものがありませんでした。そうでなければ 、match.group(0)はそれは「\ nを」によると、彼らはから来たDOC2内のどの行を考え出すことを分割する簡単なエクササイズですあなたのdoc 2.

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

のマッチングの内容を提供します。

2

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

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

linemappingsがループを開始呼ばれる整数のコレクションのコレクションを作成します。ループは各文書の各文字を同時に処理します。 4つのカウンタ変数が必要です。 charindex1は、特許文献1に、現在の文字インデックスが含まれ、charindex2は、文献1に現在の行のインデックスが含まれています文献2 lineindex1で現在charaterインデックスが含まれていますし、lineindex2は2.

スタートドキュメント内の現在の行のインデックスが含まれていますcharインデックス変数を0に、ラインインデックス変数を1に初期化します。

スタートループ:

各文書から現在の文字を取得します:文書2から文書1からchar1char2

char1char2が、その後、BOTH改行がされていないか、したりすることはありません改行がある場合charindex1charindex2の両方を1進める。が改行の場合は、どちらかchar1またはchar2が改行の場合、linemappingsコレクションに新しいレコードを挿入し、その後、1

charindex2を進め、改行である場合(最後の結果は何かだろうエルス1.
によって210等[[1,1],[1,2],[1,3],[1,4],[1,5],[2,6],[3,6],[4,7],[5,7],[6,7],[6,8]

char1が改行である場合に、char2が改行である場合、1

0123によって lineindex2を前進1
によって lineindex1を前進

入力が終わるまでループします。

(私はPythonプログラマじゃないので、私は本当にこれをテストができませんでしたが、うまくいけば、あなたが要点を取得し、あなたのニーズに合わせてそれを変更することができます。)

+0

@TerryLiにはより良い答えがあります。私はそれを個人的にやります。 – JDB

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番目の行まで見た単語の数を格納します。次に、両方の配列の等しい要素を識別します。これらの要素のインデックスは出力の範囲を定義します。

関連する問題