一.获取语料
获取语料本质上就是制作需要训练模型的数据集,所有的NLP问题都是从语料中学习到数据分布的规律。
1.1语料的分类
- 单语料:只有句子和句子的集合。
- 平行语料:句子1V1对应的关系。
- 复杂结构:问答数据集,评论语料库。
语料通常有:
- 国家语委现代汉语通用平衡语料库
- 北京语言大学语料库中心BCC语料库
- 清华大学中英平行语料库
- HSK动态作文语料库
- 中国特色话语对外翻译标准化术语库
- 英国国家语料库(BritishNationalCorpus, BNC)
- MultiTurnResponseSelection
8.诗歌数据集
1.2获取的方法:
- 公开数据集
- 爬虫
- 社交工具埋点
- github等公开的数据库
二.预处理数据
1.NLTK
对基本的英文操作均可支持
基本操作
命名实体识别
entities = nltk.chunk.ne_chunk(tagged)
句法构造树
from nltk.corpus import treebank
t = treebank.parsed_sents(‘wsj_0001.mrg’)[0]
t.draw()
2.jieba分词器
支持四种分词模式:
精确模式,试图将句子最精确地切开,适合文本分析;
全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
paddle模式,利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。paddle模式使用需安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。目前paddle模式支持jieba v0.40及以上版本。jieba v0.40以下版本,请升级jieba,pip install jieba --upgrade 。PaddlePaddle官网
支持繁体分词
支持自定义词典
MIT 授权协议
# encoding=utf-8
import jieba
jieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持,早期版本不支持
strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"]
for str in strs:
seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式
print("Paddle Mode: " + '/'.join(list(seg_list)))
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 精确模式
seg_list = jieba.cut("他来到了网易杭研大厦") # 默认是精确模式
print(", ".join(seg_list))
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 搜索引擎模式
print(", ".join(seg_list))
3.SnowNLP
SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode。
from snownlp import SnowNLP
s = SnowNLP(u'这个东西真心很赞')
s.words # [u'这个', u'东西', u'真心',
# u'很', u'赞']
s.tags # [(u'这个', u'r'), (u'东西', u'n'),
# (u'真心', u'd'), (u'很', u'd'),
# (u'赞', u'Vg')]
s.sentiments # 0.9769663402895832 positive的概率
s.pinyin # [u'zhe', u'ge', u'dong', u'xi',
# u'zhen', u'xin', u'hen', u'zan']
s = SnowNLP(u'「繁體字」「繁體中文」的叫法在臺灣亦很常見。')
s.han # u'「繁体字」「繁体中文」的叫法
# 在台湾亦很常见。'
text = u'''
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。
它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。
自然语言处理是一门融语言学、计算机科学、数学于一体的科学。
因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,
所以它与语言学的研究有着密切的联系,但又有重要的区别。
自然语言处理并不是一般地研究自然语言,
而在于研制能有效地实现自然语言通信的计算机系统,
特别是其中的软件系统。因而它是计算机科学的一部分。
'''
s = SnowNLP(text)
s.keywords(3) # [u'语言', u'自然', u'计算机']
s.summary(3) # [u'因而它是计算机科学的一部分',
# u'自然语言处理是一门融语言学、计算机科学、
# 数学于一体的科学',
# u'自然语言处理是计算机科学领域与人工智能
# 领域中的一个重要方向']
s.sentences
s = SnowNLP([[u'这篇', u'文章'],
[u'那篇', u'论文'],
[u'这个']])
s.tf
s.idf
s.sim([u'文章'])# [0.3756070762985226, 0, 0]
Features
中文分词(Character-Based Generative Model)
词性标注(TnT 3-gram 隐马)
情感分析(现在训练数据主要是买卖东西时的评价,所以对其他的一些可能效果不是很好,待解决)
文本分类(Naive Bayes)
转换成拼音(Trie树实现的最大匹配)
繁体转简体(Trie树实现的最大匹配)
提取文本关键词(TextRank算法)
提取文本摘要(TextRank算法)
tf,idf
Tokenization(分割成句子)
文本相似(BM25)
支持python3(感谢erning)
4.Pyrouge
论文:https://aclanthology.org/W04-1013.pdf
from pyrouge import Rouge155
r = Rouge155()
r.system_dir = 'path/to/system_summaries'
r.model_dir = 'path/to/model_summaries'
r.system_filename_pattern = 'some_name.(\d+).txt'
r.model_filename_pattern = 'some_name.[A-Z].#ID#.txt'
output = r.convert_and_evaluate()
print(output)
output_dict = r.output_to_dict(output)
5.LTP
哈工大的一个强大的开源NLP工具
import torch
from ltp import LTP
# 默认 huggingface 下载,可能需要代理
ltp = LTP("LTP/small") # 默认加载 Small 模型
# 也可以传入模型的路径,ltp = LTP("/path/to/your/model")
# /path/to/your/model 应当存在 config.json 和其他模型文件
# 将模型移动到 GPU 上
if torch.cuda.is_available():
# ltp.cuda()
ltp.to("cuda")
# 自定义词表
ltp.add_word("汤姆去", freq=2)
ltp.add_words(["外套", "外衣"], freq=2)
# 分词 cws、词性 pos、命名实体标注 ner、语义角色标注 srl、依存句法分析 dep、语义依存分析树 sdp、语义依存分析图 sdpg
output = ltp.pipeline(["他叫汤姆去拿外衣。"], tasks=["cws", "pos", "ner", "srl", "dep", "sdp", "sdpg"])
# 使用字典格式作为返回结果
print(output.cws) # print(output[0]) / print(output['cws']) # 也可以使用下标访问
print(output.pos)
print(output.sdp)
# 使用感知机算法实现的分词、词性和命名实体识别,速度比较快,但是精度略低
ltp = LTP("LTP/legacy")
# cws, pos, ner = ltp.pipeline(["他叫汤姆去拿外衣。"], tasks=["cws", "ner"]).to_tuple() # error: NER 需要 词性标注任务的结果
cws, pos, ner = ltp.pipeline(["他叫汤姆去拿外衣。"], tasks=["cws", "pos", "ner"]).to_tuple() # to tuple 可以自动转换为元组格式
# 使用元组格式作为返回结果
print(cws, pos, ner)
6.Gensim
知乎教程:https://zhuanlan.zhihu.com/p/37175253
关键技能
TF-IDF
LSA
LDA
Word2vec
目前存在的python-based机器学习框架
1.pytorch(80%左右)
2.tensorflow(15%左右)
3.keras
4.caffe
5.paddlepaddle
6.Theano
Theano 是蒙特利尔大学 LISA 实验室推出的深度学习框架,它的官网地址为 http://deeplearning.net/software/theano。
Theano 在日前已经宣布终止开发,这里简单了解一下即可。就深度学习而言,Theano 是很老牌的包,它具有优化的数值计算,曾用于很多深度学习包的开端。
7.MXNet
8.sklearn
9.MindSpore(华为)
10.Cognitive Toolkit(NCNN:
11.MegEngine(京旷视科技有限公司宣布开源其AI生产力平台Brain++的核心组件)
12.Jittor(北京信息科学与技术国家研究中心可视媒体智能计算团队宣布开源其深度学习框架)
13.Cognitive Toolkit(CNTK)
这是微软公司研究院维护的一套框架,通常被称作微软认知工具箱(Cognitive Toolkit),更广为人知的缩写是 CNTK。GitHub 的地址为 https://github.com/Microsoft/CNTK
14.DL4J
DL4J 的全称是 DeepLearning4J,是一套基于 Java 语言的深度学习工具包,由 Skymind 公司支持并维护,它的官网地址为 https://deeplearning4j.org/。DL4J 是很适合程序员和数据工程师的包。DL4J 兼容 JVM,也适用 Java、Clojure 和 Scala,并且包括了分布式、多线程的深度学习框架,这显然与大多数程序员日常编程的语言和工作环境相类似。同时,DL4J 有着极其精美友好的文档和活跃的社区支持,社区中提供的科学论文、案例和教程都很有参考价值,推荐大家关注。
15.Lasagne
Lasagne 是一个工作在 Theano 之上的包,它的官网地址为 https://lasagne.readthedocs.io/en/latest/index.html。同 Keras 的定位类似,此类搭建在低层框架(Theano)上的包,旨在降低深度学习算法的上手难度。Lasagne 的优点在于它严谨的架构逻辑和较强的可适应性,但它的缺点是,作为一个老牌的包,和 Keras 相比,Lasagne 的更新速度、社区活跃度和文档友好程度都稍显落后。现在随着 Theano 的终止开发,Lasagne 的使用率应该会越来越低。对于初学者而言,目前并不建议选用 Lasagne,但是 Theano+Lasagne 的组合,在深度学习项目上是很常见的选择,如果读者日后参阅 GitHub 上的项目,还有可能会遇到,所以在此介绍一下,供读者参考。
16.DSSTNE
DSSTNE 是 Deep Scalable Sparse Tensor Network Engine(深度可伸缩稀疏张量网络引擎)的缩写,由亚马逊公司发布和维护,它的官网地址为 https://www.amazon.com/amzn/amazon-dsstne。这并不是一个面向主流的深度学习框架,因为 DSSTNE 就是为了推荐系统而设计的。DSSTNE 是针对稀疏数据的情况完全从头开始构建的,并且完全使用 GPU 运行,即设计了针对单服务器多 GPU 的计算环境。其结果是,在稀疏数据的场景下,DSSTNE 的运算速度比其他深度学习包快得多。虽然这个框架并不支持用户随意在 CPU 和 GPU 之间切换,但是这个功能却在深度学习中经常用到。
虽然 DSSTNE 框架并不具备普适性,但在大热的自然语言理解与视觉识别之外,它在搜索与推荐领域也有着巨大的应用空间,相信这也是亚马逊公司开源 DSSTNE 的初衷。
参考链接:
1.https://c.biancheng.net/view/9771.html
2.https://zhuanlan.zhihu.com/p/473793742?utm_id=0