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-zA-Z0-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 mn —— 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 (设置组名)命名组

只适用于searchmatch等匹配后,返回非字符串、非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', ' ')
      

停用词使用示例:

  1. 制作词表
# 制作有效词表,即去掉新数据集中的停用词
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
  1. 过滤停用词
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')  # 保存词云

此外,还有热力图等分析方式


Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐