版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
专题三自然语言处理初步CATALOGUE目录01文本处理re库02中文分词工具jieba库03词云图绘制worldcloud库04综合实例:中文文本关键词分析自然语言指的是人们日常交流、思考所使用的语言。自然语言处理的主要目标是实现计算机对自然语言的理解和运用,是当前人工智能领域的一个重要研究主题。主要任务包括自然语言的理解和自然语言的生成两个方面。引入01文本处理re库re库是Python语言提供的用于实现正则表达式处理功能的标准库。正则表达式(RegularExpression)是一种强大的文本处理工具,它使用一种特殊的语法来描述文本模式,便于搜索、匹配、替换或验证符合该模式的字符串。基本概念序号需要匹配的文本模式正则表达式(根据re库语法构造)1英文单词”hello”‘hello‘2字符串"http"或"https"‘http|https’3以1开头的共计11位手机号码‘1\d{10}’表11-1正则表达式示例正则表达式由普通字符和特殊字符构成。普通字符匹配自身,特殊字符用于赋予它所在正则表达式以特殊含义,或者表示某一类普通字符。正则表达式基本语法
正则表达式基本语法-常用特殊字符特殊字符语义说明(如非特殊说明,均指默认方式下的语义).匹配除换行符(\n)以外的任意单个字符^匹配目标字符串的起始位置。在MULTILINE方式下也匹配行首。$匹配目标字符串的末尾位置。在MULTILINE方式下也匹配行尾。*匹配前面的字符或子表达式0次或任意多次。如‘.*’匹配0到任意多个除换行符以外的任意字符,当然也包括空字符。+匹配前面的字符或子表达式1次或任意多次。如’a*’匹配包含1个到多个a的字符串。?匹配前面的字符或子表达式0次或1次{m}匹配前面的字符或子表达式m次。如’a{3}’匹配字符串“aaa”{m,n}匹配前面的字符或子表达式m至n次。如果m缺失,则表示之多匹配n次;如果n缺失,则表示至少匹配m次。[]匹配[]包含的字符集合中的任意一个字符。如’[0-9]’表示匹配一位阿拉伯数字,’[a-zA-Z]’表示匹配一位英文字母。[^]匹配给定字符集合以外的任意字符。如’[^0-9]’表示匹配除阿拉伯数字以外的任意一位字符,’[^a-zA-Z]’表示匹配除了英文字符以外的任意一位字符。|连接两个字符或子表达式,表示匹配其中任意一个皆可。示例参见表11-1。()定义子表达式(或称分组)。如’(abc){2}’匹配字符串’abcabc’。利用分组
可以从所匹配的字符串中单独提取出分组匹配的子串。
正则表达式基本语法-常用特殊序列
特殊序列语义说明\A匹配字符串起始位置\Z匹配字符串末尾位置\w匹配单词类字符。在ASCII方式下等价于[a-zA-Z0-9_]\W匹配非单词类字符。在ASCII方式下等价于[^a-zA-Z0-9_]\b匹配单词边界,即\w与\W的边界。如模式串'\bat\b'能够匹配目标串‘at’,但是无法匹配目标串’fat’和’at_’。\B匹配非单词边界,与\b匹配的边界类型正好相反。\d匹配任何数字,在ASCII方式下等价于[0-9].\D匹配非数字,在ASCII方式下等价于[^0-9]\s匹配任何空白字符.在ASCII方式下等价于[\f\n\r\t\v]\S匹配任何空白字符.某电子邮箱服务商规定用户注册新邮箱的名字应当满足以下条件:邮箱名长度16个字符以内;限用小写英文字母、数字或者下划线;下划线不能在结尾如何检查用户填写的新邮箱名称是否符合上述要求?可行的正则表达式:’^[a-z0-9_]{0,15}[^_]$’参考解答:实例11-1邮箱名检查现有如下包含多条日志的文本,请从中提取出ERROR类别的所有日志消息。2023-04-0112:01:01INFO[MyApp]Serverstartedsuccessfullyonport80802023-04-0112:02:15DEBUG[Database]Queryexecuted:SELECT*FROMusers2023-04-0112:03:05ERROR[AuthenticationService]Userauthenticationfailed2023-04-0112:04:22INFO[CacheService]Cacheclearedsuccessfully2023-04-0112:05:30ERROR[PaymentProcessor]PaymentfailedfororderID123452023-04-0112:06:45WARN[InventoryService]LowstockdetectedforproductID678902023-04-0112:07:59INFO[WebServer]Received100requestsinthelastminute2023-04-0112:09:12ERROR[EmailService]Failedtosendemailtouser@可行的正则表达式:'^\d{4}-\d{2}-\d{2}\d{2}:\d{2}:\d{2}ERROR\[.+\](.*)$'。整个模式串匹配出所有ERROR日志所在的行,尾部的分组’(.*)’匹配具体错误消息。参考解答:实例11-2日志消息提取(1)根据匹配需求写好正则表达式后,接下来通常是编译该表达式,得到一个Pattern对象。pattern:为模式串,即正则表达式,通常使用原始字符串形式。flags用于设置正则表达式的工作方式,0表示默认方式返回一个classPattern对象。pile(pattern,flags=0)编译和使用正则表达式方法定义功能match(string[,
pos[,
endpos]])检查目标串string起始是否匹配正则表达式,是则返回一个对应的Match对象,否则返回None。可选参数pos可以指定从目标串的特定位置(而不是开头)开始匹配,endpos则指定匹配结束的位置。search(string[,
pos[,
endpos]])检查目标串string中与正则表达式首次匹配的位置,如果有匹配则返回一个对应的Match对象,否则返回None。findall(string[,
pos[,
endpos]])检查目标串string中所有与正则表达式匹配的子串(无重叠),并返回这些子串的列表。finditer(string[,
pos[,
endpos]])检查目标串string中所有与正则表达式匹配的子串(无重叠),并以迭代器(iterator)的形式返回包含这些匹配对象的容器。11-4Pattern对象的常用方法>>>importre#re库不是解释器的内置库,因此使用前需要导入>>>p=pile(r'1\d{10}',flags=re.ASCII)#匹配11位手机号码>>>ppile(r'1\d{10}',)编译和使用正则表达式>>>m1=p.match('我的手机号码是12345678901')>>>print(m1)#目标字符串首部匹配失败,返回NoneNone>>>m1=p.match('12345678901是我的手机号')>>>print(m1)#匹配成功,span存放匹配的起始和终止位置索引<re.Matchobject;span=(0,11),match='12345678901'>>>>m2=p.search('我的手机号码是12345678901')>>>print(m2)<re.Matchobject;span=(7,18),match='12345678901'>>>>m3=p.findall('小王:12345678901;小陈:12345678902')>>>print(m3)#返回的是子串列表['12345678901','12345678902']>>>m4=p.finditer('小王:12345678901;小陈:12345678902')>>>forminm4:#返回的是re.Match对象迭代器print(m)<re.Matchobject;span=(3,14),match='12345678901'><re.Matchobject;span=(18,29),match='12345678902'>编译和使用正则表达式方法定义功能group()返回匹配的子串。如果正则表达式中包含分组,还支持提取分组匹配的结果。start()返回匹配的子串在目标字符串中的起始位置索引end()返回匹配的子串在目标字符串中的终止位置索引span()返回(start,end)构成的元组表11-5Match对象的常用方法用代码实现例11-2中的ERROR类别的所有日志消息的提取。实例11-3日志消息提取(2)参考代码11-311-3.py1
importre2
text="""3
2023-04-0112:01:01INFO[MyApp]Serverstartedsuccessfullyonport80804
2023-04-0112:02:15DEBUG[Database]Queryexecuted:SELECT*FROMusers5
2023-04-0112:03:05ERROR[AuthenticationService]Userauthenticationfailed6
2023-04-0112:04:22INFO[CacheService]Cacheclearedsuccessfully7
2023-04-0112:05:30ERROR[PaymentProcessor]PaymentfailedfororderID123458
2023-04-0112:06:45WARN[InventoryService]LowstockdetectedforproductID678909
2023-04-0112:07:59INFO[WebServer]Received100requestsinthelastminute10
2023-04-0112:09:12ERROR[EmailService]Failedtosendemailtouser@11
"""12
error_pattern=pile(r'^\d{4}-\d{2}-\d{2}\d{2}:\d{2}:\d{2}ERROR\[.+\](.*)$',13
flags=re.MULTILINE)#使^和$也匹配行首和行尾14
error_messages=error_pattern.finditer(text)#所有的匹配形成一个可迭代访问的对象15
print("ERROR消息如下:")16
for(i,match)inenumerate(error_messages):17
print(f'({i}){match.group(1)}')#ERROR消息在组1中运行结果输出:实例11-3日志消息提取(2)ERROR消息如下:(0)Userauthenticationfailed(1)PaymentfailedfororderID12345(2)Failedtosendemailtouser@02中文分词工具jieba库中文文本中词汇之间没有空格,分词操作相对英文来说要复杂得多。jieba分词(也称“结巴”分词)是中文自然语言处理领域应用较多的分词工具。它支持简体和繁体中文分词,支持多种分词模式,支持自定义词典,简单易用。引入精确模式:将目标文本精确地切分为词组,适用于通常的分本分析。全模式:将文本中所有可能成词的词语都切分出来。对于有歧义的语句,这种模式可能切分出多种含义。搜索引擎模式:在精确模式的基础上,对长词进一步切分,使得结果词汇有更细的粒度,确保覆盖所有可能的分词组合。这种模式的分词因为切分出的词更多,增加了词条的覆盖面,使得文本更容易被搜索引擎匹配和索引。分词模式系统设计了三种分词模式,以满足不同的需求:主要分词函数函数功能cut(sentence,cut_all=False)对sentence进行分词,分词结果形成一个可迭代访问的数据容器返回。默认为精确模式分词,如果cut_all=True,则为全模式分词。lcut(sentence,cut_all=False)功能与cut()相同,但返回的是列表类型数据。cut_for_search(sentence)搜索引擎分词模式,分词结果形成一个可迭代访问的数据容器返回。lcut_for_search(sentence)功能与cut_for_search()相同,但返回的是列表类型数据。suggest_freq(segment,tune=False)调节词语在词典中的词频,使其在分词过程中被切分或者不被切分。segment为待调节的词或词构成的元组。返回调节后的词频。tune=True时调节词典中的词频,为False时只计算新词频,并不修改词典。add_word(word,freq=None,tag=None)向词典中增加新词,freq和tag对应新词的词频和词性,两者都是可选的参数。del_word(word)从词典中删除词。load_userdict(file)加载自定义词典。file可以是文件的路径或者是文件对象。自定义词典一般用于批量导入行业术语、专有名词等,以提高分词的正确率。实例11-4分词示例(1)对语句“乒乓球拍卖完了”分别进行精确分词、全模式分词和搜索引擎分词。参考代码11-411-4.py1
importjieba2
text="乒乓球拍卖完了"3
#精确分词4
seg_result_precise=jieba.cut(text)5
print("精确分词结果:"+"/".join(seg_result_precise))#以/连接分词结果以便输出展示6
#全模式分词7
seg_result_full=jieba.cut(text,cut_all=True)8
print("全模式分词结果:"+"/".join(seg_result_full))9
#搜索引擎分词10
seg_result_search=jieba.cut_for_search(text)11
print("搜索引擎分词结果:"+"/".join(seg_result_search))实例11-4分词示例(1)运行结果输出:精确分词结果:乒乓球/拍卖/完/了全模式分词结果:乒乓/乒乓球/乒乓球拍/球拍/拍卖/卖完/了搜索引擎分词结果:乒乓/乒乓球/拍卖/完/了实例11-5分词示例(2)调整例11-4中的分词使其按照“乒乓球拍/卖完了”的含义进行分词。参考代码11-511-5.py1
importjieba2
text="乒乓球拍卖完了"3
jieba.suggest_freq('乒乓球拍',tune=True)#方案一,提升'乒乓球拍'的词频4
seg_list_meth1=jieba.lcut(text)5
print("方案一分词结果:"+"/".join(seg_list_meth1))6
jieba.suggest_freq(('拍','卖'),tune=True)#方案二,降低'拍卖'的词频,使得该词被切分7
seg_list_meth2=jieba.lcut(text)8
print("方案二分词结果:"+"/".join(seg_list_meth2))实例11-5分词示例(2)运行结果输出:方案一分词结果:乒乓球/拍卖/完/了方案二分词结果:乒乓球拍/卖完/了实例11-6分词示例(3)对于语句“我爱自然语言处理,也爱机器学习”进行分词,要求将“自然语言处理”、“机器学习”作为专有名词整体被切分出来。解析:在笔者安装的jieba0.42.1版本中,默认情况下,无法直接识别这两个专有名词,而是会将它们分割。为了处理这类专有名词切分的问题,我们可以通过add_word()函数预先将这两个词加入词典中。实例11-6分词示例(3)参考代码11-511-5.py1
importjieba2
text="我爱自然语言处理,也爱机器学习"3
#扩充词典前尝试分词4
seg_list_before=jieba.lcut(text)5
print("未扩充词典前的分词结果:"+"/".join(seg_list_before))6
#扩充词典7
jieba.add_word('自然语言处理')8
jieba.add_word('机器学习')9
seg_list_after=jieba.lcut(text)10
print("扩充词典后的分词结果:"+"/".join(seg_list_after))运行结果输出:未扩充词典前的分词结果:我/爱/自然语言/处理/,/也/爱/机器/学习扩充词典后的分词结果:我/爱/自然语言处理/,/也/爱/机器学习03词云图绘制wordcloud库词云图是一种可视化展示文本主题的方式,主要是通过可视化展示文本的关键词来实现。wordcloud库是一个支持词云图绘制的小巧的第三方库,通过提供灵活的参数配置,如词云形状、颜色、字体大小等,使得用户能够根据自己的需求生成定制化的词云图。引入图11-1《简
爱》高频词词云图wordcloud库-核心类WordCloud名称功能说明font_path指定绘制词云图时使用的字体文件的路径。默认会使用DroidSansMono,绘制中文词云图的时候需要指定支持中文的字体。width和height指定画布的尺寸,默认400*200maskNone或者ndarray数组类型。可以用于定制词云的形状轮廓,而不是默认的矩形。contour_width和contour_color如果mask参数非空,则这两个参数可用于指定词云轮廓线的宽度和色彩。min_font_size和max_font_size指定词的最小和最大字体max_words展示的最大词数stopwords停用词集合,用于过滤停用词background_color通过字符串形式设置画布背景色,默认是黑色。color_func自定义函数,用于指定词的颜色。默认是随机分配颜色。表11-7classWordCloud实例化时的主要参数实例11-7绘制小说《简
爱》的词云图参考代码11-711-7.py1
fromwordcloudimportWordCloud2
importmatplotlib.pyplotasplt3
#读入文本4
try:5
withopen(‘JaneEyre.txt',encoding='utf-8')asfile:6
text=file.read()7
exceptFileNotFoundError:8
print("JaneEyre.txt文件未找到,请检查路径是否正确")9
…#定义stop_words,参见6.3节代码10
#生成词云图对象11
wordcloud=WordCloud(stopwords=stop_words,width=1920,height=1080,12
background_color='white').generate(text)13
#在屏幕上绘制词云图:14
plt.figure()15
plt.imshow(wordcloud,interpolation="bilinear")16
plt.axis("off")17
plt.show()18
#将词云图保存为文件19
wordcloud.to_file("JaneEyre_wordcloud.png")04综合实例:中文文本关键词分析文本关键词提取分析是自然语言处理领域的一项常见任务。文本中的关键词反映了文本的主题或类别,也可以用于文本分类、信息检索、摘要生成等高级应用。前面我们接触过文本高频词提取,然而高频词不一定是反映文本主题的关键词。比如在介绍环境保护的一系列文章中,“环境保护”这个词可能在每一篇文章中都是高频词,但是却无法反映每一篇文章的具体主题。引入【知识拓展】TF-IDF(TermFrequency-InverseDocumentFrequency)算法的主要思想是:对于一个文件集或一个语料库中的一个文本,如果某个词或短语在这个文本中出现的频率高,并且在其他文本中很少出现,则认为此词或者短语一定程度上反映了这个文本的主题。TF-IDF算法通过计算词频(TF)和逆文档频率(IDF)的乘积来评估词语的重要性。TF表示某个词在一篇文档中出现的频率,而IDF则表示该词在整个文档集合中的普遍重要性(包含该词的文档数越少,则这个词的IDF就越高)。两者相乘得到的TF-IDF值越高,表示该词在一篇文档中的重要性越高。《决定》的原始文本可以从新华网等在线官方媒体下载,也可以从本教材电子资源中得到。文本主要包含15条“决定”可以把每个“决定”的内容提取出来形成15个独立的文本,然针对这15个独立的文本分别进行关键词分析。(1)文档获取和初步分析对《决定》的关键词分析和可视化展示这15条“决定”都是以标题开头,后跟具体内容段落。每个标题都是从行首顶格开始,以1至2位中文数字后接中文顿号开头函数split_text_by_section()根据上述特征构造正则表达式,提取每条“决定“的文本,返回包含15条文本的列表。(2) 文本提取对《决定》的关键词分析和可视化展示(2) 文本提取对《决定》的关键词分析和可视化展示1
defsplit_text_by_section(text):2
#定义一个正则表达式来匹配中文标题号,支持二十以内3
heading_pattern=pile(r'^[一二三四五六七八九十]{1,2}、',flags=re.MULTILINE)4
#初始化一个空列表来存储段落5
sections=[]6
#使用finditer找到所有匹配的标题号7
matches=heading_pattern.finditer(text)8
#初始化一个变量来跟踪当前段落的起始位置9
start=010
#遍历匹配对象11
formatchinmatches:12
ifstart==0:13
#将start定位到第一个标题前14
start=match.start()15
else:16
sections.append(text[start:match.start()])#从前一个“决定”的第一个字
符到当前“决定”的第一个字符前17
start=match.start()18
#将最后一个标题和之后的内容作为最后一个段落添加到列表中19
ifstart<len(text):20
sections.append(text[start:])21
returnsections采用jieba库对文本进行分词,然后去除停用词和标点符号(3)文本分词对《决定》的关键词分析和可视化展示1
defsegment_text(sections):2
"""对每个文本使用jieba进行分词"""3
segmented_sections=[]4
stop_words=set(stopwords.words('chinese'))5
forsectioninsections:6
words=jieba.lcut(section)7
#去除停用词、数字和标点符号8
words=[wordforwordinwordsifwordnotinstop_words9
andnotword.isdigit()10
andlen(word)>1]11
#将分词结果转换为空格分隔的字符串12
segmented_sections.append(''.join(words))13
returnsegmented_sections采用Python语言中常用的机器学习库sklearn(全称Scikit-learn)中的classTfidfVectorizer来实现TF-IDF值的计算。(4)TF-IDF值计算对《决定》的关键词分析和可视化展示1
defcalculate_tfidf(segmented_sections):2
"""通过TF-IDF算法分别为各个段落中的词计算TF-IDF值"""3
vectorizer=TfidfVectorizer()4
#计算TF-IDF矩阵5
X=vectorizer.fit_transform(segmented_sections)6
#获取词汇列表7
word_names=vectorizer.get_feature_names_out()#8
returnX,word_names(5)词云图绘制对《决定》的关键词分析和可视化展示1
defplot_wordcloud(tfidf_matrix,words):2
"""根据矩阵绘制文本序列的词云图"""3
#创建词云对象,使用黑体字,使用五角星作为轮廓4
#注意:中文词云绘制需要给出系统中有效的中文字体路径5
wordcloud=WordCloud(font_path=r'C:\Windows\Fonts\simhei.ttf',
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026 年护理质控根本原因分析法 RCA 实操培训
- 常见眼部外伤的处理
- 应急管理部门非煤露天矿山标准化检查表
- 一级建造师考试(机电工程管理与实务)题库含答案(吉林省延边州2025年)
- 心血管内科专科护士选拔考试题库及答案
- 仙桃市公安机关特殊职位公务员(网络安全技术职位)考前冲刺试题解析及答案(2026年)
- 全国英语等级考试(PETS)二级仿真试题及答案解析(永州2025年下半年)
- 开放大学电大本科《保险学概论》问答题题库及答案
- 2026 抽水蓄能电站移民安置规划编制规程
- 2026年眼科青光眼护理考试题库(含答案)
- 建筑施工劳务分包管控制度
- 2026-2030中国AI安全行业市场发展分析及发展前景与投资研究报告
- 2026-2030中国氟碳气体行业供需现状与前景营销态势剖析研究报告
- 2026年消防设施操作员职业技能鉴定真题(附答案)
- 2026年轨道交通机电设备维修工初级笔试模拟题
- 中考保分协议书
- 潍坊德翔农牧种鸡养殖项目环境影响报告书
- 消防基地运营管理制度范本
- 2026年共青团服务青少年心理健康工作指引及12355热线接听与工单处理考核题
- 口腔门诊手术室工作制度
- 2026年眼镜镜片制造行业研究报告-沙利文
评论
0/150
提交评论