我想找到将字符串相互比较的方法,以便理解以下示例中 s1 和 s2 之间没有区别。
String s1 = "John: would you please one the door";
String s2 = "John: would you please one the door ????";
我该怎么办?
字符串之间的相似性概念使用字符串指标进行描述。字符串指标的一个基本示例是列文施泰因距离(通常称为编辑距离)。
维基教科书提供了这种算法的Java实现 http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#Java:
有什么好的技术。但是摆脱多个空格和插入可能是一个开始。
String s1, s2;
s1 = s1.replaceAll(" {2,}", " ").replaceAll("[.?!/\()]", "").trim();
s2 = s2.replaceAll(" {2,}", " ").replaceAll("[.?!/\()]", "").trim();
if (s1.equalsIgnoreCase(s1))
{
}
适用于字符串演示的演示:http://ideone.com/FSHOJt
相似意味着存在共性。 这是一个不平凡的问题。 您真正需要的是相关性分数和分面搜索。 这通常是通过将字符串标记为其基本单词并检查结果中是否存在公共基本单词来完成的。 举个具体的例子:
"朦胧的身影落在了他们身上。"
您可以将其分解为几个方面:
shadow
figure
fell
其中每个都可以用同义词进行评估:
shadow -> dark, shade, silhouette, etc...
figure -> statistic, number, quantity, amount, level, total, sum, silhouette, outline, shape, form, etc...
fell -> cut down, chop down, hack down, saw down, knock down/over, knock to the ground, strike down, bring down, bring to the ground, prostrate, etc...
然后对比较字符串执行相同的操作,并计算共同的方面。 越常见的方面,匹配的相关性就越高。
开源社区中有很多相当重量级的工具,如Lucene和Solr来解决这个问题,但你可以通过将字符串分解为令牌并简单地寻找常见的令牌来做一个简单的版本。 一个简单的例子:
public class TokenExample {
public static HashMap<String, Integer> tokenizeString(String s)
{
// process s1 into tokens
HashMap<String, Integer> map = new HashMap<String, Integer>();
for (String token : s.split("\s+"))
{
// normalize the token
token = token.toLowerCase();
if ( map.containsKey(token) )
{
map.put(token, map.get(token)+1);
}
else
{
map.put(token, 1);
}
}
return map;
}
public static Integer getCommonalityCount(String s1, String s2)
{
HashMap<String, Integer> map1 = tokenizeString(s1);
HashMap<String, Integer> map2 = tokenizeString(s2);
Integer commonIndex = 0;
for (String token : map1.keySet())
{
if ( map2.containsKey(token))
{
commonIndex += 1;
// you could instead count for how often they match like this
// commonIndex += map2.get(token) + map1.get(token);
}
}
return commonIndex;
}
public static void main(String[] args) {
String s1 = "John: would you please one the door";
String s2= "John: would you please one the door ????";
String s3 = "John: get to the door and open it please ????";
String s4= "John: would you please one the door ????";
System.out.println("Commonality index: " + getCommonalityCount(s1, s2));
System.out.println("Commonality index: " + getCommonalityCount(s3, s4));
}
}
这个问题有多种方法,解决这个问题的简单方法是使用Levenshtein距离。另一种方法是余弦相似性。您需要更多详细信息,请发表评论。