NLP课程第一天预习--基本工具学习
NLP中分词工具、正则处理、词云分析等工具的简要介绍
NLP预习第一天
1. 字符串处理方法
原始输入示例:
input_str = ' Today is Sunny! '
1.1 常用方法
1.1.1 去空格
strip()
: 消除左右两端的所有空格,返回处理后的字符串 —— eg:input_str.strip()
lstrip()
: 消除左端的空格,返回处理后的字符串rstrip()
: 消除右端的空格,返回处理后的字符串
1.1.2 替换
replace()
:将字符串中匹配的部分替换为指定的内容,并返回替换后的字符串 —— eg:input_str.replace('Today', 'The')
1.1.3 查找
find()
:查找字符串中指定内容,并返回第一次出现的起始索引 —— eg:input_str.find('Today')
1.1.4 是否全为ascll字符
isalpha()
:如果全由’a-z | A-Z | 0-9’这样的字母组成,则返回为True —— eg:input_str.isalpha()
1.1.5 是否全为数字字符
isdigit()
:如果全由’0-9’这样的字母组成,则返回为True —— eg:input_str.isdigit()
1.1.6 分割字符串
split()
:按照指定的间隔符进行字符串分割,返回一个分割list —— eg:input_str.split(' ')
1.1.7 添加/拼接字符串
-
join()
:按照指定的拼接符号进行拼接,并返回拼接后的字符串 —— eg:''.join(str_list)
- 示例:将str_list中的字符串一个个紧密拼接,没有间隔。
2. 正则常用方法/符号
正则表达式的使用需要的依赖库:
import re # python中用于正则匹配的库
2.1 使用方法基本流程
2.2 常见正则方法
2.2.0 模板创建方法
-
compile()
:传入一个字符串,返回生成的模板 —— eg:pattern = re.compile('.')
-
'.'
:表示匹配除'\n'
外的所有字符,包括中文字符和符号 -
'[abc]'
:表示匹配[]
中存在的字符 -
'[a-z]'
:表示匹配从a到z的字符 -
'[A-Z]'
:表示匹配从A到Z的字符 -
'[0-9]'
:表示匹配从0到9的字符 -
'[a-zA-Z0-9]'
:表示匹配a-z
、A-Z
、0-9
的字符 -
'[^a-z]'
:表示匹配不是a-z的字符 —— 在匹配模板前加上^
表示非的意思
-
2.2.1 findall()
全串搜索
findall()
:传入一个模板与待处理字符串,返回匹配到的所有结果list —— eg:re.findall(pattern, input_str)
2.2.2 并列规则 —— |
,或方法
-
’|‘
:表示将多个规则并列起来,只要满足其中一个规则就可以匹配 ——[a-z]|[0-9]
-
re.compile(r'[a-z]|[a-9]')
-
2.2.3 预定义字符集 —— 常见匹配结合
\d
:表示匹配数字字符 —— 等价于:[0-9]
\D
:表示匹配非数字字符 —— 等价于:[^0-9]
\w
:表示匹配字母字符\W
:表示匹配非字母字符\s
:表示匹配空白字符,比如:<空格>\t\r\n\f\v
等
2.2.4 重复匹配模板
'*'
:0次或多次匹配 —— 0次匹配即没有一个匹配上,此时会返回匹配的空结果 —— eg:’[a*]‘
,多次匹配,即多个a重复的情况(aaa
)'+'
:1次或多次匹配 —— 1次匹配即存在一个结构匹配('[a+]'
中单个a
的情况),不理睬和返回0次匹配的情况 —— eg:'[a+]'
'?'
:0次或1次匹配 —— 最多允许1次匹配 —— eg:'[a?]'
2.2.5 精确次数匹配模板
{m}
:指定m次匹配,相对于前面的重复匹配模板,这里会更精确匹配次数 —— eg:'[a{3}]'
,即匹配aaa
的情况{m,n}
:指定至少m次匹配,最多执行n次匹配, m ≤ n m \le n m≤n —— eg:'[a{1, 3}]'
,即匹配1次到3次的情况:a, aa, aaa
的情况
2.2.6 match匹配——从头开始匹配
-
match()
:表示从头开始正则匹配,如果一开始就没有匹配上,则返回NoneType
—— eg:re.match(pattern, input_str)
-
需要获取匹配结果(
非NoneType
),通过返回对象调用group
获取(多个匹配,需要传入索引)-
eg:
match = re.match(pattern, input_str) match.group() # 默认为index=0的匹配结果, match.group(index) # 此外,group还支持组名索引 -- 具体看命名组
-
-
也支持使用
groups
获取所有匹配结果
-
2.2.7 search匹配——跳过开头进行匹配
-
search()
:表示跳过开头进行匹配,开头没匹配上也不影响接下来的匹配,没匹配上会返回NoneType
—— eg:re.search(pattern, input_str)
-
获取匹配结果,同
match
-
2.2.8 sub()
/nsub()
替换和修改
sub()
:类似于字符串的replace替换,但是sub支持正则匹配,替换更方便,支持更多样的替换,同时还可以指定最多替换次数,最后返回替换修改后的字符串 —— eg:re.sub(pattern, replace_str, input_str, count)
nsub()
:与sub功能一致,返回是一个元组,第一个元素是sub返回类似的字符串,第二个元素是发生了多少次替换 —— eg:re.nsub(pattern, replace_str, input_str, count)
2.2.9 split()
切片
split()
:类似于字符串的split方法,但是划分符支持了正则匹配,可以有更多支持的间隔匹配 —— eg:re.split(pattern, input_str)
2.2.10 (设置组名)命名组
只适用于
search
、match
等匹配后,返回非字符串、非list的对象 —— 通过group()
指定组名获取匹配结果
-
'(?P<...>正常模板内容)'
:给一个模板取一个组名,组名放在<...>
内 —— eg:'(?P<first>\w+)(?P<second>\d+)'
-
示例:允许多个(命名)组存在,共同构建一个模板 —— (命名)组间不要有空格
-
命名组的使用:
serach = re.search(pattern, input_str) search.group('first') # 获取对应组的匹配结果
-
3. NLTK分词工具(多语言–主要EN)-- 了解基本工具功能,不推荐
nltk分词工具:出现时间长,具体的功能,需要使用时自行选择下载对应的工具包。
单独下载nltk仅仅是一个工具支持,而没有具体的数据包(分词数据库)
3.1 下载nltk与nltk支持包
pip install nltk
: 下载nltk包
import nltk
nltk.download() # 会弹出一个下载gui,选择package中的合适工具下即可
3.2 分词操作
分词:将一个句子进行词划分,得到一个个(单)词语 —— 比如:"Today is sun. "=> ['Today', 'is', 'sun','.']
。
导入基本的包和API:
from nltk.tokenize import word_tokenize
from nltk.text import Text
基本测试数据:
input_str = "Today's is A sunny! I will go out."
API说明:
-
word_tokenize
:执行分词 —— 返回分词list-
token = word_tokenize(input_str) # 即可完成字符串的分词
-
考虑到nlp中几乎不考虑大小写,因为大小写表述的单词意思几乎一致 —— 字符串方法:
input_str.lower()
,实现大写转小写
-
-
Text
:支持对分词结果的一些统计功能-
text = Text(token) # 创建一个Text对象 text.count('go') # 通过返回的对象,进行已知分词数据的指定内容次数统计 text.index('go') # 获取第一次出现的索引 text.plot(8) # 获取前8个频率最高的词的数据,并绘制折线图
-
3.3 停用词
停用词:有的词对句子的表意没有意义,且存在场合很多,这时候这个词可以不被使用,即停用。
导入基本的包和API:
from nltk.corpus import stopwords
基本测试数据:
input_str = "Today's is A sunny! I will go out."
API说明:
-
stopwords
:nltk提供的停用词表,包含多种语言,使用时需要制定english,获取指定的停用词表-
stopwords.raw('english') # 获取对应的停用词表,raw返回的词表是一个字符串 # 字符串以'\n'为单词的间隔符 # 才用以下方式进行替换间隔 stopwords.raw('english').replace('\n', ' ')
-
停用词使用示例:
- 制作词表
# 制作有效词表,即去掉新数据集中的停用词
input_str = 'Today is a sunny day!'
text_words = word_tokenize(input_str) # 分词
text_word_set = set(text_words) # 集合去重 -- 词表不应该存在重复的单词
# 利用集合方法,交集 —— 实现去掉停用词
text_word_set.intersection(set(stopwords.words('english'))) # words返回的是一个词list
- 过滤停用词
input_str = 'Today is a sunny day!'
text_words = word_tokenize(input_str) # 分词
text_words = [w for w in text_words if w not in stopwords.words('english)]
3.4 词性标注
词性标注:即分词的词性 —— 比如:名词,量词等。
导入基本的包和API:
from nltk import pos_tag
基本测试数据:
input_str = "Today's is A sunny! I will go out."
API说明:
pos_tag()
:对分词结果进行词性标注 —— eg:’pos_tag(tokens)‘
3.5 命名实体识别
命名实体识别:一个句子中的主要成分的识别,识别该成分是什么类别。
对于nltk,需要使用download进行下载实体数据包
导入基本的包和API:
from nltk import ne_chunk
基本测试数据:
input_str = "Today's is A sunny! I will go out."
API说明:
ne_chunk()
:对分词结果进行词性标注 —— eg:ne_chunk(tokens)
4.Spacy分词工具(多语言–主要EN) – 推荐
4.1 下载Spacy
pip install spacy
# 或者使用管理员身份打开CMD下载(Windows)
python3 -m spacy download en
4.2 Spacy的文本处理(分词、分句、词性)
import spacy
nlp = spacy.load('en') # 获取文本处理对象
doc = nlp(input_str) # 自动处理问题
nlp处理传入文本后返回的doc对象,默认为分词结果:
for token in doc:
print(token)
也支持分句结果:
for sent in doc.sents:
print(sent)
查看分词词性:
for token in doc:
print(token.pos_)
4.3 命名实体识别
import spacy
nlp = spacy.load('en') # 获取文本处理对象
doc = nlp(input_str) # 自动处理问题
查看实体与识别分类:
for ent in doc.ents:
print(ent, ent.label_) # ent识别到的实体, ent.label_识别的类别
实体识别展示:
from spacy import display
display.reader(doc, style='ent', jupyter=True) # style='ent'展示实体,jupyter表示显示支持
5.jieba分词工具(中文) – 推荐
5.1 下载jieba分词
pip install jieba
5.2 文本处理(分词)
import jieba
seg_list = jieba.cut('我来到北京清华大学', cut_all=True) # cut_all is True表示全模式
# 全模式即所有分词可能的划分,存在反复划分词
# False表示精确模式,最大可能的划分结果
5.3 添加自定义词典
- 添加自定义词典 – 添加字典文本txt格式为
utf-8
,添加API:jieba.load_userdict(*.txt)
– 可以保留词典添加结果 - 添加有限词 – 只在运行后有效,下一次运行前依旧不支持该词,添加API:
jieba.add_word(word)
5.4 关键词抽取
import jieba.analyse as analyse
import jieba
seg_list = jieba.cut('我来到北京清华大学', cut_all=False) # cut_all is True表示全模式
tags = analyse.extract_tags(text, topK=5, withWeight=True) # 关键词抽取,topK表示抽取前5个重要的词
# withWeight=True,返回的结果包含关键词的重要性权重
for word, weight in tags:
print(word, weight)
5.5 词性标注
import jieba.posseg as pseg
words = pseg.cut("我爱北京天安门") # 返回分词结果与对应的词性
for word, flag in words:
print(word, flag)
6.词云分析
6.1 下载wordcloud
pip install wordcloud
6.2 使用词云展示
from wordcloud import WordCloud
from scipy.misc import imread
from matplotlib import pyplot as plt
# 创建词云配置
my_wordcloud = WordCloud(
background_color='white', # 背景颜色
max_words=400, # 显示最多字数
font_path='SimHei.tif', # 不设置显示不了中文
mask=imread('1.jpg'), # 掩码,即绘制图案 -- 为矩形
width=1000, # 绘制图形的大小
height=1000,
stopwords=stopwords # 停用词
).generate_from_frequencies(data) # data:记录word频数的dict
plt.imread(my_wordcloud) # 显示词云
my_wordcloud.to_file('result.jpg') # 保存词云
此外,还有热力图等分析方式
更多推荐
所有评论(0)