自然语言处理hanlp------6-2字典树的实现

简介: 自然语言处理hanlp------6-2字典树的实现

前言

本章节为原书的

2.4.4首字散列其余二分的字典树

2.4.5前缀树的妙用

主要作为叙述了解即可


提示:以下是本篇文章正文内容,下面案例可供参考


一、首字散列其余二分

首先需要了解散列函数,其实一般也就说的是哈希函数,这个大家就不陌生了。将某个字符输出为对应的散列值,也就说一串整数

例如:

$ python3
>>> hash('池')-hash('江')
2668313623312284569

这是Python的散列,采用Unicode,显然结果 很不友好


再例如:

System.out.println(new Character('池').hashcode() - new Character('江').hashcode())
>输出结果
1

java的散列值明显友好一些,采用utf-16(池江二字已知字符相邻)


java的散列函数输出是[0,65535],用来索引子节点很合适

做法如下:

1.创建一个65535大小的数组

2.将子节点按对应的字符整型值作为下标放入数组中

这样做,每次访问只需要访问对应的下标即可,考虑到汉语中二字词最多,所以结合二分的策略,诞生了本节的字典树,仅在根节点实施散列,其余二分。举例如下图(引用hankcs的原图):

20210106125301710.png

引用上节的效率测评代码之后,首字散列其余二分的算法比二叉树相比而言,最长匹配中文分词速度又得到了一些提升,特别是在逆向和双向,优势更明显。


二、前缀树的妙用

上一节用字典树代替了TreeMap,利用containsKey做分词,速度加快了近一倍,但并没有达到字典树的潜力。


利用字典树的概念,我们可以做的更快,发挥前缀的作用


这种性质如何加速诃典分词呢?在扫描“自然语言处理”这句话的时候,朴素实现会依次查询“自”“自然”“自然语”“自然语言”是否在可典中。但事实上,如果“自然”这条路径不存在于前缀树中,则可以断定一切以“自然”开头的词语都不可能存在。也就是说,在状态转移失败时(由根节点向“自”、由“自”向“自然”的转移),我们就可以提前终止对以“自”开头的扫描,从而节省相当多的时间。


全切分核心代码如下(示例):

public void parseText(String text, AhoCorasickDoubleArrayTrie.IHit<V> processor)
    {
        int length = text.length();
        int begin = 0;
        BaseNode<V> state = this;
        for (int i = begin; i < length; ++i)
        {
            state = state.transition(text.charAt(i));
            if (state != null)
            {
                V value = state.getValue();
                if (value != null)
                {
                    processor.hit(begin, i + 1, value);
                }
            }
            else
            {
                i = begin;
                ++begin;
                state = this;
            }
        }
    }


最长匹配核心代码如下(示例):

public void parseLongestText(String text, AhoCorasickDoubleArrayTrie.IHit<V> processor)
    {
        int length = text.length();
        for (int i = 0; i < length; ++i)
        {
            BaseNode<V> state = transition(text.charAt(i));
            if (state != null)
            {
                int to = i + 1;
                int end = to;
                V value = state.getValue();
                for (; to < length; ++to)
                {
                    state = state.transition(text.charAt(to));
                    if (state == null) break;
                    if (state.getValue() != null)
                    {
                        value = state.getValue();
                        end = to + 1;
                    }
                }
                if (value != null)
                {
                    processor.hit(i, end, value);
                    i = end - 1;
                }
            }
        }
    }

其实我们不必深究代码怎么去写,但一定要去了解每段代码是什么原理,为什么这样写,可能说起来有些矛盾,懂得都懂。


测试

利用状态转移的技巧,前缀树的作用就发挥出来了,同样进行上节的测试,速度差异就明显了,同样用原书展示:

20210106133857550.png

over!

相关文章
|
存储 自然语言处理
自然语言处理hanlp------9基于双数组字典树的AC自动机
自然语言处理hanlp------9基于双数组字典树的AC自动机
自然语言处理hanlp------9基于双数组字典树的AC自动机
|
存储 自然语言处理 算法
自然语言处理hanlp------7-2双数组字典树(*初学者可选择性学习)
自然语言处理hanlp------7-2双数组字典树(*初学者可选择性学习)
自然语言处理hanlp------7-2双数组字典树(*初学者可选择性学习)
|
自然语言处理 算法 Java
自然语言处理hanlp------7-1双数组字典树
自然语言处理hanlp------7-1双数组字典树
自然语言处理hanlp------7-1双数组字典树
|
自然语言处理 算法 Java
自然语言处理hanlp------6-1字典树的实现
自然语言处理hanlp------6-1字典树的实现
自然语言处理hanlp------6-1字典树的实现
|
2月前
|
机器学习/深度学习 自然语言处理 监控
利用深度学习技术实现自然语言处理中的情感分析
本文将深入探讨如何利用深度学习技术在自然语言处理领域中实现情感分析。通过介绍情感分析的背景和原理,结合深度学习模型如LSTM、BERT等的应用,帮助读者了解情感分析的重要性以及如何利用最新技术实现更准确的情感识别。
|
2月前
|
机器学习/深度学习 自然语言处理 算法
探索机器学习中的自然语言处理技术
【2月更文挑战第16天】 在数字化和智能化的浪潮中,自然语言处理(NLP)技术已成为连接人类与机器沟通的重要桥梁。本文深入探讨了机器学习在自然语言处理中的应用,包括最新的模型架构、算法优化技巧及实际场景中的挑战和解决方案。通过逻辑严密的分析,我们将揭示如何有效利用机器学习提升NLP系统的性能,同时对未来发展趋势进行预测。
23 0
|
2月前
|
机器学习/深度学习 自然语言处理 监控
利用深度学习技术实现自然语言处理中的情感分析
本文将深入探讨如何利用深度学习技术,特别是神经网络模型,来实现自然语言处理领域中的情感分析任务。通过结合深度学习算法和大规模文本数据集,可以实现更准确和高效的情感分析,为情感识别和情感推断提供更好的解决方案。
|
2月前
|
机器学习/深度学习 自然语言处理
自然语言处理技术(NLP)
自然语言处理技术(NLP)
41 1
|
3月前
|
自然语言处理
举例说明自然语言处理(NLP)技术
举例说明自然语言处理(NLP)技术
18 0
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
springboot基于人工智能和自然语言理解技术的医院智能导医系统源码
智能导诊系统可为患者提供线上挂号智能辅助服务,患者根据提示手动输入自己的基本症状,通过智能对话方式,该系统会依据大数据一步步帮助患者“诊断”,并最终推荐就医的科室和相关专家。患者可自主选择,实现“一键挂号”。这一模式将精确的导诊服务前置,从源头上让医疗服务更高效。
373 2