AllenNLP源码拓展——中文分词
AllenNLP中常使用spacy对英文进行分词,但是spacy不能对中文分词。因此我想尝试加一个中文分词的word_splitter。对比了一些中文分词包,最后在THULAC和jieba中进行选择,据说前者更准确,后者速度更快,为了保证准确,我选择了前者(不知道还有没有更好的)。我参考spacy部分的代码弄了一个THUNLPSplitter。
测试代码:(postags指是否标注词性,only_tokens指最终是否只保留字符,去掉词性等属性,user_dict指用户自定义词典,是一个文件路径)
from allennlp.data.tokenizers.word_splitter import THUNLPSplitter
from allennlp.data.tokenizers.token import show_token splitter = THUNLPSplitter(pos_tags=False)
print(splitter.split_words("武汉市长江大桥")) splitter2 = THUNLPSplitter(pos_tags=True, only_tokens=False)
tokens = splitter2.split_words("武汉市长江大桥")
for token in tokens: print(show_token(token)) splitter3 = THUNLPSplitter(pos_tags=False, user_dict='F:\\test\\userdict.txt')
print(splitter3.split_words("中美合拍,文体两开花。皮皮虾我们走"))
结果如下:
用户词典是一个txt文件,一行有一个自定义的词,这里我没有定义“皮皮虾”,所以分词不正确,加入后可以分出“皮皮虾”。
自定义“皮皮虾”后的结果如下:
但是用户词典有时候效果不好,作者表示是在后处理的时候使用用户词典,如果定义词中的一个字在分词后和其他字形成词,则不会使用用户自定义的词。这一点感觉不太好。
完整代码如下:
@WordSplitter.register('thunlp')
class THUNLPSplitter(WordSplitter):"""A ``WordSplitter`` that uses THUNLP's tokenizer. To Split Chinese sentences.simplify:Convert traditional characters to simplified charactersfilt:Remove meaningless wordsuser_dict:a txt file, one word in a line."""def __init__(self,pos_tags: bool = False,simplify: bool = False,filt: bool = False,only_tokens: bool = True,user_dict: List[str] = None) -> None:import thulacif pos_tags:seg_only = Falseelse:seg_only = Trueself.thunlp = thulac.thulac(seg_only=seg_only, T2S=simplify, filt=filt, user_dict=user_dict)self._only_tokens = only_tokensdef _sanitize(self, tokens: List[str]) -> List[Token]:"""Converts spaCy tokens to allennlp tokens. Is a no-op ifkeep_spacy_tokens is True"""sanitize_tokens = []for token_attri in tokens:token = Token(token_attri[0])if self._only_tokens:passelse:token = Token(token.text,token.idx,token.lemma_,token_attri[1],token.tag_,token.dep_,token.ent_type_)sanitize_tokens.append(token)return sanitize_tokens@overridesdef batch_split_words(self, sentences: List[str]) -> List[List[Token]]:split_words = []for sent in sentences:split_words.append(self._sanitize(tokens) for tokens in self.thunlp.cut(sent, text=False))return split_words@overridesdef split_words(self, sentence: str) -> List[Token]:return self._sanitize(self.thunlp.cut(sentence, text=False))
AllenNLP源码拓展——中文分词相关推荐
- python关键词提取源码_Python 结巴分词 关键词抽取分析
关键词抽取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来.这个可以追溯到文献检索初期,当时还不支持全文搜索的时候,关键词就可以作为搜索这篇论文的词语.因此,目前依然可以在论文中看到关键词这一项. ...
- 怎样知道邮箱的端口_AllenNLP源码拓展——训练结束向邮箱发邮件
训练模型时,不知道什么时候会结束(特别是设置了早停时),因此之前习惯过一会看一下状况.所以前不久想到,如果添加代码,在训练结束后向自己的邮箱发送邮件,那不是很方便嘛.于是我尝试在AllenNLP的源码 ...
- MATLAB去读网页源码时中文乱码
MATLAB去读网页源码时中文乱码 防止获取的网页源码中文乱码 %设置网页的编码方式(必须首先知道网页的编码方式) options = weboptions('CharacterEncoding',' ...
- 基础入门-web源码拓展
基础入门-web源码拓展 前言 web源码在安全测试中是非常重要的信息来源,可以用来代码审计漏洞也可以用来做信息突破口,其中WEB源码有很多技术需要简明分析. 比如:获取ASP源码后可以采用默认数据库 ...
- GitHub排行榜,GitHub源码最新中文排行榜
GitHub排行榜,GitHub源码最新中文排行榜: https://github.com/trending/java?since=monthly&spoken_language_code=z ...
- ajax的auto是true,一个AJAX自动完成功能的js封装源码[支持中文]
Screenshots Pagination Internationalization Rich format Text selection源码下载 有个问题,等高手解决,就是怎么搞都不能支持中文,不 ...
- Python 技术篇 - 修改源码解决中文主机名导致的flask、socket服务起不来问题: ‘utf-8‘ codec can‘t decode byte 0xc0 in position...
由于主机名为中文导致的 flask 服务起不来,报错如下: File "D:\work\python3.9_64\lib\socket.py", line 791, in getf ...
- bartlett 算法 matlab,GWO(灰狼优化)算法MATLAB源码逐行中文注解(转载)
以优化SVM算法的参数c和g为例,对GWO算法MATLAB源码进行了逐行中文注解. tic % 计时器 %% 清空环境变量 close all clear clc format compact %% ...
- 小姐姐笔记:我是如何学习简单源码拓展视野的
大家好,我是若川.这是我上周组织的源码共读纪年小姐姐的笔记,写得很好.所以分享给大家.欢迎加我微信 ruochuan12,进源码共读群.其他更多人的笔记可以阅读原文查看. 川哥的源码解读文章:据说 9 ...
最新文章
- Python独领风骚,AI热情有所降温|2020 年技术趋势解读
- [内部项目]i前端如何增加一个页面
- linux下软件多语言开发,Qt,多语言软件,开发流程【总结】
- php人员排班程序,人员排班软件操作步骤
- [1.1]XMI 与UML结合开发企业应用中业务模型
- 用非递归方式实现二叉树先序便利
- beeshell —— 开源的 React Native 组件库
- Comet 反Ajax: 基于jQuery与PHP实现Ajax长轮询(LongPoll)
- C语言手写自定义三维数组
- 网络基础知识(面试基础)
- sql优化常用的几种方法_Hive常用性能优化方法实践全面总结
- 【matlab】解决每次打开.m文件都会弹出新窗口
- 深度学习2.0-43.AE实战与VAE实战
- centos 6 安装 php 5.5 fpm支持
- android的线程安全
- 李广难封–有感于团队建设
- 计算机学院研发------考核之界面
- spring boot整合JDBC
- IOS 使用TestFlight 详解
- 如何让用html制作404页面,网站404页面怎么做?