Package: xmnlp
xmnlp: 一款开箱即用的开源中文自然语言处理工具包XMNLP: An out-of-the-box Chinese Natural Language Processing Toolkit功能概览中文词法分析 (RoBERTa + CRF finetune)分词词性标注命名体识别支持自定义字典中文拼写检查 (Detector + Corrector SpellCheck)文本摘要 & 关键词提取 (Textrank)情感分析 (RoBERTa finetune)文本转拼音 (Trie)汉字偏旁部首 (HashMap)句子表征及相似度计算Outline一. 安装模型下载配置模型二. 使用文档默认分词：seg快速分词：fast_seg深度分词：deep_seg词性标注：tag快速词性标注：fast_tag深度词性标注：deep_tag分词&词性标注自定义字典命名体识别：ner关键词提取：keyword关键语句提取：keyphrase情感识别：sentiment拼音提取：pinyin部首提取：radical文本纠错：checker句子表征及相似度计算：sentence_vector并行处理三. 更多贡献者学术引用需求定制交流群RefrenceLicense一. 安装安装最新版 xmnlppipinstall-Uxmnlp国内用户可以加一下 index-urlpipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simple-Uxmnlp安装完包之后，还需要下载模型权重才可正常使用模型下载请下载 xmnlp 对应版本的模型，如果不清楚 xmnlp 的版本，可以执行python -c 'import xmnlp; print(xmnlp.__version__)'查看版本模型名称适用版本下载地址xmnlp-onnx-models-v5.zipv0.5.0, v0.5.1, v0.5.2, v0.5.3飞书[IGHI] |百度网盘[l9id]xmnlp-onnx-models-v4.zipv0.4.0飞书[DKLa] |百度网盘[j1qi]xmnlp-onnx-models-v3.zipv0.3.2, v0.3.3飞书[o4bA] |百度网盘[9g7e]配置模型下载模型后需要设置模型路径 xmnlp 才可以正常运行。提供两种配置方式方式 1：配置环境变量（推荐）下载好的模型解压后，可以设置环境变量指定模型地址。以 Linux 系统为例，设置如下exportXMNLP_MODEL=/path/to/xmnlp-models方式 2：通过函数设置在调用 xmnlp 前设置模型地址，如下importxmnlpxmnlp.set_model('/path/to/xmnlp-models')* 上述/path/to/只是占位用的，配置时请替换成模型真实的目录地址。二. 使用文档xmnlp.seg(text: str) -> List[str]中文分词（默认），基于逆向最大匹配来分词，采用 RoBERTa + CRF 来进行新词识别。参数：text：输入文本结果返回：列表，分词后的结果示例：>>>importxmnlp>>>text="""xmnlp 是一款开箱即用的轻量级中文自然语言处理工具🔧。""">>>print(xmnlp.seg(text))['xmnlp','是','一款','开箱','即用','的','轻量级','中文','自然语言','处理','工具','🔧','。']xmnlp.fast_seg(text: str) -> List[str]基于逆向最大匹配来分词，不包含新词识别，速度较快。参数：text：输入文本结果返回：列表，分词后的结果示例：>>>importxmnlp>>>text="""xmnlp 是一款开箱即用的轻量级中文自然语言处理工具🔧。""">>>print(xmnlp.seg(text))['xmnlp','是','一款','开箱','即','用','的','轻量级','中文','自然语言','处理','工具','🔧','。']xmnlp.deep_seg(text: str) -> List[str]基于 RoBERTa + CRF 模型，速度较慢。当前深度接口只支持简体中文，不支持繁体。参数：text：输入文本结果返回：列表，分词后的结果示例：>>>importxmnlp>>>text="""xmnlp 是一款开箱即用的轻量级中文自然语言处理工具🔧。""">>>print(xmnlp.deep_seg(text))['xmnlp','是','一款','开箱','即用','的','轻','量级','中文','自然','语言','处理','工具','🔧','。']xmnlp.tag(text: str) -> List[Tuple(str, str)]词性标注。参数：text：输入文本结果返回：词和词性元组组成的列表示例：>>>importxmnlp>>>text="""xmnlp 是一款开箱即用的轻量级中文自然语言处理工具🔧。""">>>print(xmnlp.tag(text))[('xmnlp','eng'),('是','v'),('一款','m'),('开箱','n'),('即用','v'),('的','u'),('轻量级','b'),('中文','nz'),('自然语言','l'),('处理','v'),('工具','n'),('🔧','x'),('。','x')]xmnlp.fast_tag(text: str) -> List[Tuple(str, str)]基于逆向最大匹配，不包含新词识别，速度较快。参数：text：输入文本结果返回：词和词性元组组成的列表示例：>>>importxmnlp>>>text="""xmnlp 是一款开箱即用的轻量级中文自然语言处理工具🔧。""">>>print(xmnlp.fast_tag(text))[('xmnlp','eng'),('是','v'),('一款','m'),('开箱','n'),('即','v'),('用','p'),('的','uj'),('轻量级','b'),('中文','nz'),('自然语言','l'),('处理','v'),('工具','n'),('🔧','x'),('。','x')]xmnlp.deep_tag(text: str) -> List[Tuple(str, str)]基于 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)xmnlp.ner(text: str) -> List[Tuple(str, str, int, int)]命名体识别，支持识别的实体类型为：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)]xmnlp.keyphrase(text: str, k: int = 10, stopword: bool = False) -> List[str]从文本中提取关键句，基于 Textrank 算法。参数：text：文本输入k：返回关键词的个数stopword：是否去除停用词结果返回：由关键词和权重组成的列表示例：>>>importxmnlp>>>text="""自然语言处理: 是人工智能和语言学领域的分支学科。...: 在这此领域中探讨如何处理及运用自然语言；自然语言认知则是指让电脑“懂”人类的...: 语言。...: 自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化...: 为计算机程序更易于处理的形式。""">>>print(xmnlp.keyphrase(text,k=2))['自然语言理解系统把自然语言转化为计算机程序更易于处理的形式','自然语言生成系统把计算机数据转化为自然语言']xmnlp.sentiment(text: str) -> Tuple[float, float]情感识别，基于电商评论语料训练，适用于电商场景下的情感识别。参数：text：输入文本结果返回：元组，格式为：[负向情感概率，正向情感概率]示例：>>>importxmnlp>>>text="这本书真不错，下次还要买">>>print(xmnlp.sentiment(text))(0.02727833203971386,0.9727216958999634)xmnlp.pinyin(text: str) -> List[str]文本转拼音参数：text：输入文本结果返回：拼音组成的列表示例：>>>importxmnlp>>>text="自然语言处理">>>print(xmnlp.pinyin(text))['Zi','ran','yu','yan','chu','li']xmnlp.radical(text: str) -> List[str]提取文本部首参数：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)]}xmnlp.sv.SentenceVector(model_dir: Optional[str] = None, genre: str = '通用', max_length: int = 512)SentenceVector 初始化函数model_dir: 模型保存地址，默认加载 xmnlp 提供的模型权重genre: 内容类型，目前支持 ['通用', '金融', '国际'] 三种max_length: 输入文本的最大长度，默认 512以下是 SentenceVector 的三个成员函数xmnlp.sv.SentenceVector.transform(self, text: str) -> np.ndarrayxmnlp.sv.SentenceVector.similarity(self, x: Union[str, np.ndarray], y: Union[str, np.ndarray]) -> floatxmnlp.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.68668646
doc: 我喜欢吃苹果
similarity: 0.3020076
most 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 工具学术引用 Citation@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关注，菜单选择 “交流群” 入群。Reference本项目采用的数据主要有：词法分析，文本纠错：人民日报语料情感识别：ChineseNlpCorpusLicenseApache 2.0大部分模型基于LangML搭建