Hanlp之理解用户自定义词典(java版本)

首先说明,由于本人水平有限,文章纰漏以及不妥之处还请指出,不胜感激;

理解hanlp中用户自定义词典(java)

  1. 什么是hanlp用户自定义字典?为什么要有用户自定义词典?
    在Hanlp分词中,不管是标准分词器、NLP分词器还是索引分词器都不可能每次都准确的将我们希望的结果词语分出来,尤其是我们平常用到的自定义名词或者流行语,比如:“印象笔记”、“奥利给”等,分析语句一长,分词准确性还会继续下降,这时就需要我们利用用户自定义词典,来进行这些词语的记录,方便分词器依据用户词典来进行分词,提高准确度。
    Hanlp

  2. 用户自定义词典中的词在分词时一定会被准确无误的区分出来吗?
    我们需要知道准确无误这样的形容词在形容分词这项工作就是不恰当的,在分词工作中,对分词结果评判的标准是不确定的,在官方FAQ中有这样的例子:

假如用户词典中一共3个词语:商品和服服务,那么“商品和服务”到底怎么分才能满足这些用户呢?无论怎么分词,这3个词语都不可能同时出现。

也许你以为往词典中添加“川普”,并且用户词典优先级最高的话,就可以解决眼前的“普京与川普 通话”这个句子。但在你没注意到的地方,有更多类似“四川普通话”“银川普通高考”“唐纳德·川普”(本该是一个词)的句子会发生错误。

所以说,词典≠中文分词

在了解了上述两个问题之后,我们就开始进行用户自定义词典的分析了。

下载Hanlp数据包后,默认位置是在Hanlp配置目录下的data\dictionary\custom,CustomDictionary是一份全局的用户自定义词典,可以随时增删,影响全部分词器。另外可以在任何分词器中关闭它。下图是CustomDictionary在windows OS中的位置;
目录位置
我们点开它,发现了一些词语,仔细观察我们会发现这些词的组织是有一定的规律的;
内部1

  • 每一行代表一个单词,格式遵从[单词] [词性A] [A的频次] [词性B] [B的频次] … 如果不填词性则表示采用词典的默认词性。

  • 词典的默认词性默认是名词n,可以通过配置文件修改:全国地名大全.txt ns;如果词典路径后面空格紧接着词性,则该词典默认是该词性。
    我们打开Hanlp的配置文件,在箭头指向位置可以看到自定义词典的路径,词典名有后缀的就是设置了词条默认词性,默认名词;在这里插入图片描述
    词性表请参照《HanLP词性标注集》

  • 在统计分词中,并不保证自定义词典中的词一定被切分出来。用户可在理解后果的情况下通过Segment#enableCustomDictionaryForcing强制生效。
    我们在之前已经讨论过这个问题,如果你实在需要词典中的词被完整的分出来,可以使用此方法来开启强制分词。

我们也可以添加词典

  • CustomDictionary主词典文本路径是data/dictionary/custom/CustomDictionary.txt,用户可以在此增加自己的词语(不推荐);也可以单独新建一个文本文件,通过配置文件CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 我的词典.txt;来追加词典(推荐)。
    缓存在这里插入图片描述

  • 始终建议将相同词性的词语放到同一个词典文件里,便于维护和分享。
    特别注意:
    ①通过代码进行词语的增删并不会影响到词典;
    ②在词典进行更改后,必须删除词典缓存,在下一次载入词典时更改才会生效;
    ③词典缓存和词典在同一目录下,后缀一般是.bin。有时候是.trie.dat和.trie.value。它们是历史遗留产物;
    在这里插入图片描述
    现在是时候进入代码,仔细观察了。这是文档给出的一段代码:

/**1. 演示用户词典的动态增删2.  3. @author hankcs*/
public class DemoCustomDictionary
{public static void main(String[] args){// 动态增加CustomDictionary.add("攻城狮");// 强行插入CustomDictionary.insert("白富美", "nz 1024");// 删除词语(注释掉试试)
//        CustomDictionary.remove("攻城狮");System.out.println(CustomDictionary.add("单身狗", "nz 1024 n 1"));System.out.println(CustomDictionary.get("单身狗"));String text = "攻城狮逆袭单身狗,迎娶白富美,走上人生巅峰";  // 怎么可能噗哈哈!// AhoCorasickDoubleArrayTrie自动机扫描文本中出现的自定义词语final char[] charArray = text.toCharArray();CustomDictionary.parseText(charArray, new AhoCorasickDoubleArrayTrie.IHit<CoreDictionary.Attribute>(){@Overridepublic void hit(int begin, int end, CoreDictionary.Attribute value){System.out.printf("[%d:%d]=%s %s\n", begin, end, new String(charArray, begin, end - begin), value);}});// 自定义词典在所有分词器中都有效System.out.println(HanLP.segment(text));}
}

我们通过源代码查看一下选中的几个方法:
在这里插入图片描述

add(String) : boolean

 /*** 往自定义词典中插入一个新词(非覆盖模式)<br>*     动态增删不会持久化到词典文件** @param word                新词 如“裸婚”* @return 是否插入成功(失败的原因可能是不覆盖等,可以通过调试模式了解原因)*/public static boolean add(String word){if (HanLP.Config.Normalization) word = CharTable.convert(word);if (contains(word)) return false;return insert(word, null);}

insert(String) : boolean

/*** 以覆盖模式增加新词<br>*     动态增删不会持久化到词典文件** @param word* @return*/public static boolean insert(String word){return insert(word, null);}

get(String) : Attribute

 /*** 查单词** @param key* @return*/public static CoreDictionary.Attribute get(String key){if (HanLP.Config.Normalization) key = CharTable.convert(key);CoreDictionary.Attribute attribute = dat.get(key);if (attribute != null) return attribute;if (trie == null) return null;return trie.get(key);}

remove(String) : void

    /*** 删除单词<br>*     动态增删不会持久化到词典文件** @param key*/public static void remove(String key){if (HanLP.Config.Normalization) key = CharTable.convert(key);if (trie == null) return;trie.remove(key);}

源代码正在研究,考完六级再来补…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python-聚类图像分割

K-Means聚类图像分割 图像分割&#xff1a; 利用图像的灰度&#xff0c;颜色&#xff0c;纹理&#xff0c;形状等特征&#xff0c;把图像分成若干个互不重叠的区域&#xff0c;并使这些特征在同一区域内呈现相似性&#xff0c;在不同区域之间存在明显的差异性。然后&#xff0c…

科学家揭秘大脑靠“旋转”区分过去和现在,还给了个AI架构设计新思路 | Nature子刊...

来源&#xff1a;量子位 过去和现在的边界&#xff0c;到底在哪里&#xff1f;人类&#xff0c;又是如何在时间混沌中区分出过往与当下的&#xff1f;注意&#xff0c;这不是一个哲学问题。&#xff08;手动狗头&#xff09;而是科学家们的最新研究。两个普林斯顿的神经学家&am…

Hanlp中自定义词典的配置、引用以及问题解决

文章目录如何阅读本文&#xff1f;Hanlp用户自定义词典引用简介操作步骤环境创建编辑词典文件将用户自定义词典路径加入配置文件删除缓存文件如何阅读本文&#xff1f; 首先我们对Hanlp用户词典进行简介&#xff0c;推荐首先阅读链接文章&#xff0c;它是本文的第一来源&#…

有监督学习

有监督学习 利用一组带有标签的数据&#xff0c;学习从输入到输出的映射&#xff0c;然后将这种映射关系应用到未知数据上&#xff0c;达到分类或回归的目的。 分类&#xff1a;当输出为离散的&#xff0c;学习任务为分类任务。回归&#xff1a;当输出为连续的&#xff0c;学习…

深度学习助力网络科学:基于深度学习的社区发现最新综述

来源&#xff1a;AMiner科技论文题目&#xff1a;A Comprehensive Survey on Community Detection with Deep Learning论文网址&#xff1a;https://arxiv.org/pdf/2105.12584.pdf近日&#xff0c;澳大利亚麦考瑞大学计算机学院人工智能与数据科学实验室联合中科院数学与系统科…

Neo4j 图创建1 以BiliBili粉丝UP主之间的关系为例

基本关系图如下&#xff0c;不给出细节 其中所有粉丝名为杜撰&#xff0c;如有雷同纯属巧合 UP主对应关系为方便建库进行了主观处理&#xff0c;不代表真实情况 无商业用途&#xff0c;学习使用

CentOS7开放端口号

查看所有开放的端口号 firewall-cmd --zonepublic --list-ports 或者 firewall-cmd --permanent --list-ports&#xff08;--permanent表示永久生效&#xff09; 查询指定端口号是否开发 firewall-cmd --permanent --query-port8080/tcp 删除一个已经开放的端口号 firewall-cm…

Hinton,Lecun和Bengio三巨头联手再发万字长文:深度学习的昨天、今天和明天

来源&#xff1a;ACM编辑&#xff1a;Priscilla Emil2018年&#xff0c;ACM&#xff08;国际计算机学会&#xff09;决定将计算机领域的最高奖项图灵奖颁给Yoshua Bengio、Yann LeCun 和 Geoffrey Hinton&#xff0c;以表彰他们在计算机深度学习领域的贡献。这也是图灵奖第三次…

LR为什么用极大似然估计,损失函数为什么是log损失函数(交叉熵)

首先&#xff0c;逻辑回归是一个概率模型&#xff0c;不管x取什么值&#xff0c;最后模型的输出也是固定在&#xff08;0,1&#xff09;之间&#xff0c;这样就可以代表x取某个值时y是1的概率 这里边的参数就是θ&#xff0c;我们估计参数的时候常用的就是极大似然估计&#xf…

LSTM之父撰文,纪念这位图灵奖遗珠、“AI理论之父”

原文&#xff1a;1931: Kurt Gdel, founder of theoretical computer science, shows limits of math, logic, computing, and artificial intelligence作者&#xff1a;Jrgen Schmidhuber &#xff08;知名 AI 学者&#xff0c;LSTM 之父&#xff09;译者&#xff1a;刘媛媛摘…

Maven简述以及配置使用

目前的技术存在的问题&#xff08;引入Maven的重要性&#xff09; 一个项目就是一个工程&#xff1b; 如果项目非常庞大&#xff0c;就不再适合使用package来划分模块&#xff1b;最好是每一个模块对应一个工程&#xff0c;利于分工协作&#xff1b; 借助于Maven可以将一个项目…

依图科技终止上市审核:冲击科创板「AI第一股」失败

来源&#xff1a;机器之心AI 创业公司在国内市场 IPO 真就这么困难&#xff1f;7 月 2 日晚上交所消息&#xff0c;决定终止对依图科技首次公开发行存托凭证并在科创板上市的审核。依图的上市申请是于 2020 年 11 月 4 日被上交所依法受理的&#xff0c;其股票预计采用 CDR&…

神经网络-前向传播

前向传播神经网络搭建 1.tensorflow库搭建神经网络 参数&#xff1a;线上的权重W&#xff0c;用变量表示&#xff0c;随机给初值。相关介绍 tf.truncated_normal():去掉过大偏离点的正太分布tf.random_normal()正太分布tf.random_uniform():平均分布tf.zeros:全零数组&#x…

对汉诺塔递归算法的理解(图解,附完整代码实现)

前情提要&#xff1a; 首先说一下汉诺塔游戏的规则&#xff1a;如下图所示&#xff0c;有三个柱子A,B,C,我们要做的是把A柱的所有圆盘&#xff0c;全部转移到C柱上&#xff0c;转移时遵循的规则如下&#xff1a; 1、每次只能移动一个圆盘 2、所有的大圆盘必须在小圆盘的下面 过…

再会迪杰斯特拉(Dijkstra)

迪杰斯特拉算法 算法说明 迪杰斯特拉算法用来求解某一个起点到以其他所有点为终点的最短路径长度&#xff1b; 算法思路-贪心算法 以下图为例 指定一个节点(即起点&#xff09;&#xff0c;例如计算“A”到其他节点的最短路径&#xff1b;引入两个集合&#xff08;S,U&…

数字孪生等前沿技术,将如何解码未来交通?

来源&#xff1a;物联网智库目前&#xff0c;国内在交通领域的技术创新层出不穷&#xff0c;交通出行领域已经成为创新科技聚集和爆发的领域。众多新科技的出现&#xff0c;正在给我们描绘出一幅未来交通的蓝图。在面向未来的诸多关于智慧交通的前沿应用和解决方案中&#xff0…

神经网络-反向传播

反向传播 反向传播---->训练参数&#xff0c;在所有参数上使用梯度下降。使NN模型在训练数据上的损失函数最小。损失函数&#xff08;loss&#xff09;&#xff1a;预测值&#xff08;y&#xff09;与已知答案&#xff08;y_&#xff09;的差距。均方误差MSE&#xff1a;, …

第七章 二叉搜索树(b3)BST:删除

转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10247191.html

2021天梯赛题解

2021程序设计天梯赛在4月24日举办&#xff0c;本文是天梯赛的部分题解&#xff0c;有的问题在当时也没有得到满分&#xff0c;由于学校开启了天梯赛的重现比赛&#xff0c;再写一写。 注意&#xff1a;本文答案不是标准答案&#xff0c;每道题收获的分数写在了相应位置&#x…