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.词云展示

import jieba
from wordcloud import WordCloud
from imageio import imread
from collections import Counter
import matplotlib.pyplot as plt

data={}

text_file = open('./data/19Congress.txt','r',encoding='utf-8')
text = text_file.read()
with open('./data/stopwords.txt',encoding='utf-8') as file:
    stopwords = {line.strip() for line in file}

seg_list = jieba.cut(text, cut_all=False)
for word in seg_list:
    if len(word)>=2:
        if not data.__contains__(word):
            data[word]=0
        data[word]+=1
#print(data)      
 
my_wordcloud = WordCloud(  
    background_color='white',  #设置背景颜色
    max_words=400,  #设置最大实现的字数
    font_path=r'./data/SimHei.ttf',  #设置字体格式,如不设置显示不了中文
    mask=imread('./data/mapofChina.jpg'), #指定在什么图片上画
    width=1000,
    height=1000,
    stopwords = stopwords
).generate_from_frequencies(data)

plt.figure(figsize=(18,16))
plt.imshow(my_wordcloud)
plt.axis('off')
plt.show()  # 展示词云
my_wordcloud.to_file('result.jpg')
text_file.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值