NLP open source forme près de l'algorithme de mots liste de mots similaires (extra)

Objet de la création

Au niveau national, il existe de nombreux outils open source pour le calcul de similarité de texte.

Cependant, pour le calcul de la similarité entre deux caractères chinois, il y a essentiellement un blanc en Chine. Il existe très peu de documents de référence nationaux, et il en va de même pour les documents étrangers connexes.

Le but de ce projet est de lancer des briques et de lancer du jade, de réaliser un outil basique de calcul de similarité, et de contribuer un peu à la PNL des caractères chinois.

Lecture recommandée:

Forme chinoise PNL près de l'idée de calcul de similarité de mot

Réalisation de l'algorithme de similarité des caractères chinois et des caractères proches, apportant une petite contribution au NLP des caractères chinois

Quel est le caractère chinois le plus cher de la Chine contemporaine ?

Forme open source NLP près du plan d'achèvement de l'algorithme de mot (fin)

NLP Open Source Shape Near Word Algorithm Liste de Shape Near Words (Extra)

Projet open source en ligne Conversion chinois traditionnel et simplifié / Mots sensibles / Pinyin / Segmentation de mots / Similitude des caractères chinois / Annuaire de démarquage

insérez la description de l'image ici

besoin

Parfois, nous n'avons pas besoin de renvoyer la similarité de deux caractères, mais nous devons renvoyer une liste similaire de caractères chinois.

Idées de mise en œuvre

Nous pouvons calculer la similitude entre tous les caractères chinois séparément, puis conserver les 100 plus grands et les mettre dans le dictionnaire.

Interrogez ensuite le dictionnaire en temps réel.

Méthode pour réaliser

bihuashu_2w.txtCe dont nous avons principalement besoin, ce sont les caractères chinois communs 2W correspondants.

hanzi_similar_list.txtIl est utilisé pour stocker la relation de mappage entre les caractères chinois et les caractères similaires.

initialisation des données

public static void main(String[] args) {
    final String path = "D:\\code\\coin\\nlp-hanzi-similar\\src\\main\\resources\\hanzi_similar_list.txt";
    // 读取列表
    List<String> lines = FileUtil.readAllLines("D:\\code\\coin\\nlp-hanzi-similar\\src\\main\\resources\\nlp\\bihuashu_2w.txt");
    // 所有的单词
    Set<String> allWordSet = new HashSet<>();
    for(String line : lines) {
        String word = line.split(" ")[0];
        allWordSet.add(word);
    }
    // 循环对比
    for(String word : allWordSet) {
        List<String> list = getSimilarListData(word, allWordSet);
        String line = word +" " + StringUtil.join(list, "");
        FileUtil.append(path, line);
    }
}
复制代码
  • La file d'attente prioritaire prend les 100 premiers

Nous stockons via la file d'attente prioritaire :

private static List<String> getSimilarListData(String word, Set<String> wordSet) {
    PriorityQueue<SimilarListDataItem> items = new PriorityQueue<>(new Comparator<SimilarListDataItem>() {
        @Override
        public int compare(SimilarListDataItem o1, SimilarListDataItem o2) {
            // 相似度大的放在前面
            return -o1.getRate().compareTo(o2.getRate());
        }
    });
    for(String other : wordSet) {
        if(word.equals(other)) {
            continue;
        }
        // 对比
        double rate = HanziSimilarHelper.similar(word.charAt(0), other.charAt(0));
        SimilarListDataItem item = new SimilarListDataItem(other, rate);
        items.add(item);
    }
    final int limit = 100;
    List<String> wordList = new ArrayList<>();
    for(SimilarListDataItem item : items) {
        wordList.add(item.getWord());
        if(wordList.size() >= limit) {
            break;
        }
    }
    return wordList;
}
复制代码

obtenir des mots similaires

Après initialisation des données, tout devient très simple :

  • Définition des interfaces
/**
 * 数据接口-相似列表
 * @author binbin.hou
 * @since 1.3.0
 */
public interface IHanziSimilarListData {

    /**
     * 返回数据信息
     * @param word 单词
     * @return 结果
     * @since 1.3.0
     */
    List<String> similarList(String word);

}
复制代码
  • collecte de données
public class HanziSimilarListData implements IHanziSimilarListData {

    private static volatile Map<String, List<String>> map = Guavas.newHashMap();


    @Override
    public List<String> similarList(String word) {
        if(MapUtil.isEmpty(map)) {
            initDataMap();
        }

        return map.get(word);
    }

    private void initDataMap() {
        if(MapUtil.isNotEmpty(map)) {
            return;
        }

        //DLC
        synchronized (map) {
            if(MapUtil.isEmpty(map)) {
                List<String> lines = StreamUtil.readAllLines("/hanzi_similar_list.txt");

                for(String line : lines) {
                    String[] words = line.split(" ");
                    // 后面的100个相近词
                    List<String> list = StringUtil.toCharStringList(words[1]);
                    map.put(words[0], list);
                }
            }
        }
    }

}
复制代码

commodité

Pour la commodité des utilisateurs, nous ajoutons 2 méthodes de classe d'outils HanziSimilarHelperdans :

/**
 * 相似的列表
 * @param hanziOne 汉字一
 * @param limit 大小
 * @return 结果
 * @since 1.3.0
 */
public static List<String> similarList(char hanziOne, int limit) {
    return HanziSimilarBs.newInstance().similarList(hanziOne, limit);
}
/**
 * 相似的列表
 * @param hanziOne 汉字一
 * @return 结果
 * @since 1.3.0
 */
public static List<String> similarList(char hanziOne) {
    return similarList(hanziOne, 10);
}
复制代码

Effet d'essai

Utilisons-le pour voir l'effet :

Jetons un coup d'œil aux caractères similaires de "l'amour".

List<String> list = HanziSimilarHelper.similarList('爱');
Assert.assertEquals("[爰, 爯, 受, 爭, 妥, 憂, 李, 爳, 叐, 雙]", list.toString());
复制代码

adresse open source

Afin de faciliter l'utilisation et l'apprentissage par tous, le projet a été open source.

github.com/houbb/nlp-h…

résumé

La forme d'un personnage peut faire beaucoup de choses intéressantes, cela dépend de l'imagination de chacun.

La méthode de mise en œuvre n'est pas difficile et le cœur est le calcul de la similarité.

Je suis un vieux cheval, j'ai hâte de vous rencontrer la prochaine fois.

Guess you like

Origin juejin.im/post/7215454235047542840