2016-08-11 13 views
1

は、私は、ファイルに保存されている同様の構造文字列のリストを持っていると言う:文字列のリストから構造を抽出するにはどうすればよいですか?

Jenny lives in New York. She is 22 and a machinist. 
Tommy lives in Los Angeles. He is 21 and a ballet dancer. 
Kevin lives in Boston. He is 7 and jobless. 

今私は同じ構造だけでなく、これらの文字列で異なる ている部分を抽出したいと思います。理想的には、私が取得する必要があります。

structure == "%s lives in %s. %se is %d and %s." 
data == [ 
    [ "Jenny" , "New York" , "Sh" , 22 , "a machinist"  ] , 
    [ "Tommy" , "Los Angeles" , "H" , 21 , "a ballet dancer" ] , 
    [ "Kevin" , "Boston"  , "H" , 7 , "jobless"   ] 
] 

ないstructureは不明であり、文字列のリストから計算する必要があること。正確には、構造体は、すべての文字列にわたって可能な最も長い共通サブシーケンスとして定義されています。

Linux環境でよく見られるツールや言語を使用してこれを達成する最も簡単な方法は何ですか?


編集:を明確にするために、これらの文字列は任意であり、自然言語である必要はありません。しかし、上記の例は、私が99%の時間にやると予想しているものです。私は現在、すべての文字列で可能な最も長い共通サブシーケンスとして「構造」を定義しています(定義を少し寛大にすると、メソッドがはるかに簡単または高速になることはできません)。

編集2:回答の質問の誤解があります。ここでstructureであり、事前定義されていないであり、から計算するとの文字列のリストです。

+1

構造化文字列から情報を抽出しようとしていますか?もしそれがどんなプログラミング言語の場合にも当てはまるでしょう。自然言語から情報を抽出する場合は、[リンク](https://opennlp.apache.org/)のような自然言語処理プログラムを使用するか、IBMワトソンのALchemyApiを使用する必要があります。 – ketrox

+0

@ketroxありがとう答えは私の問題は本当に自然言語である必要はありません。任意の文字列を指定できます。私は言語が重要ではないことを認識しています。私はそれがどのように行われるのか理解できる限り、答えがどの言語に書かれているか気にしないので言いました。 – trVoldemort

答えて

1

私は私はあなたが必要だと思うものをないことはほとんどのJavaのprogrammを書いた:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collection; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 

public class Main { 
    static String string1="Jenny lives in NewYork . She is 22 and a machinist."; 
    static String string2="Tommy lives in LosAngeles . He is 21 and a ballet dancer."; 
    static String string3="Kevin lives in Boston . He is 7 and a jobless."; 
    static String string4="Ketrox lives in UnderAbridge . He is 8 and a jobless."; 
    public static String findReferenceString(List<String> data){ 
     Set<String> res =new HashSet<String>(Arrays.asList(data.get(0).split(" "))); 
     for(int i=1; i<data.size();i++){ 
      Set<String> nx=new HashSet<String>(Arrays.asList(data.get(i).split(" "))); 
      res.retainAll(nx); 
      System.out.println(res);//debug 
      } 
     StringBuilder sb=new StringBuilder(); 
     for(String s: res) 
      sb.append(s+' '); 
     return sb.toString(); 

     } 
    public static String extractFromString(String structure,String relevantData){ 
     Set<String> nx=new HashSet<String>(Arrays.asList(structure.split(" "))); 
     Set<String> ny=new HashSet<String>(Arrays.asList(relevantData.split(" "))); 
     ny.removeAll(nx); 
     return ny.toString(); 

    } 

    public static void main(String []args){ 
     List<String> list=new ArrayList<String>(); 
     list.add(string1); 
     list.add(string2); 
     list.add(string3); 
     list.add(string4); 
     System.out.println(extractFromString(findReferenceString(list),string1)); 




    } 

} 

出力は次のようになります。

[a, lives, in, and, is, .] 
[a, lives, in, and, is, .] 
[a, lives, in, and, is, .] 
[22, She, NewYork, Jenny, machinist.] 

希望これは、さらにあなたを助けます。注意:このコードを微調整して詳細(文字列ではなく文字)にすることができます

関連する問題