当前位置:   article > 正文

NLP常用工具包实战(自然语言处理经典案例实战)_nlp实战例子

nlp实战例子

1.Python字符串处理

strip - 去掉空格或者特殊字符

replace - 替换操作

find - 查找操作

isalpha/isdigit - 判断操作

split / join - 分割合并操作

help - 帮助文档


2.正则表达式基本语法

Python正则表达式

  • 指定好匹配的模式-pattern

  • 选择相应的方法-match,search等

  • 得到匹配结果-group

  • re.match #从开始位置开始匹配,如果开头没有则无

  • re.search #搜索整个字符串

  • re.findall #搜索整个字符串,返回一个list

字符集合

  • [abc] 指定包含字符
  • [a-zA-Z] 来指定所以英文字母的大小写
  • [^a-zA-Z] 指定不匹配所有英文字母

或方法

将两个规则并列起来,以‘ | ’连接,表示只要满足其中之一就可以匹配。

  • [a-zA-Z]|[0-9] 表示满足数字或字母就可以匹配,这个规则等价于 [a-zA-Z0-9]


3.正则常用符号

匹配数字 ‘\d’ 等价于 [0-9]

‘\D’ 匹配非数字

‘\w’ 匹配字母和数字

\W’ 匹配非字母和数字

‘\s’ 匹配间隔符

重复

正则式可以匹配不定长的字符串

‘*’ 0 或多次匹配

‘+’ 1 次或多次匹配
‘?’ 0 或 1 次匹配

精确匹配和最小匹配

‘{m}’ 精确匹配 m 次

{m,n}’ 匹配最少 m 次,最多 n 次。 (n>m)

它们的返回不是一个简单的字符串列表,而是一个 MatchObject,可以得到更多的信息。

如果匹配不成功,它们则返回一个 NoneType 。所以在对匹配完的结果进行操作之前,必需先判断一下是否匹配成功了。

match 从字符串的开头开始匹配,如果开头位置没有匹配成功,就算失败了;而 search 会跳过开头,继续向后寻找是否有匹配的字符串。

4.常用函数介绍

字符串的替换和修改

在目标字符串中规格规则查找匹配的字符串,再把它们替换成指定的字符串。你可以指定一个最多替换次数,否则将替换所有的匹配到的字符串。

sub ( rule , replace , target [,count] )

subn(rule , replace , target [,count] )

第一个参数是正则规则,第二个参数是指定的用来替换的字符串,第三个参数是目标字符串,第四个参数是最多替换次数。

sub 返回一个被替换的字符串

subn 返回一个元组,第一个元素是被替换的字符串,第二个元素是一个数字,表明产生了多少次替换。

split 切片函数。

使用指定的正则规则在目标字符串中查找匹配的字符串,用它们作为分界,把字符串切片。

split( rule , target [,maxsplit] )

第一个参数是正则规则,第二个参数是目标字符串,第三个参数是最多切片次数,返回一个被切完的子字符串的列表

‘(?P…)’ 命名组

<…>’ 里面是你给这个组起的名字,

例子:


 


5.NLTK工具包简介

NLTK工具包安装

非常实用的文本处理工具,主要用于英文数据,历史悠久~

分词 

Text对象

创建一个Text对象,方便后续操作


6.停用词过滤

查看停用词

过滤停用词

7.词性标注

词性标注

NLTK中的词性标注模块提供了不同的标注器,其中最常见的是基于统计模型的标注器和基于规则的标注器。这些标注器使用已标注的语料库(通常是已知词性的文本集合)来学习单词与其词性之间的关系。

分块

在这个例子中,用 NLTK 的分块功能,你通过正则表达式规则定义了一个名为 "MY_NP" 的块,用来匹配形容词(JJ)和名词(NN)的组合,可以包含冠词(DT)。

然后,通过 nltk.RegexpParser(grammer) 创建了一个分块器,根据你的规则对输入的句子进行分块。最后,使用 cp.parse(sentence) 对句子进行分块处理,得到一个分块树。

在输出中,可以看到分块的结果,形成了一个树状结构,其中 "MY_NP" 标记了被识别的名词短语。而 result.draw() 用于可视化这个分块树。

这种分块技术在自然语言处理中常用于提取文本中的结构化信息,例如识别名词短语、动词短语等,有助于理解文本的语法结构。

命名实体识别

命名实体识别(NER)是一项文本处理任务,旨在识别文本中具有特定意义的命名实体,如人名、地名、组织机构名等。NLTK 提供了 nltk.chunk 模块,其中包含了用于实现命名实体识别的工具。常见的方法是使用 NER 器,它是一个训练有素的模型,能够自动标识文本中的命名实体。有助于理解文本中实体的角色和关系。

NLTK 中的一个流行的NER工具是 nltk.ne_chunk,它基于最大熵分类器,并使用预训练的模型。需要注意的是,NER的性能取决于底层使用的模型和训练数据,因此在特定应用中可能需要进行调整或替换。

8.数据清洗实例

清洗文本是为了准备数据,使其更适合用于自然语言处理任务,比如文本分析或机器学习模型的训练。以下是清洗步骤的简要概括:

  1. 去掉HTML标签和特殊实体: 使用正则表达式去掉文本中的HTML标签和一些特殊实体,如@mentions和#hashtags。

  2. 去掉价值符号: 去掉文本中的一些特殊符号,例如股票代码($TSLA)。

  3. 去掉超链接: 去掉文本中的超链接。

  4. 去掉专门名词缩写: 去掉文本中长度较短的专有名词,通常是为了去除一些无关紧要的信息。

  5. 去掉多余空格: 去掉文本中的多余空格。

  6. 分词: 使用NLTK的word_tokenize函数对文本进行分词,将文本拆分成单词。

  7. 去停用词: 去掉停用词,即在文本中频繁出现但通常没有实际意义的词语,如“the”、“and”等。

  8. 组合结果: 将处理后的单词列表组合成清洗后的文本。

9.Spacy工具包

导入工具包和英文模型

spaCy · Industrial-strength Natural Language Processing in Python

spacy的语言模型下载教程icon-default.png?t=N7T8http://t.csdnimg.cn/bDLT5

文本处理

分词 for token in doc:

分句 for sent in doc.sents:

词性 token.pos_

词性参考表链接

当使用 spaCy 处理文档时,有许多方便的属性和方法可供使用。以下是一些示例:

  1. 遍历文档中的 Token:

    for token in doc: 允许你迭代文档中的每个 Token。
  2. 遍历文档中的 Sentence:

    for sent in doc.sents: 允许你迭代文档中的每个 Sentence。
  3. 获取 Token 的词性标注:

    token.pos_ 提供了 Token 的词性标注信息。
  4. 获取 Token 的依存关系:

    token.dep_ 提供了 Token 与其父节点之间的依存关系。
  5. 获取 Token 是否是停用词:

    token.is_stop 返回一个布尔值,表示 Token 是否是停用词。

命名体识别

调用 doc.ents 时,你实际上是在获取 spaCy 文档中识别到的实体的生成器(generator)。ents 是一个 spaCy 文档对象的属性,它包含了文档中识别到的所有命名实体。

具体而言,.ents 返回的是一个生成器,你可以通过迭代它来访问每个实体对象。每个实体对象都有一些属性,最常用的是:

  • ent.text: 包含实体文本的属性。
  • ent.start_charent.end_char: 分别表示实体在文档中的起始和结束字符索引。
  • ent.label_: 表示实体的标签,表示实体的类型(如“PERSON”、“GPE”等)。
  • ent.lemma_: 表示实体的标准形式,即它的基本形式。

 spaCy 的可视化工具 displacy,通过 displacy.render 方法对实体进行可视化呈现,使用不同颜色的边框来突显不同类型的实体,从而直观地展示文本中实体的位置和类型。


10.名字实体匹配

找到书中所有人物名字

  1. processed_text.ents 这是spaCy文档对象的属性,包含从文本中提取的所有命名实体。在这里,代码遍历这些实体。

  2. ent.label_ 对于每个实体,ent.label_ 表示实体的标签,即实体的类型。在这里,代码检查实体是否为人物,通过比较 ent.label_ 是否等于 'PERSON'

  3. ent.lemma_ 表示实体的标准形式,即它的基本形式。在这里,代码使用 ent.lemma_ 获取人物名字的标准形式。

  4. Counter 类: 这是 Python 的标准库中的一个类,用于计数可哈希对象的出现次数。在这里,代码使用 Counter 来统计每个人物名字的出现次数。

  5. c.most_common(10) 这是 Counter 类的方法,用于返回出现次数最多的前 10 个元素。在这里,代码返回出现频率最高的前 10 个人物名字和它们的出现次数。

11.恐怖袭击分析

  1. terrorism_articles_nlp = [...] 这行代码创建了一个列表 terrorism_articles_nlp,用于存储每篇文章的 spaCy 文档对象。

  2. for art in terrorism_articles: 这是一个循环,遍历 terrorism_articles 列表中的每一篇文章。

  3. nlp(art) 对每篇文章应用 spaCy 的 NLP 流水线。nlp 是 spaCy 加载的自然语言处理模型,它将文本转换成 spaCy 文档对象。每个处理过的文章(文档对象)都会被添加到 terrorism_articles_nlp 列表中。

  1. location_entity_dict = defaultdict(Counter) 这行代码创建了一个嵌套字典,其中的默认值是一个 Counter 对象。location_entity_dict 的键是实体(人物或组织),值是一个 Counter 对象,表示该实体与不同地理位置的关联次数。

  2. for article in terrorism_articles_nlp: 这是一个循环,遍历 terrorism_articles_nlp 列表中的每一篇处理过的恐怖袭击文章。

  3. article_terrorist_groups article_locations 这两行代码使用列表推导式从当前文章中提取人物/组织和地理位置的实体。它们分别将这些实体的标准形式存储在 article_terrorist_groupsarticle_locations 列表中。

  4. terrorist_common locations_common 这两行代码通过筛选,仅保留在常见恐怖组织和地理位置列表中的实体。这可以通过事先定义的 common_terrorist_groupscommon_locations 列表来完成。

  5. for found_entity in terrorist_common: for found_location in locations_common: 这两个嵌套的循环遍历每个匹配的恐怖组织和地理位置,然后在 location_entity_dict 中更新关联次数。如果该实体和位置的组合不存在,会自动创建相应的键和计数器。

 hmap = sns.heatmap(location_entity_df, annot=True, fmt='d', cmap='YlGnBu', cbar=False) 这是核心的绘图代码。它使用 seabornheatmap 函数绘制热力图。location_entity_df 是一个数据框,其中包含了恐怖组织和地理位置之间的关联次数。参数 annot=True 表示在热力图中显示数值,fmt='d' 指定了数值的格式,cmap='YlGnBu' 设置了颜色映射,cbar=False 表示不显示颜色条。


12.结巴分词器

分词工具

添加自定义词典

关键词抽取

词性标注


13.词云展示

  1. import jieba
  2. from wordcloud import WordCloud
  3. from imageio import imread
  4. from collections import Counter
  5. import matplotlib.pyplot as plt
  6. data={}
  7. text_file = open('./data/19Congress.txt','r',encoding='utf-8')
  8. text = text_file.read()
  9. with open('./data/stopwords.txt',encoding='utf-8') as file:
  10. stopwords = {line.strip() for line in file}
  11. seg_list = jieba.cut(text, cut_all=False)
  12. for word in seg_list:
  13. if len(word)>=2:
  14. if not data.__contains__(word):
  15. data[word]=0
  16. data[word]+=1
  17. #print(data)
  18. my_wordcloud = WordCloud(
  19. background_color='white', #设置背景颜色
  20. max_words=400, #设置最大实现的字数
  21. font_path=r'./data/SimHei.ttf', #设置字体格式,如不设置显示不了中文
  22. mask=imread('./data/mapofChina.jpg'), #指定在什么图片上画
  23. width=1000,
  24. height=1000,
  25. stopwords = stopwords
  26. ).generate_from_frequencies(data)
  27. plt.figure(figsize=(18,16))
  28. plt.imshow(my_wordcloud)
  29. plt.axis('off')
  30. plt.show() # 展示词云
  31. my_wordcloud.to_file('result.jpg')
  32. text_file.close()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/904807
推荐阅读
相关标签
  

闽ICP备14008679号