自然语言处理综合

本文介绍了自然语言处理(NLP)的基本概念、子领域和常用数据集,强调了Python中如jieba、Pyltp、NLTK、BERT、GloVe和Spacy等工具包的作用,并探讨了预训练模型在NLP任务中的应用。
摘要由CSDN通过智能技术生成

一、自然语言处理介绍

概念

通俗而言,自然语言处理 (Natural Language Processing) 即为处理与人类语言相关的各项任务。与计算机视觉类似,是一个由来已久,却在近几年被神经网络颠覆的传统领域,在人机对话、搜索引擎、后台广告推荐、机器翻译、语音识别等领域有广泛应用。传统的自然语言处理以统计学为根基,发展出了各具特色的优异模型,其中最为著名的包括 朴素贝叶斯、隐马尔科夫模型 (HMM)、条件随机场 (CRF)。神经网络的出现使得 NLP 领域得到空前的发展,从 Word2Vec (2013) 到 Attention机制 (2014)、Transformer (2017)、号称开启 NLP 新纪元的集大成者 BERT (2018),再到近期卡内基梅隆大学的团队研发的 XLNet (2019),NLP 在不断树立新的里程碑,走在人工智能的前沿。

子领域
  • 语音文本
    文本朗读(Text to Speech)
    语音合成(Speech Synthesis)
    语音识别(Speech Recognition)
  • 自然语言理解
    中文分词(Chinese Word Segmentation)
    词性标注(Part-of-Speech Tagging)
    句法分析(Parsing)
    情绪分析(Sentiment Analysis)
    文字蕴涵(Textual Entailment)
    自然语言生成(Natural Language Generation)
    问答系统(Question Answering)
    人机对话(Man-Machine Interaction)
    文字校对(Text-Proofing)
    机器翻译(Machine Translation)
  • 大型文本分析
    信息抽取(Information Extraction)
    自动摘要(Automatic Summarization)
    文本分类(Text Categorization)
    信息检索(Information Retrieval)
  • 文本处理
    模式匹配(Pattern Matching)
    文本相似度(Text Similarity)
    文本压缩(Text Compression)

NLP-Progress 提供了更为详细的分类,同时阐述了每个领域下的 SOTA (State-Of-The-Art) 模型。

数据集
数据集 内容 领域 语言 数量
IWSLT TED演讲多国语言字幕 机器翻译 中英 不限
SQuAD 维基百科词条 文档问答 英文 150,000+
DuReader 用户日志 文档问答 中文 -
CoQA 人为对话 对话问答 英文 127,000+
LOB 历史文献 词性标注 英文 1,000,000

这里只呈现笔者自己熟悉的数据集,网上有很多关于开源数据集的总结博文,这里推荐几篇:https://www.jiqizhixin.com/articles/2018-09-05-2
https://blog.csdn.net/enohtzvqijxo00atz3y8/article/details/80163069

工具包

中文 NLP 领域著名的 Python 工具包列示如下:

  • Python Language Technology Platform (Pyltp)
    Pyltp 是 LTP 的 Python 封装,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能。
  • Jieba
    专业提供分词功能的工具包。
  • Standford NLP
    除可以实现 Pyltp 的功能以外,还能进行情绪分析,但安装较为复杂,需要通过 Java 安装并设置 Python 接口。

英文 NLP 领域有:

  • Natural Language Toolkit (NLTK)
    A Python library that provides modules for processing text, classifying, frequency analyzing, tokenizing, stemming, part-of-speech tagging, parsing, and more.
  • Apache OpenNLP
    A machine learning toolkit that provides tokenizers, sentence segmentation, part-of-speech tagging, named entity extraction, chunking, parsing, coreference resolution, and more.
  • Standford NLP
    A suite of NLP tools that provide part-of-speech tagging, the named entity recognizer, coreference resolution system, sentiment analysis, and more.
  • GlounNLP
    Provides implementations of the state-of-the-art (SOTA) deep learning models in NLP, and build blocks for text data pipelines and models. It is designed for engineers, researchers, and students to fast prototype research ideas and products based on these models.

二、API

笔者将分词、词性标注、命名实体识别、句法分析、语义角色标注等应用领域底层的 NLP 任务定义为基础 NLP 任务。在实际的应用研究与开发时,由于语料库的准备成本较高,预训练通常也耗时过长。在研究时,这一部分任务通常可以通过调用第三方专业机构预训练好的模型实现,将更多的注意力集中到上层模型的设计和搭建。特别地,当预训练的模型无法满足实际的业务需求时,可以通过定义用户词典修正模型结果。本章详细列示基础 NLP 任务的 API 实现。

由于中文的特殊性,中文 NLP 与 英文 NLP 的一大不同在于中文文本处理需要借助语料库预先对语句进行分词,而英文只需要通过空格即可完成。在 Python 语言环境下,运用 Nshort 中文分词算法的 Jieba 出于杰出的分词效果,以及安装和使用方便,成为最为著名的中文分词工具。在其他的基础 NLP 任务上,哈尔滨工业大学开发的 Pyltp 库更为专业和全面,词库储备也更为丰富,在学术界和工业界得到广泛应用。

Jieba (分词)

关于 Jieba,以下仅列示分词相关代码:

import jieba
sentence = '里约热内卢的奶牛拿榴莲牛奶以折足之姿跑到委内瑞拉拿了蜂花护发素送给红鲤鱼与绿鲤鱼与驴'

wordlist = jieba.cut(sentence)    #精确模式
wordlist = jieba.cut(sentence, cut_all=True)    #全模式
wordlist = jieba.cut_for_search(sentence)    #搜索引擎模式
jieba.load_userdict(open(r'D:\NLP resources\jieba userdict.txt',encoding='gbk'))    #导入用户词典

精确模式:试图将句子最精确地切开,适合文本分析;
全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词;
使用用户词典:由用户自行选择地址新建词典 txt 文档,需要满足每行’词语 词频 词性’的编写要求,例:‘榴莲牛奶 5 n’。

Pyltp (分词、词性标注、命名实体识别、句法依存树、语义角色标注)
from pyltp import *
sentence = '里约热内卢的奶牛拿榴莲牛奶,以折足之姿跑到委内瑞拉拿了蜂花护发素,送给红鲤鱼与绿鲤鱼与驴'

# 分词
segmentor = Segmentor()
segmentor.load(r'D:\NLP resources\cws.model')
words = segmentor.segment(sentence)
print("|".join(words))

# 词性标注
pos_tagger = Postagger()
pos_tagger.load(r'D:\NLP resources\pos.model')
pos_tags = pos_tagger.postag(words)
for word,pos_tag in zip(words,pos_tags):
    print(word+'/'+pos_tag)

# 命名实体识别
recognizer = NamedEntityRecognizer()
recognizer.load(r'D:\NLP resources\ner.model')
ne_tags = recognizer.recognize(words,pos_tags)
for word,pos_tag,ne_tag in zip(words,pos_tags,ne_tags):
    print(word+' / '+pos_tag+' / '+ne_tag)
    
# 句法依存树
import nltk
from nltk.tree import Tree
from nltk.grammar import DependencyGrammar
from nltk.parse import *
import re
parser = Parser(
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值