2016-08-11 2 views
1

sagen, dass ich eine Liste mit ähnlich strukturierten Zeichenfolgen in einer Datei gespeichert haben:Wie extrahiere ich die Struktur aus einer Liste von Strings?

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. 

Nun möchte Ich mag die identische Struktur zu extrahieren sowie Teile, die verschiedenen in diesen Strings sind. Im Idealfall sollte ich erhalten:

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"   ] 
] 

Nicht, dass die structure unbekannt und sollte aus der Liste der Zeichenketten berechnet werden. Genauer gesagt ist eine Struktur als die längste gemeinsame Untersequenz definiert, die über alle Zeichenfolgen hinweg möglich ist.

Was ist der einfachste Weg, um dies mit einem Werkzeug oder einer Sprache zu erreichen, die normalerweise in einer Linux-Umgebung zu finden ist?


Edit: zu klären, können diese Strings beliebig sein und müssen nicht in natürlicher Sprache sein. Aber das obige Beispiel ist ziemlich genau das, was ich in 99% der Zeit zu tun erwarte. Ich definiere derzeit "Struktur" als die längste gemeinsame Subsequenz, die über alle Strings möglich ist (es sei denn, die Methode könnte viel einfacher oder schneller sein, wenn ich die Definition etwas nachsichtig mache).

Edit2: Ich sehe ein Missverständnis der Frage in den Antworten. Hier ist die structurenicht vordefiniert und sollte aus die Liste der Zeichenfolgen berechnet werden.

+1

Möchten Sie Informationen aus Structured String extrahieren? Wenn das der Fall ist, wird jede Programmiersprache ausreichen. Wenn Sie Informationen aus Natural Language extrahieren möchten, müssen Sie einen Natural Language Processor wie [link] (https://open-lp.apache.org/) oder den ALchemyApi von IBM watson verwenden, zum Beispiel – ketrox

+0

@ketrox Thanks for die Antwort, aber mein Problem muss wirklich nicht in natürlicher Sprache sein. Es könnte irgendwelche Saiten sein. Mir ist bewusst, dass die Sprache keine Rolle spielt, ich erwähnte das, weil es mir egal ist, in welcher Sprache die Antwort geschrieben ist, solange ich verstehen kann, wie es gemacht wird. – trVoldemort

Antwort

1

Schrieb ich ein kleines Java-Programm, das tut, was ich glaube, Sie brauchen:

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)); 




    } 

} 

Der Ausgang wäre:

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

Hoffnung Dieses Sie weiter hilft. Hinweis: Sie können diesen Code optimieren, um in Details zu verzweigen (Zeichen statt Zeichenfolgen)

Verwandte Themen