文本相似度、差异、搜索、修补

文本相似度、差异、搜索、修补

使用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

  1. Diff:
    • 比较两个纯文本块并有效地返回差异列表。
    • Diff Demo
  2. Match:
    • 给定一个搜索字符串,在纯文本块中找到其最佳模糊匹配项。根据准确性和位置进行加权。
    • Match Demo
  3. Patch:
    • 将修补程序列表应用于纯文本。即使基础文本不匹配,也要尽最大努力应用修补程序。
    • Patch Demo

该库最初构建于 2006 年,旨在为 Google Docs 提供支持,现在提供 C++、C#、Dart、Java、JavaScript、Lua、Objective C 和 Python 版本。