// Path: src/main/java/org/xm/tokenizer/Word.java
// public class Word implements Comparable {
//     // 词名
//     private String name;
//     // 词性
//     private String pos;
//     // 权重，用于词向量分析
//     private Float weight;
//     private int frequency;
// 
//     public Word(String name) {
//         this.name = name;
//     }
// 
//     public Word(String name, String pos) {
//         this.name = name;
//         this.pos = pos;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getPos() {
//         return pos;
//     }
// 
//     public void setPos(String pos) {
//         this.pos = pos;
//     }
// 
//     public Float getWeight() {
//         return weight;
//     }
// 
//     public void setWeight(Float weight) {
//         this.weight = weight;
//     }
// 
//     public int getFrequency() {
//         return frequency;
//     }
// 
//     public void setFrequency(int frequency) {
//         this.frequency = frequency;
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hashCode(this.name);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj == null) {
//             return false;
//         }
//         if (getClass() != obj.getClass()) {
//             return false;
//         }
//         final Word other = (Word) obj;
//         return Objects.equals(this.name, other.name);
//     }
// 
//     public String toString(String split) {
//         if (HanLP.Config.ShowTermNature)
//             return name + split + pos;
//         return name;
//     }
// 
//     @Override
//     public String toString() {
//         StringBuilder str = new StringBuilder();
//         if (name != null) {
//             str.append(name);
//         }
//         if (pos != null) {
//             str.append("/").append(pos);
//         }
//         if (frequency > 0) {
//             str.append("/").append(frequency);
//         }
//         return str.toString();
//     }
// 
//     @Override
//     public int compareTo(Object o) {
//         if (this == o) {
//             return 0;
//         }
//         if (this.name == null) {
//             return -1;
//         }
//         if (o == null) {
//             return 1;
//         }
//         if (!(o instanceof Word)) {
//             return 1;
//         }
//         String t = ((Word) o).getName();
//         if (t == null) {
//             return 1;
//         }
//         return this.name.compareTo(t);
//     }
// }


import org.xm.tokenizer.Word;
import java.util.List;
     * 计算相似度分值
     * @param words1 词列表1
     * @param words2 词列表2
     * @return 相似度分值
     */
    @Override
    protected double getSimilarityImpl(List<Word> words1, List<Word> words2) {
        double score = super.getSimilarity(words1, words2);

        score += (scalingFactor * commonPrefixLength() * (1.0 - score));

        return score;
    }

    /**
     * 判断两段文本的共同前缀的字符个数，共同前缀的字符个数如果大于4则按4处理
     * @return 整数闭区间[0, 4]
     */
    private int commonPrefixLength() {
        // shorterText和longerText已经在父类JaroDistanceTextSimilarity中准备好了
        // 这里直接用就可以
        int result = 0;
        int len = shorterText.length();
        for (int i = 0; i < len; i++) {
            if (shorterText.charAt(i) != longerText.charAt(i)) {
                break;
            }
            result++;
            if (result >= MAXIMUM_CHARACTERS) {
                // 最多4个字符即可
// Path: src/main/java/org/xm/tokenizer/Word.java
// public class Word implements Comparable {
//     // 词名
//     private String name;
//     // 词性
//     private String pos;
//     // 权重，用于词向量分析
//     private Float weight;
//     private int frequency;
// 
//     public Word(String name) {
//         this.name = name;
//     }
// 
//     public Word(String name, String pos) {
//         this.name = name;
//         this.pos = pos;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getPos() {
//         return pos;
//     }
// 
//     public void setPos(String pos) {
//         this.pos = pos;
//     }
// 
//     public Float getWeight() {
//         return weight;
//     }
// 
//     public void setWeight(Float weight) {
//         this.weight = weight;
//     }
// 
//     public int getFrequency() {
//         return frequency;
//     }
// 
//     public void setFrequency(int frequency) {
//         this.frequency = frequency;
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hashCode(this.name);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj == null) {
//             return false;
//         }
//         if (getClass() != obj.getClass()) {
//             return false;
//         }
//         final Word other = (Word) obj;
//         return Objects.equals(this.name, other.name);
//     }
// 
//     public String toString(String split) {
//         if (HanLP.Config.ShowTermNature)
//             return name + split + pos;
//         return name;
//     }
// 
//     @Override
//     public String toString() {
//         StringBuilder str = new StringBuilder();
//         if (name != null) {
//             str.append(name);
//         }
//         if (pos != null) {
//             str.append("/").append(pos);
//         }
//         if (frequency > 0) {
//             str.append("/").append(frequency);
//         }
//         return str.toString();
//     }
// 
//     @Override
//     public int compareTo(Object o) {
//         if (this == o) {
//             return 0;
//         }
//         if (this.name == null) {
//             return -1;
//         }
//         if (o == null) {
//             return 1;
//         }
//         if (!(o instanceof Word)) {
//             return 1;
//         }
//         String t = ((Word) o).getName();
//         if (t == null) {
//             return 1;
//         }
//         return this.name.compareTo(t);
//     }
// }


// Path: src/main/java/org/xm/similarity/text/JaroWinklerDistanceTextSimilarity.java
import org.xm.tokenizer.Word;
import java.util.List;

     * 计算相似度分值
     * @param words1 词列表1
     * @param words2 词列表2
     * @return 相似度分值
     */
    @Override
    protected double getSimilarityImpl(List<Word> words1, List<Word> words2) {
        double score = super.getSimilarity(words1, words2);

        score += (scalingFactor * commonPrefixLength() * (1.0 - score));

        return score;
    }

    /**
     * 判断两段文本的共同前缀的字符个数，共同前缀的字符个数如果大于4则按4处理
     * @return 整数闭区间[0, 4]
     */
    private int commonPrefixLength() {
        // shorterText和longerText已经在父类JaroDistanceTextSimilarity中准备好了
        // 这里直接用就可以
        int result = 0;
        int len = shorterText.length();
        for (int i = 0; i < len; i++) {
            if (shorterText.charAt(i) != longerText.charAt(i)) {
                break;
            }
            result++;
            if (result >= MAXIMUM_CHARACTERS) {
                // 最多4个字符即可
                return MAXIMUM_CHARACTERS;