2016-08-11 74 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

您是否试图从结构化字符串中提取信息?如果这是比任何编程语言都足够的情况。如果你正在寻找从自然语言中提取信息,那么你需要使用像[link](https://opennlp.apache.org/)这样的自然语言处理器,或者使用IBM watson的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.] 

希望这进一步帮助您。请注意,您可以调整此代码以查看详细信息(字符而不是字符串)