- Notifications
You must be signed in to change notification settings - Fork189
xmnlp:提供中文分词, 词性标注, 命名体识别,情感分析,文本纠错,文本转拼音,文本摘要,偏旁部首,句子表征及文本相似度计算等功能
License
SeanLee97/xmnlp
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
xmnlp: 一款开箱即用的开源中文自然语言处理工具包
XMNLP: An out-of-the-box Chinese Natural Language Processing Toolkit
- 中文词法分析 (RoBERTa + CRF finetune)
- 分词
- 词性标注
- 命名体识别
- 支持自定义字典
- 中文拼写检查 (Detector + Corrector SpellCheck)
- 文本摘要 & 关键词提取 (Textrank)
- 情感分析 (RoBERTa finetune)
- 文本转拼音 (Trie)
- 汉字偏旁部首 (HashMap)
- 句子表征及相似度计算
安装最新版 xmnlp
pip install -U xmnlp
国内用户可以加一下 index-url
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U xmnlp
安装完包之后,还需要下载模型权重才可正常使用
请下载 xmnlp 对应版本的模型,如果不清楚 xmnlp 的版本,可以执行python -c 'import xmnlp; print(xmnlp.__version__)'
查看版本
模型名称 | 适用版本 | 下载地址 |
---|---|---|
xmnlp-onnx-models-v5.zip | v0.5.0, v0.5.1, v0.5.2, v0.5.3 | 飞书 [IGHI] |百度网盘 [l9id] |
xmnlp-onnx-models-v4.zip | v0.4.0 | 飞书 [DKLa] |百度网盘 [j1qi] |
xmnlp-onnx-models-v3.zip | v0.3.2, v0.3.3 | 飞书 [o4bA] |百度网盘 [9g7e] |
下载模型后需要设置模型路径 xmnlp 才可以正常运行。提供两种配置方式
方式 1:配置环境变量(推荐)
下载好的模型解压后,可以设置环境变量指定模型地址。以 Linux 系统为例,设置如下
export XMNLP_MODEL=/path/to/xmnlp-models
方式 2:通过函数设置
在调用 xmnlp 前设置模型地址,如下
importxmnlpxmnlp.set_model('/path/to/xmnlp-models')
* 上述/path/to/
只是占位用的,配置时请替换成模型真实的目录地址。
中文分词(默认),基于逆向最大匹配来分词,采用 RoBERTa + CRF 来进行新词识别。
参数:
- text:输入文本
结果返回:
- 列表,分词后的结果
示例:
>>>importxmnlp>>>text="""xmnlp 是一款开箱即用的轻量级中文自然语言处理工具🔧。""">>>print(xmnlp.seg(text))['xmnlp','是','一款','开箱','即用','的','轻量级','中文','自然语言','处理','工具','🔧','。']
基于逆向最大匹配来分词,不包含新词识别,速度较快。
参数:
- text:输入文本
结果返回:
- 列表,分词后的结果
示例:
>>>importxmnlp>>>text="""xmnlp 是一款开箱即用的轻量级中文自然语言处理工具🔧。""">>>print(xmnlp.seg(text))['xmnlp','是','一款','开箱','即','用','的','轻量级','中文','自然语言','处理','工具','🔧','。']
基于 RoBERTa + CRF 模型,速度较慢。当前深度接口只支持简体中文,不支持繁体。
参数:
- text:输入文本
结果返回:
- 列表,分词后的结果
示例:
>>>importxmnlp>>>text="""xmnlp 是一款开箱即用的轻量级中文自然语言处理工具🔧。""">>>print(xmnlp.deep_seg(text))['xmnlp','是','一款','开箱','即用','的','轻','量级','中文','自然','语言','处理','工具','🔧','。']
词性标注。
参数:
- text:输入文本
结果返回:
- 词和词性元组组成的列表
示例:
>>>importxmnlp>>>text="""xmnlp 是一款开箱即用的轻量级中文自然语言处理工具🔧。""">>>print(xmnlp.tag(text))[('xmnlp','eng'), ('是','v'), ('一款','m'), ('开箱','n'), ('即用','v'), ('的','u'), ('轻量级','b'), ('中文','nz'), ('自然语言','l'), ('处理','v'), ('工具','n'), ('🔧','x'), ('。','x')]
基于逆向最大匹配,不包含新词识别,速度较快。
参数:
- text:输入文本
结果返回:
- 词和词性元组组成的列表
示例:
>>>importxmnlp>>>text="""xmnlp 是一款开箱即用的轻量级中文自然语言处理工具🔧。""">>>print(xmnlp.fast_tag(text))[('xmnlp','eng'), ('是','v'), ('一款','m'), ('开箱','n'), ('即','v'), ('用','p'), ('的','uj'), ('轻量级','b'), ('中文','nz'), ('自然语言','l'), ('处理','v'), ('工具','n'), ('🔧','x'), ('。','x')]
基于 RoBERTa + CRF 模型,速度较慢。当前深度接口只支持简体中文,不支持繁体。
参数:
- text:输入文本
结果返回:
- 词和词性元组组成的列表
示例:
>>>importxmnlp>>>text="""xmnlp 是一款开箱即用的轻量级中文自然语言处理工具🔧。""">>>print(xmnlp.deep_tag(text))[('xmnlp','x'), ('是','v'), ('一款','m'), ('开箱','v'), ('即用','v'), ('的','u'), ('轻','nz'), ('量级','b'), ('中文','nz'), ('自然','n'), ('语言','n'), ('处理','v'), ('工具','n'), ('🔧','w'), ('。','w')]
支持用户自定义字典,字典格式为
词1 词性1词2 词性2
也兼容 jieba 分词的字典格式
词1 词频1 词性1词2 词频2 词性2
注:上述行内的间隔符为空格
使用示例:
fromxmnlp.lexical.tokenizationimportTokenization# 定义 tokenizer# detect_new_word 定义是否识别新词,默认 True, 设为 False 时速度会更快tokenizer=Tokenization(user_dict_path,detect_new_word=True)# 分词tokenizer.seg(texts)# 词性标注tokenizer.tag(texts)
命名体识别,支持识别的实体类型为:
- TIME:时间
- LOCATION:地点
- PERSON:人物
- JOB:职业
- ORGANIZAIRION:机构
参数:
- text:输入文本
结果返回:
- 实体、实体类型、实体起始位置和实体结尾位置组成的列表
示例:
>>>importxmnlp>>>text="现任美国总统是拜登。">>>print(xmnlp.ner(text))[('美国','LOCATION',2,4), ('总统','JOB',4,6), ('拜登','PERSON',7,9)]
xmnlp.keyword(text: str, k: int = 10, stopword: bool = True, allowPOS: Optional[List[str]] = None) -> List[Tuple[str, float]]
从文本中提取关键词,基于 Textrank 算法。
参数:
- text:文本输入
- k:返回关键词的个数
- stopword:是否去除停用词
- allowPOS:配置允许的词性
结果返回:
- 由关键词和权重组成的列表
示例:
>>>importxmnlp>>>text="""自然语言处理: 是人工智能和语言学领域的分支学科。 ...: 在这此领域中探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的 ...: 语言。 ...: 自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化 ...: 为计算机程序更易于处理的形式。""">>>print(xmnlp.keyword(text))[('自然语言',2.3000579596585897), ('语言',1.4734141257937314), ('计算机',1.3747500999598312), ('转化',1.2687686226652466), ('系统',1.1171384775870152), ('领域',1.0970728069617324), ('人类',1.0192131829490039), ('生成',1.0075197087342542), ('认知',0.9327188339671753), ('指',0.9218423928455112)]
从文本中提取关键句,基于 Textrank 算法。
参数:
- text:文本输入
- k:返回关键词的个数
- stopword:是否去除停用词
结果返回:
- 由关键词和权重组成的列表
示例:
>>>importxmnlp>>>text="""自然语言处理: 是人工智能和语言学领域的分支学科。 ...: 在这此领域中探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的 ...: 语言。 ...: 自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化 ...: 为计算机程序更易于处理的形式。""">>>print(xmnlp.keyphrase(text,k=2))['自然语言理解系统把自然语言转化为计算机程序更易于处理的形式','自然语言生成系统把计算机数据转化为自然语言']
情感识别,基于电商评论语料训练,适用于电商场景下的情感识别。
参数:
- text:输入文本
结果返回:
- 元组,格式为:[负向情感概率,正向情感概率]
示例:
>>>importxmnlp>>>text="这本书真不错,下次还要买">>>print(xmnlp.sentiment(text))(0.02727833203971386,0.9727216958999634)
文本转拼音
参数:
- text:输入文本
结果返回:
- 拼音组成的列表
示例:
>>>importxmnlp>>>text="自然语言处理">>>print(xmnlp.pinyin(text))['Zi','ran','yu','yan','chu','li']
提取文本部首
参数:
- text:输入文本
结果返回:
- 部首组成的列表
示例:
>>>importxmnlp>>>text="自然语言处理">>>print(xmnlp.radical(text))['自','灬','讠','言','夂','王']
xmnlp.checker(text: str, suggest: bool = True, k: int = 5, max_k: int = 200) -> Union[ List[Tuple[int, str]], Dict[Tuple[int, str], List[Tuple[str, float]]]]:
文本纠错
参数:
- text:输入文本
- suggest:是否返回建议词
- k:返回建议词的个数
- max_k:拼音搜索最大次数(建议保持默认值)
结果返回:
- suggest 为 False 时返回 (错词下标,错词) 列表;suggest 为 True 时返回字典,字典键为(错词下标,错词) 列表,值为建议词以及权重列表。
示例:
>>>importxmnlp>>>text="不能适应体育专业选拔人材的要求">>>print(xmnlp.checker(text)){(11,'材'): [('才',1.58528071641922), ('材',1.0009655653266236), ('裁',1.0000178480604518), ('员',0.35814568400382996), ('士',0.011077565141022205)]}
SentenceVector 初始化函数
- model_dir: 模型保存地址,默认加载 xmnlp 提供的模型权重
- genre: 内容类型,目前支持 ['通用', '金融', '国际'] 三种
- max_length: 输入文本的最大长度,默认 512
以下是 SentenceVector 的三个成员函数
xmnlp.sv.SentenceVector.similarity(self, x: Union[str, np.ndarray], y: Union[str, np.ndarray]) -> float
xmnlp.sv.SentenceVector.most_similar(self, query: str, docs: List[str], k: int = 1, **kwargs) -> List[Tuple[str, float]]
- query: 查询内容
- docs: 文档列表
- k: 返回 topk 相似文本
- kwargs: KDTree 的参数,详见sklearn.neighbors.KDTree
使用示例
importnumpyasnpfromxmnlp.svimportSentenceVectorquery='我想买手机'docs= ['我想买苹果手机','我喜欢吃苹果']sv=SentenceVector(genre='通用')fordocindocs:print('doc:',doc)print('similarity:',sv.similarity(query,doc))print('most similar doc:',sv.most_similar(query,docs))print('query representation shape:',sv.transform(query).shape)
输出
doc: 我想买苹果手机similarity: 0.68668646doc: 我喜欢吃苹果similarity: 0.3020076most similar doc: [('我想买苹果手机', 16.255546509314417)]query representation shape: (312,)
新版本不再提供对应的并行处理接口,需要使用xmnlp.utils.parallel_handler
来定义并行处理接口。
接口如下:
xmnlp.utils.parallel_handler(callback:Callable,texts:List[str],n_jobs:int=2,**kwargs)->Generator[List[Any],None,None]
使用示例:
fromfunctoolsimportpartialimportxmnlpfromxmnlp.utilsimportparallel_handlerseg_parallel=partial(parallel_handler,xmnlp.seg)print(seg_parallel(texts))
期待更多小伙伴的 contributions,一起打造一款简单易用的中文 NLP 工具
@misc{xmnlp,title={XMNLP:ALightweightChineseNaturalLanguageProcessingToolkit},author={XianmingLi},year={2018},publisher={GitHub},howpublished={\url{https://github.com/SeanLee97/xmnlp}},}
本人致力于 NLP 研究和落地,方向包括:信息抽取,情感分类等。
其他 NLP 落地需求可以联系xmlee97@gmail.com (此为有偿服务,xmnlp 相关的 bug 直接提 issue)
搜索公众号xmnlp-ai
关注,菜单选择 “交流群” 入群。
本项目采用的数据主要有:
- 词法分析,文本纠错:人民日报语料
- 情感识别:ChineseNlpCorpus
大部分模型基于LangML 搭建
About
xmnlp:提供中文分词, 词性标注, 命名体识别,情感分析,文本纠错,文本转拼音,文本摘要,偏旁部首,句子表征及文本相似度计算等功能