如何从字符串列表中提取结构?

时间:2016-08-11 20:13:27

标签: linux text-processing data-processing

假设我有一个存储在文件中的类似结构化字符串的列表:

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%的时间里做的事情。我目前将“结构”定义为所有字符串中可能存在的最长公共子序列(除非如果我使定义稍微宽松一点,方法可以更容易或更快)。

Edit2:我在答案中看到了对问题的误解。此处structure 未预定义,应字符串列表计算。

1 个答案:

答案 0 :(得分:1)

我写了一个Java程序,它做了我认为你需要的东西:

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

希望这有助于你进一步发展。注意您可以调整此代码以进入详细信息(字符而不是字符串)