MIT License

技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

深度技术分析:yongzhuo/Macropodus

项目背景与痛点

面对自然语言处理(NLP)的复杂性,开发过程中的关键痛点在于如何高效、精确地处理中文文本。yongzhuo/Macropodus 作为一款面向中文的NLP工具,以简洁的接口和强大的功能支持为切入点,提供了包括分词、词性标注、命名实体识别、新词发现、关键词抽取、文本摘要等在内的多项实用功能。这个项目在设计和开发过程中,精准地定位到中文处理这一细分领域内的难题,提供了一整套完善的解决方案。

核心技术揭秘

Macropodus 依托于先进的深度学习技术,采用了 Albert + BiLSTM + CRF 的网络架构,这一设计不仅结合了预训练模型的强大表示能力,还加入了序列模型和条件随机场的能力,提升了处理序列标注任务的精度和鲁棒性。为帮助理解其核心逻辑流程,以下是一个数据流图示例:

graph TD A[用户输入文本] --> B[预处理] B --> C("数据预处理:分词、清洗处理") C --> D{"模型运算类型"} D -->|"分词"| E[Albert 进行词向量化] D -->|"词性标注"| F[BiLSTM 进行情感识别] D -->|"命名实体识别"| G[CRF 进行实体标注] E --> H[BiLSTM-BiLSTM 模型分析] F --> H G --> H H --> I[输出处理结果]

其中,Albert,一种以高度参数化著称的预训练模型,负责将输入文本转换为有效的词向量表示;接着,经过序列模型(BiLSTM)的学习,对词性、命名实体等进行更深层次的标注,最后通过 条件随机场(CRF) 进行序列标注的最终定型。

Macropodus 项目的实现依托于多种技术和算法策略,每个模块都设计精妙,能够克服单一算法的不足,有效提升中文处理的精度和效率。

功能亮点与差异

相对于市场上的一些同类自然语言处理工具,Macropodus 在整体功能完备度和准确度上展现出显著优势。本文特别值得一提的是其全面而精准的中文数字和罗马数字到阿拉伯数字转换,以及流畅的繁简转换功能,在中文处理场景中使用尤为广泛。

Macropodus 的独特设计在于,不仅注重基础的NLP功能覆盖,更在细节处打磨优化。这为中小规模应用提供了一款全方位支持、技术先进、界面简洁的NLP处理工具。

应用场景与落地建议

在具体生产环境中使用 Macropodus 时,开发者需注意模型的运行效率与硬件资源的匹配性。使用前,需要确保训练好的模型尺寸适配服务器硬件资源。同时,对于实时性要求较高的应用场景,需特别注意进行适当的模型压缩与优化,减少延迟。

在实际应用层面,Macropodus 适合众多需要中文处理能力的应用场景,从内容生成与文案创作,到金融财务分析,电商智能客服,直至各类信息抽取与文本理解任务等。

综合评价

总体而言,Macropodus 实力强大,功能综合齐全。优点在于其兼具深度学习的强算法能力与清晰直观的用户界面设计,既能处理复杂的文本理解和情感分析等高级问题,又能满足新手使用需求。不过,由于其强大的计算要求,Macropodus 对模型压缩技术的依赖较大,使用前可能需进行优化调整以适应不同硬件环境。同样,在大数据量背景下依旧需要对速度和资源消耗进行着重考量,这对某些部署场景提出了额外挑战。

关于

GitHub 原始描述(英文)

自然语言处理工具Macropodus,基于Albert+BiLSTM+CRF深度学习网络架构,中文分词,词性标注,命名实体识别,新词发现,关键词,文本摘要,文本相似度,科学计算器,中文数字阿拉伯数字(罗马数字)转换,中文繁简转换,拼音转换。tookit(tool) of NLP,CWS(chinese word segnment),POS(Part-Of-Speech Tagging),NER(name entity recognition),Find(new words discovery),Keyword(keyword extraction),Summarize(text summarization),Sim(text similarity),Calculate(scientific calculator),Chi2num(chinese number to arabic number)

描述取自 GitHub 官方 API,保持仓库作者书写的原文。

简要分析

热度分
854
价值分
424
活跃状态
活跃

语言占比

Python

贡献者

README

Macropodus

PyPI - Python Version PyPI GitHub PyPI_downloads Stars Forks Join the chat at https://gitter.im/yongzhuo/Macropodus

Macropodus是一个以Albert+BiLSTM+CRF网络架构为基础,用大规模中文语料训练的自然语言处理工具包。将提供中文分词、词性标注、命名实体识别、关键词抽取、文本摘要、新词发现、文本相似度、计算器、数字转换、拼音转换、繁简转换等常见NLP功能。

目录

安装

  1. 注意事项
    默认不安装nlg-yongzhuo, 如果需要该功能自行安装;
    默认不指定numpy, pandas, scikit-learn版本, 过高或者过低的版本可能不支持
    标准版本的依赖包详见 requirements-all.txt
    
  2. 通过PyPI安装(模型文件另需下载, 详见命名实体提取, 词性标注):
    pip install macropodus
    
  3. 使用镜像源,例如:
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple macropodus
    

使用方式

快速使用

import macropodus

sen_calculate = "23 + 13 * (25+(-9-2-5-2*3-6/3-40*4/(2-3)/5+6*3))加根号144你算得几多"
sen_chi2num = "三千零七十八亿三千零十五万零三百一十二点一九九四"
sen_num2chi = 1994.1994
sen_roman2int = "IX"
sen_int2roman = 132
sent1 = "PageRank算法简介"
sent2 = "百度百科如是介绍他的思想:PageRank通过网络浩瀚的超链接关系来确定一个页面的等级。"
summary = "PageRank算法简介。" \
           "是上世纪90年代末提出的一种计算网页权重的算法! " \
           "当时,互联网技术突飞猛进,各种网页网站爆炸式增长。 " \
           "业界急需一种相对比较准确的网页重要性计算方法。 " \
           "是人们能够从海量互联网世界中找出自己需要的信息。 " \
           "百度百科如是介绍他的思想:PageRank通过网络浩瀚的超链接关系来确定一个页面的等级。 " \
           "Google把从A页面到B页面的链接解释为A页面给B页面投票。 " \
           "Google根据投票来源甚至来源的来源,即链接到A页面的页面。 " \
           "和投票目标的等级来决定新的等级。简单的说, " \
           "一个高等级的页面可以使其他低等级页面的等级提升。 " \
           "具体说来就是,PageRank有两个基本思想,也可以说是假设。 " \
           "即数量假设:一个网页被越多的其他页面链接,就越重)。 " \
           "质量假设:一个网页越是被高质量的网页链接,就越重要。 " \
           "总的来说就是一句话,从全局角度考虑,获取重要的信。 "

# 分词(词典最大概率分词DAG)
words = macropodus.cut(summary)
print(words)
# 新词发现
new_words = macropodus.find(summary)
print(new_words)
# 文本摘要
sum = macropodus.summarize(summary)
print(sum)
# 关键词抽取
keyword = macropodus.keyword(summary)
print(keyword)
# 文本相似度
sim = macropodus.sim(sent1, sent2)
print(sim)
# tookit
# 计算器
score_calcul = macropodus.calculate(sen_calculate)
print(score_calcul)
# 中文数字与阿拉伯数字相互转化
res_chi2num = macropodus.chi2num(sen_chi2num)
print(res_chi2num)
res_num2chi = macropodus.num2chi(sen_num2chi)
print(res_num2chi)
# 阿拉伯数字与罗马数字相互转化
res_roman2int = macropodus.roman2int(sen_roman2int)
print(res_roman2int)
res_int2roman = macropodus.int2roman(sen_int2roman)
print(res_int2roman)
# 中文汉字转拼音
res_pinyin = macropodus.pinyin(summary)
print(res_pinyin)
# 中文繁简转化
res_zh2han = macropodus.zh2han(summary)
print(res_zh2han)
res_han2zh = macropodus.han2zh(res_zh2han)
print(res_han2zh)

中文分词

各种分词方法

import macropodus

# 用户词典
macropodus.add_word(word="斗鱼科")
macropodus.add_word(word="鲈形目") # 不持久化, 当前有效
macropodus.save_add_words(word_freqs={"喜斗":32, "护卵":64, "护幼":132}) # 持久化保存到用户字典
sent = "斗鱼属,Macropodus (1801),鲈形目斗鱼科的一属鱼类。本属鱼类通称斗鱼。因喜斗而得名。分布于亚洲东南部。中国有2种,即叉尾斗鱼,分布于长江及以南各省;叉尾斗鱼,分布于辽河到珠江流域。其喜栖居于小溪、河沟、池塘、稻田等缓流或静水中。雄鱼好斗,产卵期集草成巢,雄鱼口吐粘液泡沫,雌鱼产卵其中,卵浮性,受精卵在泡沫内孵化。雄鱼尚有护卵和护幼现象。"

# 分词
sents = macropodus.cut_bidirectional(sent)
print("cut_bidirectional: " + " ".join(sents))
sents = macropodus.cut_forward(sent)
print("cut_forward: " + " ".join(sents))
sents = macropodus.cut_reverse(sent)
print("cut_reverse: " + " ".join(sents))
sents = macropodus.cut_search(sent)
print("cut_search: " + " ".join(sents))
# DAG
sents = macropodus.cut_dag(sent)
print("cut_dag: " + " ".join(sents))

文本相似度

文本相似度主要使用词向量, 余弦相似度 或 jaccard相似度

import macropodus

sent1="叉尾斗鱼是一种观赏性动物"
sent2="中国斗鱼生性好斗,适应性强,能在恶劣的环境中生存"
           
# 文本相似度(similarity)
sents = macropodus.sim(sent1, sent2, type_sim="total", type_encode="avg")
print(sents)
sents = macropodus.sim(sent1, sent2, type_sim="cosine", type_encode="single")
print(sents)

文本摘要

文本摘要方法有text_pronouns, text_teaser, word_sign, textrank, lead3, mmr, lda, lsi, nmf

import macropodus

summary = "PageRank算法简介。" \
           "是上世纪90年代末提出的一种计算网页权重的算法! " \
           "当时,互联网技术突飞猛进,各种网页网站爆炸式增长。 " \
           "业界急需一种相对比较准确的网页重要性计算方法。 " \
           "是人们能够从海量互联网世界中找出自己需要的信息。 " \
           "百度百科如是介绍他的思想:PageRank通过网络浩瀚的超链接关系来确定一个页面的等级。 " \
           "Google把从A页面到B页面的链接解释为A页面给B页面投票。 " \
           "Google根据投票来源甚至来源的来源,即链接到A页面的页面。 " \
           "和投票目标的等级来决定新的等级。简单的说, " \
           "一个高等级的页面可以使其他低等级页面的等级提升。 " \
           "具体说来就是,PageRank有两个基本思想,也可以说是假设。 " \
           "即数量假设:一个网页被越多的其他页面链接,就越重)。 " \
           "质量假设:一个网页越是被高质量的网页链接,就越重要。 " \
           "总的来说就是一句话,从全局角度考虑,获取重要的信。 "
           
# 文本摘要(summarize, 默认接口)
sents = macropodus.summarize(summary)
print(sents)

# 文本摘要(summarization, 可定义方法, 提供9种文本摘要方法, 'lda', 'mmr', 'textrank', 'text_teaser')
sents = macropodus.summarization(text=summary, type_summarize="lda")
print(sents)

新词发现

新词发现主要使用凝固度, 左熵, 右熵, 词频等方案, 综合考虑

import macropodus

summary = "PageRank算法简介。" \
           "是上世纪90年代末提出的一种计算网页权重的算法! " \
           "当时,互联网技术突飞猛进,各种网页网站爆炸式增长。 " \
           "业界急需一种相对比较准确的网页重要性计算方法。 " \
           "是人们能够从海量互联网世界中找出自己需要的信息。 " \
           "百度百科如是介绍他的思想:PageRank通过网络浩瀚的超链接关系来确定一个页面的等级。 " \
           "Google把从A页面到B页面的链接解释为A页面给B页面投票。 " \
           "Google根据投票来源甚至来源的来源,即链接到A页面的页面。 " \
           "和投票目标的等级来决定新的等级。简单的说, " \
           "一个高等级的页面可以使其他低等级页面的等级提升。 " \
           "具体说来就是,PageRank有两个基本思想,也可以说是假设。 " \
           "即数量假设:一个网页被越多的其他页面链接,就越重)。 " \
           "质量假设:一个网页越是被高质量的网页链接,就越重要。 " \
           "总的来说就是一句话,从全局角度考虑,获取重要的信。 "
           
# 新词发现(findword, 默认接口)
sents = macropodus.find(text=summary, use_type="text", use_avg=False, use_filter=False, use_output=True, freq_min=2, len_max=5, entropy_min=2.0, aggregation_min=3.2)
print(sents)

关键词

关键词抽取使用的是textrank, 边关系构建: 1. 字向量构建句向量; 2. 余弦相似度计算边得分

import macropodus

sent = "斗鱼属,Macropodus (1801),鲈形目斗鱼科的一属鱼类。本属鱼类通称斗鱼。因喜斗而得名。分布于亚洲东南部。中国有2种,即叉尾斗鱼,分布于长江及以南各省;叉尾斗鱼,分布于辽河到珠江流域。其喜栖居于小溪、河沟、池塘、稻田等缓流或静水中。雄鱼好斗,产卵期集草成巢,雄鱼口吐粘液泡沫,雌鱼产卵其中,卵浮性,受精卵在泡沫内孵化。雄鱼尚有护卵和护幼现象。"
# 关键词(keyword)
sents = macropodus.keyword(sent)
print(sents)

命名实体提取

  • ner, albert+bilstm+crf网络架构, 最大支持126个字符;
  • 需要安装tensorflow==1.15.0, keras-bert==0.80.0, keras-adaptive-softmax==0.6.0(pip安装不默认下载, 1.15.0以下未实验, 1.13以上应该可以);
  • 需要下载模型(pip安装不默认下载, 将ner_albert_people_1998覆盖到安装目录macropodus/data/model);
  • 模型地址在https://pan.baidu.com/s/1I3vydhmFEQ9nuPG2fDou8Q, 提取码:rket;
import macropodus

summary = "美丽的广西是我国华南地区的一颗璀璨的明珠,山清水秀生态美,风生水起万象新。"
res_ner = macropodus.ner(summary)
print(res_ner)
res_ners = macropodus.ners([summary])
print(res_ners)

词性标注

  • pos tag, albert+bilstm+crf网络架构, 最大支持126个字符;
  • 需要安装tensorflow==1.15.0, keras-bert==0.80.0, keras-adaptive-softmax==0.6.0(pip安装不默认下载, 1.15.0以下未实验, 1.13以上应该可以);
  • 需要下载模型(pip安装不默认下载, 将tag_albert_people_1998覆盖到安装目录macropodus/data/model);
  • 模型地址在https://pan.baidu.com/s/1I3vydhmFEQ9nuPG2fDou8Q, 提取码:rket;
import macropodus

summary = "美丽的广西是我国华南地区的一颗璀璨的明珠,山清水秀生态美,风生水起万象新。"
res_postag = macropodus.postag(summary)
print(res_postag)
res_postags = macropodus.postags([summary])
print(res_postags)

常用小工具(tookit)

工具包括科学计算器, 中文繁体-简体转换, 阿拉伯-中文数字转换, 罗马数字-阿拉伯数字转换, 中文拼音

import macropodus

sen_calculate = "23 + 13 * (25+(-9-2-5-2*3-6/3-40*4/(2-3)/5+6*3))加根号144你算得几多"
sen_chi2num = "三千零七十八亿三千零十五万零三百一十二点一九九四"
sen_num2chi = 1994.1994
sen_roman2num = "IX"
sen_num2roman = 132
# tookit, 科学计算器
score_calcul = macropodus.calculate(sen_calculate)
print(score_calcul)
# tookit, 中文数字转阿拉伯
res_chi2num = macropodus.chi2num(sen_chi2num)
print(res_chi2num)
# tookit, 阿拉伯数字转中文
res_num2chi = macropodus.num2chi(sen_num2chi)
print(res_num2chi)
# tookit, 阿拉伯数字转罗马数字
res_roman2num = macropodus.roman2num(sen_roman2num)
print(res_roman2num)
# tookit, 罗马数字转阿拉伯数字
res_num2roman = macropodus.num2roman(sen_num2roman)
print(res_num2roman)
# 中文汉字转拼音
res_pinyin = macropodus.pinyin(summary)
print(res_pinyin)
# 中文繁体转简体
res_zh2han = macropodus.zh2han(summary)
print(res_zh2han)
# 中文简体转繁体
res_han2zh = macropodus.han2zh(res_zh2han)
print(res_han2zh)

参考/引用

Reference

For citing this work, you can refer to the present GitHub project. For example, with BibTeX:

@misc{Macropodus,
    howpublished = {\url{https://github.com/yongzhuo/Macropodus}},
    title = {Macropodus},
    author = {Yongzhuo Mo},
    publisher = {GitHub},
    year = {2020}
}

评论

暂无评论