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

如何阅读本文?

  1. 首先我们对Hanlp用户词典进行简介,推荐首先阅读链接文章,它是本文的第一来源;
  2. 环境配置方面分为几个步骤,每个需要动手操作的步骤都用黑体加粗显示,依据这些步骤你完全可以将用户自定义词典创建完成,但是我们建议将分析部分仔细看一看,加深理解;
  3. 对每一个步骤出现的问题我们都进行了解释并提供了解决方案,如果你是为了解决问题来到的本文,可以使用Ctrl+F查找你想解决的问题,很有可能就在文章中;
  4. 仅供参考,感谢来到这里─=≡Σ(((つ•̀ω•́)つ;

Hanlp用户自定义词典引用简介

考完六级的我回来了~
在之前的文章中,提到了Hanlp用户自定义词典的作用和详细信息,传送门:Hanlp之理解用户自定义词典(java版本)那篇文章的源代码分析还没写
光说不练假把式,今天我们一步一步来配置一个自定义词典并在分词中使用它;(Java版本)

操作步骤

环境创建

  1. java项目:在IDE中创建一个java项目,将hanlp-jar和hanlp-sources-jar引入到项目(Build Path),当我们第一次使用时将sources包attach到项目,就可以查看源代码了,否则是无法查看的;同时将Hanlp的配置文件导入到classpath(放入项目文件的bin目录下即可,我们一会要着重操作这个配置文件);
    外部引入
  2. Hanlp文件:我们在第一步已经导入了两个包,同时将配置文件加入到了classpath,我们还需要在Hanlp根目录下任意位置创建一个词典文件,我们这里以txt格式为例。
问题1:我的词典文件应该创建在哪里呢?任意位置都可以吗?
答:我们希望你将文件创建在Hanlp配置文件声明的根目录下,你如果仔细观察配置文件的话会发现Hanlp
的地址规则,原文如下:
#本配置文件中的路径的根目录,根目录+其他路径=完整路径(支持相对路径,请参考:https://github.com/hankcs/HanLP/pull/254)
#Windows用户请注意,路径分隔符统一使用/
紧接着一行就是你配置的根目录:root
所以,最好将文件创建在根目录下。
同时注意,windows OS用户的分隔符请使用 "/",不要转义。

至此,我们就将环境创建好了。

编辑词典文件

我们知道了词典内部数据的组织方式,我们也要按照这个方式来进行加载,在应用时我们经常通过流操作来写入数据,由于这次演示的数据量比较小,我们直接输入。

  1. 进入编辑器,我们编辑词典文件:我创建了一个名称为 我的词典.txt 的词典文件,在里面,我定义了一个开斯卡名词和一个子库啊动词,显然,这两个在现有语料库中没有任何意义的词是不太可能分到一起的,当我们需要将这两个词分到一起时就可以将他们加入词典;
问题2:开斯卡和子库啊两个词在分词时一定会分到一起吗?
答:还是不一定,为什么“还是”,请看链接文章解释。这两个词在分词时会有很大概率在一起,但不是一定
,当你充分了解后果后,可以使用  Segment #enableCustomDictionaryForcing  强制分词
问题3:我应该如何编辑文件?格式是什么?
答:输入单词,同时加入词性和出现频率,词性和频率不是必须项,省略会使用默认值,默认值我们会在稍后
介绍;词性表请见 http://www.hankcs.com/nlp/part-of-speech-tagging.html#h2-8
单词之间请使用制表符或者空格隔开(这意味着单词之间不允许出现空格);

编辑词典

  1. 保存文件,注意,一定要将文件保存为UTF-8编码,Hanlp使用UTF-8编码;

将用户自定义词典路径加入配置文件

  1. 路径配置规则
    (1)#本配置文件中的路径的根目录,根目录+其他路径=完整路径(支持相对路径,请参考:https://github.com/hankcs/HanLP/pull/254)
    #Windows用户请注意,路径分隔符统一使用/
    (2)#自定义词典路径,用;隔开多个自定义词典,空格开头表示在同一个目录,使用“文件名 词性”形式则表示这个词典的词性默认是该词性。优先级递减。
  2. 操作:
    首先确定根目录,根目录是data目录的父目录;
    然后将词典移动至父目录下的任意一个位置(创建时就在请忽略此步);
    在CustomDictionaryPath后追加字典位置,值为绝对路径-root路径,比如我的词典文件路径是 F:\java学习\Hanlp\data\dictionary\custom\我的词典.txt,而root是F:\java学习\Hanlp\,所以我应该在最后写入data\dictionary\custom\我的词典.txt
    如果创建的词典文件和已有的词典在一个目录,在上一目录分号后输入一个空格,直接追加文件名称即可
    路径配置

删除缓存文件

在配置完毕后,我们一定要删除之前加载字典时产生的缓存文件,比如下图中的CustomDictionary.txt.bin文件就是上次产生的缓存文件,我们将他删除;
缓存演示

问题4 我们为什么要删除缓存文件?
答:Hanlp首次加载词典/模型会发生一个自动缓存的过程,自动缓存的目的是为了加速词典载入速度,在下次
载入时,缓存的词典文件会带来毫秒级的加载速度。
如果我们不删除这个文件,Hanlp会直接使用缓存进行分词,不会应用新的改变,手动删除后,再次加载会
重新缓存,这是我们的自定义词典就会加载到缓存了。
注意:字典删除加入词语时不用重新创建缓存。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 HanLP 计算两个字符串的相似度,可以先将两个字符串分别进行分词,然后使用词向量计算它们的相似度。如果需要考虑近义词的影响,可以使用 HanLP 提供的用户自定义词典功能,将近义词添加到词典,这样相似的词就可以被认为是等价的。 具体步骤如下: 1. 导入 HanLP 的相关模块 ```python from pyhanlp import HanLP, JClass ``` 2. 加载预训练的词向量模型 ```python WordVectorModel = JClass('com.hankcs.hanlp.mining.word2vec.WordVectorModel') model_path = 'your_word2vec_model_path' model = WordVectorModel(model_path) ``` 3. 加载自定义词典 ```python CustomDictionary = JClass('com.hankcs.hanlp.dictionary.CustomDictionary') CustomDictionary.add('近义词1') CustomDictionary.add('近义词2') ... ``` 4. 对两个字符串进行分词,并使用词向量计算它们的相似度 ```python def similarity(s1, s2): vec1 = None vec2 = None for term in HanLP.segment(s1): word = term.word if vec1 is None: vec1 = model.getWordVector(word) else: vec1 = vec1 + model.getWordVector(word) for term in HanLP.segment(s2): word = term.word if vec2 is None: vec2 = model.getWordVector(word) else: vec2 = vec2 + model.getWordVector(word) if vec1 is None or vec2 is None: return 0.0 return model.similarity(vec1, vec2) ``` 在这个函数,我们首先将两个字符串进行分词,并将每个词的词向量相加,得到整个字符串的向量表示。然后使用词向量模型的 `similarity` 函数计算两个向量的相似度。 需要注意的是,如果两个字符串都没有出现在词向量模型的词,那么它们的相似度将为0。因此,实际使用需要保证词向量模型的覆盖率足够高。 另外,HanLP 还提供了更高级的文本相似度计算功能,例如基于词汇、句法和语义的相似度计算方法。如果需要更加准确的相似度计算,可以参考 HanLP 的官方文档进行实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值