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

本文涉及的产品
NLP自然语言处理_高级版,每接口累计50万次
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_基础版,每接口每天50万次
简介: 自然语言处理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天前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
117 65
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】python之人工智能应用篇——文本生成技术
文本生成是指使用自然语言处理技术,基于给定的上下文或主题自动生成人类可读的文本。这种技术可以应用于各种领域,如自动写作、聊天机器人、新闻生成、广告文案创作等。
20 8
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
【深度学习】探讨最新的深度学习算法、模型创新以及在图像识别、自然语言处理等领域的应用进展
深度学习作为人工智能领域的重要分支,近年来在算法、模型以及应用领域都取得了显著的进展。以下将探讨最新的深度学习算法与模型创新,以及它们在图像识别、自然语言处理(NLP)等领域的应用进展。
16 6
|
1天前
|
机器学习/深度学习 自然语言处理
深度学习在自然语言处理中的应用与挑战
【8月更文挑战第19天】深度学习技术已成为自然语言处理(NLP)领域的一股不可忽视的力量,它通过模拟人脑处理信息的方式,极大地推动了语言识别、机器翻译、情感分析等任务的发展。然而,技术的快速进步也带来了新的挑战,包括数据依赖性强、模型可解释性差等问题。本文将深入探讨深度学习在NLP中的主要应用及其面临的技术障碍,并展望未来的发展方向。
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】自然语言处理NLP概述及应用
自然语言处理(Natural Language Processing,简称NLP)是一门集计算机科学、人工智能以及语言学于一体的交叉学科,致力于让计算机能够理解、解析、生成和处理人类的自然语言。它是人工智能领域的一个关键分支,旨在缩小人与机器之间的交流障碍,使得机器能够更有效地识别并响应人类的自然语言指令或内容。
10 4
|
6天前
|
机器学习/深度学习 自然语言处理 数据可视化
深度学习在自然语言处理中的应用与挑战
【8月更文挑战第14天】本文将深入探讨深度学习技术在自然语言处理领域的应用及其所面临的挑战。我们将分析深度学习如何改变了文本分析、语音识别和机器翻译等领域,并讨论当前技术的局限性以及未来的发展方向。文章旨在为读者提供一个全面的视角,了解深度学习技术在处理人类语言方面的能力及其潜在的改进空间。

热门文章

最新文章