假设我有一个存储在文件中的类似结构化字符串的列表:
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
未预定义,应从字符串列表计算。
答案 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.]
希望这有助于你进一步发展。注意您可以调整此代码以进入详细信息(字符而不是字符串)