人工智能学习:NLP文本处理的基本方法
一、分词
1、分词介绍
概念
分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符。分词过程就是找到这样分界符的过程。例如:
Python传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能 ['传智', '教育', '是', '一家', '上市公司', ',', '旗下', '有', '黑马', '程序员', '品牌', '。', '我', '是', '在', '黑马', '这里', '学习', '人工智能']
作用
- 预处理:分词是文本处理的第一步,能够将文本分解成有意义的单元,为后续的分析提供基础。
- 理解结构:分词有助于理解句子的基本构成和含义,尤其是在做文本分类、情感分析等任务时,分词是不可缺少的一步。
常用的中文分词工具包括Jieba、THULAC、HanLP等。
2、Jieba分词工具
Jieba(”结巴”)是一个开源的Python中文分词组件,它支持精确模式、全模式和搜索引擎模式三种分词模式。
Jieba的主要特点:
- 支持多种分词模式:精确模式、全模式和搜索引擎模式,满足不同场景的需求。
- 支持自定义词典:用户可以添加自定义的词语,提高分词准确率。
- 支持词性标注:可以为每个词语标注词性,例如名词、动词等。
- 支持关键词提取:可以提取文本中的关键词。
- 支持并行分词:可以利用多核处理器加速分词。
- 简单易用:API 简单明了,易于上手。
- 开源免费:任何人都可以免费使用。
Jieba的安装:
Bash
pip install jieba -i https://pypi.mirrors.ustc.edu.cn/simple/
Jieba的基本使用:
精确模式分词:试图将句子最精确地切分开,适合文本分析。
Pythonimport jieba content = "传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能" # 精确模型:试图将句子最精确地切开,适合文本分析。也属于默认模式 jieba.cut(sentence=content, cut_all=False) # cut_all默认为False # 将返回一个生成器对象 <generator object Tokenizer.cut at 0x7f8d9053e650> # 若需直接返回列表内容, 使用jieba.lcut即可 jieba.lcut(sentence=content, cut_all=False) ['传智', '教育', '是', '一家', '上市公司', ',', '旗下', '有', '黑马', '程序员', '品牌', '。', '我', '是', '在', '黑马', '这里', '学习', '人工智能']
全模式分词: 将句子中所有可以成词的词语都扫描出来,速度非常快,但是不能消除歧义。
Pythonimport jieba content = "传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能" # 若需直接返回列表内容, 使用jieba.lcut即可 jieba.lcut(sentence=content, cut_all=True) ['传', '智', '教育', '是', '一家', '上市', '上市公司', '公司', ',', '旗下', '下有', '黑马', '程序', '程序员', '品牌', '。', '我', '是', '在', '黑马', '这里', '学习', '人工', '人工智能', '智能'] # 注意1:人工智能全模型分成三个词 # 注意2:逗号和句号也给分成了词
搜索引擎模式分词:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
Pythonimport jieba content = "传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能" jieba.cut_for_search(sentence=content) # 将返回一个生成器对象 <generator object Tokenizer.cut_for_search at 0x7f8d90e5a550> # 若需直接返回列表内容, 使用jieba.lcut_for_search即可 jieba.lcut_for_search(sentence=content) ['传智', '教育', '是', '一家', '上市', '公司', '上市公司', ',', '旗下', '有', '黑马', '程序', '程序员', '品牌', '。', '我', '是', '在', '黑马', '这里', '学习', '人工', '智能', '人工智能'] # 对'人工智能'等较长词汇都进行了再次分词。
中文繁体分词:针对中国香港, 台湾地区的繁体文本进行分词。
Pythonimport jieba content = "煩惱即是菩提,我暫且不提" jieba.lcut(content) ['煩惱', '即', '是', '菩提', ',', '我', '暫且', '不', '提']
使用用户自定义词典:添加自定义词典后, jieba能够准确识别词典中出现的词汇,提升整体的识别准确率。
Python词典格式: 每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。
词典样式如下, 具体词性含义请参照7章节的jieba词性对照表, 将该词典存为userdict.txt, 方便之后加载使用。
Python格式:word1 freq1 word_type1 黑马程序员 5 n 传智教育 6 n 人工智能 7 nz 学习 3 上市 3
import jieba content = '传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能' # 1 没有使用用户自定义词典 mydata = jieba.lcut(sentence=content, cut_all=False) print('mydata-->', mydata) # 2 使用用户自定义词典 jieba.load_userdict("./userdict.txt") mydata2 = jieba.lcut(content, cut_all=False) print('mydata2-->', mydata2) # 没有使用用户自定义词典的分词效果 mydata--> ['传智', '教育', '是', '一家', '上市公司', ',', '旗下', '有', '黑马', '程序员', '品牌', '。', '我', '是', '在', '黑马', '这里', '学习', '人工智能'] # 使用用户自定义词典的分词效果 mydata2--> ['传智教育', '是', '一家', '上市公司', ',', '旗下', '有', '黑马程序员', '品牌', '。', '我', '是', '在', '黑马', '这里', '学习', '人工智能']
二、命名实体识别
概念
命名实体识别(NER)是自然语言处理中的一个任务,旨在从文本中识别出特定类别的实体(如人名、地名、机构名、日期、时间等)。NER是信息抽取的一部分,帮助计算机识别出与任务相关的实体信息。
例如:
Python鲁迅, 浙江绍兴人, 五四新文化运动的重要参与者, 代表作朝花夕拾. ==> 鲁迅(人名) / 浙江绍兴(地名)人 / 五四新文化运动(专有名词) / 重要参与者 / 代表作 / 朝花夕拾(专有名词)
作用
- 信息抽取:NER帮助从海量的文本中自动抽取出结构化的实体信息,为数据分析、问答系统等提供有价值的内容。
- 问答系统:在智能问答系统中,NER能够帮助系统准确理解用户的提问,并提取相关的实体信息以便生成更准确的回答。
- 文本理解:NER对于文本理解至关重要,它帮助系统识别出文本中的关键信息,例如人物、地点、组织等,进而为语义分析和事件抽取提供支持。
处理工具
- SpaCy、NLTK、Stanford NER、BERT(通过微调)、LTP、HanLP等都可以用于命名实体识别任务。
举个例子
Pythonfrom hanlp_restful import HanLPClient # 安装 pip install hanlp_restful # 创建客户端 # auth 不填则匿名,zh表示中文 HanLP = HanLPClient('https://www.hanlp.com/api', auth=None, language='zh') text = "鲁迅, 浙江绍兴人, 五四新文化运动的重要参与者, 代表作朝花夕拾." # 进行命名实体识别 # 只选择一个任务,包含了分词和命名实体识别 result = HanLP.parse(text, tasks=['ner/msra']) print(result)
输出结果:
Python{ "tok/fine": [ ["鲁迅", ",", "浙江", "绍兴人", ",", "五四", "新", "文化", "运动", "的", "重要", "参与者", ",", "代表作", "朝花夕拾", "."] ], "ner/msra": [ [["鲁迅", "PERSON", 0, 1], ["浙江", "LOCATION", 2, 3], ["五四", "DATE", 5, 6], ["文化", "ORGANIZATION", 7, 8]] ] }
三、词性标注
概念
词性标注(Part-Of-Speech tagging, 简称POS)就是为文本中的每个词分配一个语法类别(即词性),例如名词、动词、形容词等。词性标注能够帮助模型理解词汇在句子中的语法功能,并为进一步的句法分析和语义分析提供支持。
类型
- 名词n:表示人、事物、地方等,例如
"中国"
,"鲁迅"
。 - 动词v:表示动作、存在等,例如
"跑"
,"吃"
。 - 形容词a:描述事物的性质或状态,例如
"大"
,"美丽"
。 - 副词d:修饰动词、形容词或其他副词,例如
"马上"
,"非常"
。 - 代词r:代替名词的词,例如
"我"
,"他们"
。
我爱自然语言处理 ==> 我/rr, 爱/v, 自然语言/n, 处理/vn rr: 人称代词 v: 动词 n: 名词 vn: 动名词
- 名词n:表示人、事物、地方等,例如
作用
- 理解句子结构:通过词性标注,可以知道每个词在句子中的角色,帮助理解句子的语法结构。
- 支持其他NLP任务:许多高级任务如命名实体识别(NER)、句法分析、情感分析等,通常依赖于词性标注的结果。
- 歧义消解:词性标注有助于解决同一单词在不同上下文中可能具有不同词性的情况。例如,单词 “lead” 可能是动词(引导)也可能是名词(铅),通过词性标注可以解决这种歧义。
处理工具
- Jieba、NLTK、SpaCy、Stanford POS Tagger等是常用的词性标注工具。
举个例子
Pythonimport jieba.posseg as pseg # 示例文本 text = "我爱北京天安门" # 步骤 1: 分词并词性标注 # # 结果返回一个装有pair元组的列表, 每个pair元组中分别是词汇及其对应的词性, 具体词性含义请参照[附录: jieba词性对照表]() words = pseg.lcut(text) print('words->', words) # 提取命名实体(人名、地名、组织机构名) named_entities = [] for word, flag in words: if flag in ['r', 'v', 'ns']: # r: 代词, v:动词, ns: 地名 named_entities.append((word, flag)) print('named_entities->', named_entities)
四、知识点总结
什么是分词:
- 分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符, 分词过程就是找到这样分界符的过程.
分词的作用:
- 词作为语言语义理解的最小单元, 是人类理解文本语言的基础. 因此也是AI解决NLP领域高阶任务, 如自动问答, 机器翻译, 文本生成的重要基础环节.
中文分词工具jieba:
- 支持多种分词模式: 精确模式, 全模式, 搜索引擎模式
- 支持中文繁体分词
- 支持用户自定义词典
什么是命名实体识别:
- 命名实体: 通常我们将人名, 地名, 机构名等专有名词统称命名实体. 如: 周杰伦, 黑山县, 孔子学院, 24辊方钢矫直机.
- 顾名思义, 命名实体识别(Named Entity Recognition,简称NER)就是识别出一段文本中可能存在的命名实体.
命名实体识别的作用:
- 同词汇一样, 命名实体也是人类理解文本的基础单元, 因此也是AI解决NLP领域高阶任务的重要基础环节.
什么是词性标注:
- 词性: 语言中对词的一种分类方法,以语法特征为主要依据、兼顾词汇意义对词进行划分的结果, 常见的词性有14种, 如: 名词, 动词, 形容词等.
- 顾名思义, 词性标注(Part-Of-Speech tagging, 简称POS)就是标注出一段文本中每个词汇的词性.
词性标注的作用:
- 词性标注以分词为基础, 是对文本语言的另一个角度的理解, 因此也常常成为AI解决NLP领域高阶任务的重要基础环节.