使用Apache Commons Text计算字符串相似度
添加依赖
如果你使用的是Maven,可以在 pom.xml中添加以下依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.12.0</version>
</dependency>
示例代码
import org.apache.commons.text.similarity.LevenshteinDistance;
import org.apache.commons.text.similarity.JaccardSimilarity;
import org.apache.commons.text.similarity.CosineSimilarity;
public class TextSimilarity {
public static void main(String[] args) {
String str1 = "kitten";
String str2 = "sitting";
// Levenshtein Distance
LevenshteinDistance levenshtein = new LevenshteinDistance();
int distance = levenshtein.apply(str1, str2);
System.out.println("Levenshtein Distance: " + distance);
// Jaccard Similarity
JaccardSimilarity jaccard = new JaccardSimilarity();
double jaccardSim = jaccard.apply(str1, str2);
System.out.println("Jaccard Similarity: " + jaccardSim);
// Cosine Similarity
CosineSimilarity cosine = new CosineSimilarity();
double cosineSim = cosine.cosineSimilarity(getFrequencyVector(str1), getFrequencyVector(str2));
System.out.println("Cosine Similarity: " + cosineSim);
}
private static Map<CharSequence, Integer> getFrequencyVector(String str) {
Map<CharSequence, Integer> freqMap = new HashMap<>();
for (char c : str.toCharArray()) {
freqMap.put(String.valueOf(c), freqMap.getOrDefault(String.valueOf(c), 0) + 1);
}
return freqMap;
}
}
Diff Match Patch
Diff Match 和 Patch 库提供了强大的算法来执行同步纯文本所需的操作。
仓库:https://github.com/google/diff-match-patch
- Diff:
- 比较两个纯文本块并有效地返回差异列表。
- Diff Demo
- Match:
- 给定一个搜索字符串,在纯文本块中找到其最佳模糊匹配项。根据准确性和位置进行加权。
- Match Demo
- Patch:
- 将修补程序列表应用于纯文本。即使基础文本不匹配,也要尽最大努力应用修补程序。
- Patch Demo
该库最初构建于 2006 年,旨在为 Google Docs 提供支持,现在提供 C++、C#、Dart、Java、JavaScript、Lua、Objective C 和 Python 版本。