hanlp的词典模式
之前我们看了hanlp的词性标注,现在我们就要使用自定义词典与停用词功能了,首先关于HanLP的词性标注方式具体请看HanLP词性标注集。
其核心词典形式如下:
自定义词典
自定义词典有多种添加模式,首先是展示的一个小例子,展示了词汇的动态增加与强行插入,删除等。更复杂的内容请参考后边的第二段代码。
简单的例子
from pyhanlp import *
text = "攻城狮逆袭单身狗,迎娶白富美,走上人生巅峰" # 怎么可能噗哈哈!
print(HanLP.segment(text))
CustomDictionary = JClass("com.hankcs.hanlp.dictionary.CustomDictionary")
CustomDictionary.add("攻城狮") # 动态增加
CustomDictionary.insert("白富美", "nz 1024") # 强行插入
#CustomDictionary.remove("攻城狮"); # 删除词语(注释掉试试)
CustomDictionary.add("单身狗", "nz 1024 n 1")
# 展示该单词词典中的词频统计 展示分词
print(CustomDictionary.get("单身狗"))
print(HanLP.segment(text))
# 增加用户词典,对其他分词器同样有效
# 注意此处,CRF分词器将单身狗分为了n 即使单身狗:"nz 1024 n 1"
CRFnewSegment = HanLP.newSegment("crf")
print(CRFnewSegment.seg(text))
[攻城狮, 逆袭, 单身狗, ,, 迎娶, 白富美, ,, 走上, 人生, 巅峰]
nz 1024 n 1
[攻城狮, 逆袭, 单身狗, ,, 迎娶, 白富美, ,, 走上, 人生, 巅峰]
[攻城, 狮逆袭, 单身狗, ,, 迎娶, 白富美, ,, 走, 上, 人生, 巅峰]
复杂的例子
""" 演示自定义词性,以及往词典中插入自定义词性的词语
!!!由于采用了反射技术,用户需对本地环境的兼容性和稳定性负责!!!
TO-DO
如果使用了动态词性之后任何类使用了switch(nature)语句,必须注册每个类
"""
# 对于系统中已有的词性,可以直接获取
Nature = JClass("com.hankcs.hanlp.corpus.tag.Nature")
pc_nature = Nature.fromString("n")
print(pc_nature)
# 此时系统中没有"电脑品牌"这个词性
pc_nature = Nature.fromString("电脑品牌")
print(pc_nature)
# 我们可以动态添加一个
pc_nature = Nature.create("电脑品牌");
print(pc_nature)
# 可以将它赋予到某个词语
LexiconUtility = JClass("com.hankcs.hanlp.utility.LexiconUtility")
LexiconUtility.setAttribute("苹果电脑", pc_nature)
# 或者
LexiconUtility.setAttribute("苹果电脑", "电脑品牌 1000")
# 它们将在分词结果中生效
term_list = HanLP.segment("苹果电脑可以运行开源阿尔法狗代码吗")
print(term_list)
for term in term_list:
if term.nature == pc_nature:
print("找到了 [{}] : {}\n".format(pc_nature, term.word))
# 还可以直接插入到用户词典
CustomDictionary = JClass("com.hankcs.hanlp.dictionary.CustomDictionary")
CustomDictionary.insert("阿尔法狗", "科技名词 1024")
StandardTokenizer = JClass("com.hankcs.hanlp.tokenizer.StandardTokenizer")
StandardTokenizer.SEGMENT.enablePartOfSpeechTagging(True) # 依然支持隐马词性标注
term_list = HanLP.segment("苹果电脑可以运行开源阿尔法狗代码吗")
print(term_list)
n
None
电脑品牌
[苹果电脑/电脑品牌, 可以/v, 运行/vn, 开源/v, 阿尔法/nrf, 狗/n, 代码/n, 吗/y]
找到了 [电脑品牌] : 苹果电脑
[苹果电脑/电脑品牌, 可以/v, 运行/vn, 开源/v, 阿尔法狗/科技名词, 代码/n, 吗/y]
关于自定义词典的说明(原作者的原文)
说明
<!--[if !supportLists]-->l <!--[endif]-->CustomDictionary是一份全局的用户自定义词典,可以随时增删,影响全部分词器。另外可以在任何分词器中关闭它。通过代码动态增删不会保存到词典文件。
<!--[if !supportLists]-->l <!--[endif]-->中文分词≠词典,词典无法解决中文分词,Segment提供高低优先级应对不同场景,请参考FAQ。
追加词典
<!--[if !supportLists]-->l <!--[endif]-->CustomDictionary主词典文本路径是data/dictionary/custom/CustomDictionary.txt,用户可以在此增加自己的词语(不推荐);也可以单独新建一个文本文件,通过配置文件CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 我的词典.txt;来追加词典(推荐)。
<!--[if !supportLists]-->l <!--[endif]-->始终建议将相同词性的词语放到同一个词典文件里,便于维护和分享。
词典格式
<!--[if !supportLists]-->l <!--[endif]-->每一行代表一个单词,格式遵从[单词] [词性A] [A的频次] [词性B] [B的频次] ... 如果不填词性则表示采用词典的默认词性。
<!--[if !supportLists]-->l <!--[endif]-->词典的默认词性默认是名词n,可以通过配置文件修改:全国地名大全.txt ns;如果词典路径后面空格紧接着词性,则该词典默认是该词性。
<!--[if !supportLists]-->l <!--[endif]-->在统计分词中,并不保证自定义词典中的词一定被切分出来。用户可在理解后果的情况下通过Segment#enableCustomDictionaryForcing强制生效。
<!--[if !supportLists]-->l <!--[endif]-->关于用户词典的更多信息请参考词典说明一章(请看本文最后)。
停用词
关于停用词,我同样先给出了一个简单的例子,你可以使用这个例子来完成你所需要的功能。要注意的一点是,因为java中的类所返回的数据类型与Python不统一,所以当你使用不同的函数的时候,一定要先检查输出结果在Python中的类型,不然可能会出现意想不到的问题。
假如你想了解更多,可以看第二个更复杂的例子。
简单的例子
# 使用停用词的简单例子
text = "小区居民有的反对喂养流浪猫"
CRFnewSegment = HanLP.newSegment("crf")
term_list = CRFnewSegment.seg(text)
# BasicTokenizer = SafeJClass("com.hankcs.hanlp.tokenizer.BasicTokenizer")
# term_list = BasicTokenizer.segment(text)
CoreStopWordDictionary = JClass("com.hankcs.hanlp.dictionary.stopword.CoreStopWordDictionary")
CoreStopWordDictionary.apply(term_list)
HanLP.Config.ShowTermNature = False
print(term_list)
print([i.word for i in term_list])
[小区, 居民, 反对, 养, 流, 浪, 猫]
['小区', '居民', '反对', '养', '流', '浪', '猫']
复杂的例子
# 停用词
# 在import pyhanlp之前编译自己的Java class,并放入pyhanlp/static中
import os
from pyhanlp.static import STATIC_ROOT, HANLP_JAR_PATH
java_code_path = os.path.join(STATIC_ROOT, 'MyFilter.java')
with open(java_code_path, 'w') as out:
java_code = """
import com.hankcs.hanlp.dictionary.stopword.CoreStopWordDictionary;
import com.hankcs.hanlp.dictionary.stopword.Filter;
import com.hankcs.hanlp.seg.common.Term;
public class MyFilter implements Filter
{
public boolean shouldInclude(Term term)
{
if (term.nature.startsWith('m')) return true; // 数词保留
return !CoreStopWordDictionary.contains(term.word); // 停用词过滤
}
}
"""
out.write(java_code)
os.system('javac -cp {} {} -d {}'.format(HANLP_JAR_PATH, java_code_path, STATIC_ROOT))
# 编译结束才可以启动hanlp
CoreStopWordDictionary = JClass("com.hankcs.hanlp.dictionary.stopword.CoreStopWordDictionary")
Filter = JClass("com.hankcs.hanlp.dictionary.stopword.Filter")
Term = JClass("com.hankcs.hanlp.seg.common.Term")
BasicTokenizer = JClass("com.hankcs.hanlp.tokenizer.BasicTokenizer")
NotionalTokenizer = JClass("com.hankcs.hanlp.tokenizer.NotionalTokenizer")
text = "小区居民有的反对喂养流浪猫,而有的居民却赞成喂养这些小宝贝"
# 可以动态修改停用词词典
CoreStopWordDictionary.add("居民")
print(NotionalTokenizer.segment(text))
CoreStopWordDictionary.remove("居民")
print(NotionalTokenizer.segment(text))
# 可以对任意分词器的结果执行过滤
term_list = BasicTokenizer.segment(text)
print(term_list)
CoreStopWordDictionary.apply(term_list)
print(term_list)
# 还可以自定义过滤逻辑
MyFilter = JClass('MyFilter')
CoreStopWordDictionary.FILTER = MyFilter()
print(NotionalTokenizer.segment("数字123的保留")) # “的”位于stopwords.txt所以被过滤,数字得到保留
[小区/n, 反对/v, 喂养/v, 流浪猫/nz, 赞成/v, 喂养/v, 小宝贝/nz]
[小区/n, 居民/n, 反对/v, 喂养/v, 流浪猫/nz, 居民/n, 赞成/v, 喂养/v, 小宝贝/nz]
[小区/n, 居民/n, 有/vyou, 的/ude1, 反对/v, 喂养/v, 流浪猫/nz, ,/w, 而/cc, 有的/rz, 居民/n, 却/d, 赞成/v, 喂养/v, 这些/rz, 小宝贝/nz]
[小区/n, 居民/n, 反对/v, 喂养/v, 流浪猫/nz, 居民/n, 赞成/v, 喂养/v, 小宝贝/nz]
[数字/n, 123/m, 保留/v]
词典说明(原作者原文)
本章详细介绍HanLP中的词典格式,满足用户自定义的需要。HanLP中有许多词典,它们的格式都是相似的,形式都是文本文档,随时可以修改。
基本格式
词典分为词频词性词典和词频词典。
词频词性词典(如CoreNatureDictionary.txt)
<!--[if !supportLists]-->l <!--[endif]-->每一行代表一个单词,格式遵从[单词] [词性A] [A的频次] [词性B] [B的频次] ...。
<!--[if !supportLists]-->l <!--[endif]-->支持省略词性和频次,直接一行一个单词。
<!--[if !supportLists]-->l <!--[endif]-->.txt词典文件的分隔符为空格或制表符,所以不支持含有空格的词语。如果需要支持空格,请使用英文逗号,分割的纯文本.csv文件。在使用Excel等富文本编辑器时,则请注意保存为纯文本形式。
词频词典(如CoreNatureDictionary.ngram.txt)
<!--[if !supportLists]-->l <!--[endif]-->每一行代表一个单词或条目,格式遵从[单词] [单词的频次]。
<!--[if !supportLists]-->l <!--[endif]-->每一行的分隔符为空格或制表符。
少数词典有自己的专用格式,比如同义词词典兼容《同义词词林扩展版》的文本格式,而转移矩阵词典则是一个csv表格。
下文主要介绍通用词典,如不注明,词典特指通用词典。
数据结构
Trie树(字典树)是HanLP中使用最多的数据结构,为此,我实现了通用的Trie树,支持泛型、遍历、储存、载入。
用户自定义词典采用AhoCorasickDoubleArrayTrie和二分Trie树储存,其他词典采用基于双数组Trie树(DoubleArrayTrie)实现的AC自动机AhoCorasickDoubleArrayTrie。关于一些常用数据结构的性能评估,请参考wiki。
储存形式
词典有两个形态:文本文件(filename.txt)和缓存文件(filename.txt.bin或filename.txt.trie.dat和filename.txt.trie.value)。
文本文件
<!--[if !supportLists]-->l <!--[endif]-->采用明文储存,UTF-8编码,CRLF换行符。
缓存文件
<!--[if !supportLists]-->l <!--[endif]-->就是一些二进制文件,通常在文本文件的文件名后面加上.bin表示。有时候是.trie.dat和.trie.value。后者是历史遗留产物,分别代表trie树的数组和值。
<!--[if !supportLists]-->l <!--[endif]-->如果你修改了任何词典,只有删除缓存才能生效。
修改方法
HanLP的核心词典训练自人民日报2014语料,语料不是完美的,总会存在一些错误。这些错误可能会导致分词出现奇怪的结果,这时请打开调试模式排查问题:(本文作者FontTian注:在本文动笔前,原词典一进变为了9970万版本的最大中文语料。但是词典说明中原作者没改)
HanLP.Config.enableDebug();
核心词性词频词典
<!--[if !supportLists]-->l <!--[endif]-->比如你在data/dictionary/CoreNatureDictionary.txt中发现了一个不是词的词,或者词性标注得明显不对,那么你可以修改它,然后删除缓存文件使其生效。
<!--[if !supportLists]-->l <!--[endif]-->目前CoreNatureDictionary.ngram.txt的缓存依赖于CoreNatureDictionary.txt的缓存,修改了后者之后必须同步删除前者的缓存,否则可能出错
核心二元文法词典
<!--[if !supportLists]-->l <!--[endif]-->二元文法词典data/dictionary/CoreNatureDictionary.ngram.txt储存的是两个词的接续,如果你发现不可能存在这种接续时,删掉即可。
<!--[if !supportLists]-->l <!--[endif]-->你也可以添加你认为合理的接续,但是这两个词必须同时在核心词典中才会生效。
命名实体识别词典
<!--[if !supportLists]-->l <!--[endif]-->基于角色标注的命名实体识别比较依赖词典,所以词典的质量大幅影响识别质量。
<!--[if !supportLists]-->l <!--[endif]-->这些词典的格式与原理都是类似的,请阅读相应的文章或代码修改它。
文章来源 FonTIan 的博客
相关推荐
jieba分词的自定义词典:使用jieba分词对语料进行分词之前,需要先载入,载入代码为jieba.load_userdict("userdict.txt")。
NLPIR分词工具由中科院开发,其支持用户自定义词典。这是在做商品评论情感分析时整理的2019个自定义词汇。
本资源包“es5.3.2使用热词、停用词、同义词词典.rar”提供了针对Elasticsearch 5.3.2版本的热词、停用词和同义词的相关工具和配置,帮助用户优化全文搜索引擎的表现。 首先,我们来理解一下这些概念: 1. **热词*...
本文将深入探讨如何使用C#编程语言开发一个自动添加自定义词典的小工具,以增强金山词霸的功能。 首先,我们需要理解金山词霸的词典格式。词霸支持扩展词典,这些词典通常是以BIN或者DICT为后缀的二进制文件。这些...
- **娱乐休闲明星电影相关自定义词典**:专门收集了与娱乐、休闲相关的明星姓名、电影名称、电视剧名称等内容的词典。 #### 2. 词典结构与特点 - **规模**:该词典包含约35万个词条,每个词条占据一行,确保了词条...
- **电子游戏相关自定义词典**:该词典专门针对电子游戏领域设计,包含了大量与游戏相关的专有名词,旨在帮助游戏开发者或是自然语言处理工具更好地理解和处理游戏文本。 #### 描述解析 - **58万词**:这表明了...
生活百科相关自定义词典,共67万词,每行一个词,不重复,可以用作用户自定义词典,提高分词准确率
4. **停用词典**:停用词是指在文本中频繁出现但通常不携带太多语义信息的词,如“的”、“和”、“是”等。在处理文本时,通常会先去除这些词以减少噪声。然而,在某些情况下,停用词可能影响情感分析的结果,比如...
用户也可以根据需求自定义词典,添加特定领域的专业词汇。 3. **停用词**:停用词是指在文本分析中通常被忽略的一类词汇,如“的”、“和”、“是”等,它们在句子中频繁出现但信息含量较低。在jieba分词中,停用...
在 Microsoft Word 2021 中,自定义词典是一个强大的功能,可以帮助用户自定义词典中添加和删除单词,以满足不同领域和行业的词汇需求。下面我们将详细介绍如何在 Word 2021 中添加和删除自定义词典中的单词。 一、...
这个压缩包文件包含的是IKAnalyzer的配置文件、扩展词典和停用词词典,这些组件对于优化IKAnalyzer的性能和精确度至关重要。 1. **IKAnalyzer.cfg.xml**:这是IKAnalyzer的核心配置文件,用于设定分词器的行为和...
自定义词典的添加对于专业术语、行业用语、缩写词等的校对尤为重要,能够帮助避免这些词汇被误判为拼写或语法错误,从而提高文档的专业性和准确性。 添加自定义词典是一项能够显著提升文档质量的功能。它不仅增强了...
三个情感词典(知网Hownet、台湾大学NTUSD、清华大学李军中文褒贬义词典), 非常全的中文词汇,敏感词,停用词词典
### 社会科学相关自定义词典解析 #### 核心知识点概述 本文将基于给定的“社会科学相关自定义词典”中的词条进行详细的知识点解析,涵盖多个领域如军事、经济、医学等,旨在深入理解每个词条背后的含义及其在社会...
最全的停用词词典,根据网上现有全部资源,对所谓“哈工大停用词词库”、“四川大学机器学习智能实验室停用词库”、百度停用词表“等等各种停用词表,整理去重在提取中文词(而不是大量英文词和中文标点符号)出了一个...
3. 可能还有扩展功能,如自定义词典管理、词性标注等,以适应更复杂的需求。 4. 示例代码或者API文档,帮助用户了解如何使用这个工具进行文本处理。 通过这样的工具,开发者和研究人员能够更高效地处理中文文本数据...
包含常见的停用词(包括英文通用词)。在做NLP时,停用词过滤可以用。
停用词在中文自然语言处理领域扮演着至关重要的角色。停用词,顾名思义,是指在文本分析中通常被忽略的常见词汇,因为它们往往不包含或提供很少的语义信息。这些词语在各种语言中都有,比如“的”、“是”、“在”等...
在这个压缩包中,包含的四个关键元素——情感字典、停用词、程度副词和否定词,都是进行情感分析时不可或缺的基础资源。 1. **情感字典**:情感字典是情感分析的核心工具之一,它包含了一组具有特定情感倾向的词汇...
自然科学相关的一些词,共有34万个不同的词,都是自然科学相关的