当前位置: 首页 > news >正文

文本预处理(NLTK)

1. 自然语言处理基础概念

1.1 什么是自然语言处理

自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。因而它是计算机科学的一部分。

1.2 自然语言处理的应用领域

自然语言处理主要应用于机器翻译、舆情监测、自动摘要、观点提取、文本分类、问题回答、文本语义对比、语音识别、中文OCR等方面。

  1. 文本检索:多用于大规模数据的检索,典型的应用有搜索引擎。
  2. 机器翻译:跨语种翻译,该领域目前已较为成熟。目前谷歌翻译已用上机翻技术。
  3. 文本分类/情感分析:本质上就是个分类问题。目前也较为成熟,难点在于多标签分类(即一个文本对应多个标签,把这些标签全部找到)以及细粒度分类(二极情感分类精度很高,即好中差三类,而五级情感分类精度仍然较低,即好、较好、中、较差、差)
  4. 信息抽取:从不规则文本中抽取想要的信息,包括命名实体识别、关系抽取、事件抽取等。应用极广。
  5. 序列标注:给文本中的每一个字/词打上相应的标签。是大多数NLP底层技术的核心,如分词、词性标注、关键词抽取、命名实体识别、语义角色标注等等。曾是HMM、CRF的天下,近年来逐步稳定为BiLSTM-CRF体系。
  6. 文本摘要:从给定的文本中,聚焦到最核心的部分,自动生成摘要。
  7. 问答系统:接受用户以自然语言表达的问题,并返回以自然语言表达的回答。常见形式为检索式、抽取式和生成式三种。近年来交互式也逐渐受到关注。典型应用有智能客服
  8. 对话系统:与问答系统有许多相通之处,区别在于问答系统旨在直接给出精准回答,回答是否口语化不在主要考虑范围内;而对话系统旨在以口语化的自然语言对话的方式解决用户问题。对话系统目前分闲聊式和任务导向型。前者主要应用有siri、小冰等;后者主要应用有车载聊天机器人。(对话系统和问答系统应该是最接近NLP终极目标的领域)
  9. 知识图谱:从规则或不规则的文本中提取结构化的信息,并以可视化的形式将实体间以何种方式联系表现出来。图谱本身不具有应用意义,建立在图谱基础上的知识检索、知识推理、知识发现才是知识图谱的研究方向。
  10. 文本聚类:一个古老的领域,但现在仍未研究透彻。从大规模文本数据中自动发现规律。核心在于如何表示文本以及如何度量文本之间的距离。
1.3 自然语言处理基本技术
  1. 分词:基本算是所有NLP任务中最底层的技术。不论解决什么问题,分词永远是第一步。
  2. 词性标注:判断文本中的词的词性(名词、动词、形容词等等),一般作为额外特征使用。
  3. 句法分析:分为句法结构分析和依存句法分析两种。
  4. 词干提取:从单词各种前缀后缀变化、时态变化等变化中还原词干,常见于英文文本处理。
  5. 命名实体识别:识别并抽取文本中的实体,一般采用BIO形式。
  6. 指代消歧:文本中的代词,如“他”“这个”等,还原成其所指实体。
  7. 关键词抽取:提取文本中的关键词,用以表征文本或下游应用。
  8. 词向量与词嵌入:把单词映射到低维空间中,并保持单词间相互关系不变。是NLP深度学习技术的基础。
  9. 文本生成:给定特定的文本输入,生成所需要的文本,主要应用于文本摘要、对话系统、机器翻译、问答系统等领域。

2. NLTK

NLTK常见模块及用途:

在这里插入图片描述
NLTK中的语料库

古腾堡语料库:gutenberg;
网络聊天语料库:webtext、nps_chat;
布朗语料库:brown;
路透社语料库:reuters;
就职演说语料库:inaugural;
其他语料库;

任务实施:

NLTK全称为Natural Language Toolkit,自然语言处理工具包,在NLP领域中,最常使用的一个Python库。
!pip install nltk==3.7

1.字符串处理

1.1 清理与替换

strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。

lstrip() 方法用于截掉字符串左边的空格或指定字符。

rstrip() 删除 string 字符串末尾的指定字符,默认为空白符,包括空格、换行符、回车符、制表符。
en_str = " .hello world, hello, my name is XiaoLu, "
en_str1 = en_str.strip() # 去头尾空格
print(“去头尾空格后:”+ en_str1)
en_str2 = en_str.lstrip(’ .‘) # 去左边的“ .”
print(“去左边的.后:”+ en_str2)
en_str3 = en_str.rstrip(’, ') # 去右边的“, ”
print(“去右边的,后:”+ en_str3)
replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
replace()方法语法:

str.replace(old, new[, max])

参数:

old:将被替换的子字符串。
new:新字符串,用于替换old子字符串。
max:可选字符串, 替换不超过 max 次

en_str.replace(‘hello’,‘hi’) #字符串替换
动手练习1

  1. 模仿上述代码,在<1>处填写代码,将空格和特殊符号“.”和“&”去除;
  2. 在<2>处填写代码,将“小陆”替换为“小陆老师”;
  3. 在<3>处填写代码,将“大家好,”删除。
    在这里插入图片描述

#在这里手敲上面代码并填补缺失代码
zh_str=“.大家好,我是小陆&& "
zh_str=zh_str.strip().lstrip(’ .‘) .rstrip(’&& ')
zh_str=zh_str.replace(“小陆”,“小陆老师”)
zh_str=zh_str.replace(“大家好,”,”")
print(zh_str)
若输出结果为我是小陆老师,则填写正确。

1.2 截取

截取字符串使用变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾。
str1 = ‘大家好,我是小陆,我在NEWLAND!’
print(str1[0:3]) # 访问前三个字符
print(str1[3:3+2]) #[3,5)
print(str1[-3:-1]) #和列表一样 可以使用负索引 代表反方向 从右到左 -1代表最后一个(不包含)
print(str1[::2]) #也可以设置步长 [start:stop:step] #隔一个取一个 #start默认为0 stop默认到最后(包含)
print(str1[::-1]) ##字符串逆序最快的办法 -1代表从尾到头 步长为1 进行取值

1.3 连接与分割

字符串连接,就是将2个或以上的字符串合并成一个,看上去连接字符串是一个非常基础的小问题,但是在Python中,我们可以用多种方式实现字符串的连接,稍有不慎就有可能因为选择不当而给程序带来性能损失。

方法1:加号连接

很多语言都支持使用加号连接字符串,Python也不例外,只需要简单的将2个或多个字符串相加就可以完成拼接。
str1 = “大家好,我是小陆,太好了!”
str2 = ‘大家好,我是小陆,吃饭了吗?’
print(str1+str2) # 使用+连接
方法2:使用str.join()方法

join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。join()方法语法:

str.join(sequence)

参数:

sequence:要连接的元素序列。

str3 = [‘我是小陆’,‘我是大陆’,‘太开心了,太棒了!’]
print(‘;’.join(str3)) #使用join进行连接,使用";"对列表中的各个字符串进行连接
分割字符串使用变量.split(“分割标示符号”[分割次数]),分割次数表示分割最大次数,为空则分割所有。
str4 = ‘我是小陆,我是大陆;太开心了,太棒了!’
print(str4.split(‘;’)) # split进行切分,使用“;”对字符串进行切分 得到字符串列表

1.4 比较与排序

sorted() 函数对所有可迭代的对象进行排序操作。

sort 与 sorted 区别:sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

sorted 语法:

sorted(iterable, cmp=None, key=None, reverse=False)

参数说明:

  • iterable:可迭代对象。
  • cmp:比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
  • key:主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse:排序规则,reverse = True 降序 , reverse = False 升序(默认)。

可以看到默认排序,是按照首字母大写到小写,字母顺序从A到Z进行排序。
strs = [‘alice’,‘Uzi’,‘dancy’,‘Mlxg’,‘uzi’]
print(sorted(strs)) #sorted()可以对序列(列表,元组等)进行排序
可以通过定义排序方式函数,带入参数key进行自定义排序,以下代码是按照第二个字母小写的字母顺序进行排序。
#使用显式函数
def sort_func(x):
return x[1].lower() #按照第2个字母小写的字母顺序进行排序
print(sorted(strs,key=sort_func)) #可以通过key关键字 自定义排序方式
可以通过lambda表达式,带入参数key进行自定义排序,以下代码是按照第三个字母大写的字母顺序进行排序。
#使用匿名函数
print(sorted(strs,key=lambda x:x[2].upper())) #按照第3个字母大写的字母顺序进行排序

1.5 查找与包含

index() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,该方法与 python find()方法一样,只不过如果str不在 string中会报一个异常。index()方法语法:

str.index(str, beg=0, end=len(string))

参数说明:

  • str:指定检索的字符串
  • beg:开始索引,默认为0。
  • end:结束索引,默认为字符串的长度。

str1 = ‘我是小陆;我是大陆;太开心了,太棒了!’

#返回第一次出现的第一个位置的索引
print(str1.index(‘小陆’))
print(str1.index(‘大陆’, 3,len(str1)))
find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。find()方法语法:

str.find(str, beg=0, end=len(string))

参数说明:

  • str:指定检索的字符串
  • beg:开始索引,默认为0。
  • end:结束索引,默认为字符串的长度。

str1 = ‘我是小陆;我是大陆;太开心了,太棒了!’

#index和find的区别是 find更安全 对于找不到的子串会返回-1
print(str1.find(‘怎么回事’))
print(str1.find(‘太开心了’))

1.6 大小写与其他变化
  1. lower() 方法转换字符串中所有大写字符为小写。
  2. upper() 方法将字符串中的小写字母转为大写字母。
  3. capitalize() 将字符串的第一个字母变成大写,其他字母变小写。
  4. title() 方法返回"标题化"的字符串,就是说所有单词的首个字母转化为大写,其余字母均为小写。

str1 = ‘hello,my name is XiaoLU.’

print(str1.lower()) #转换小写
print(str1.upper()) #转换大写
print(str1.capitalize()) #首字母大写
print(str1.title()) #每个单词首字母大写
动手练习2

根据以上学习内容,完成动手练习2。要求输入为“hello xiao lu”,输出为“Lu Xiao Hello”。提示信息如下:

  1. .split():将输入的字符串按空格分离成单独的字符串
  2. [::-1]:将字符串倒着打印
  3. ' '.join():以空格链接
  4. .title():每个单词首字母大写
    在这里插入图片描述

#在这里手敲上面代码并填补缺失代码
str1= “hello xiao lu”
words = str1.split()
reversed_words = words[::-1]
capitalized_words = [word.title() for word in reversed_words]
output_str = ’ '.join(capitalized_words)
print(output_str)
若输出为Lu Xiao Hello,则说明填写正确。

2 模式匹配与正则表达式

学习与验证工具

我们可以使用正则表达式在线验证工具http://regexr.com/ 来实践,左边还有对应的工具和速查表。

可以在这里正则表达式进阶练习https://alf.nu/RegexGolf?world=regex&level=r00 练习正则表达式,挑战更复杂的正则表达式。

re模块

Python通过re模块提供对正则表达式的支持。

使用re模块的一般步骤:

1.将正则表达式的字符串形式编译为Pattern实例
2.使用Pattern实例处理文本并获得匹配结果(一个Macth实例)
3.使用Match实例获得信息,并进行其他的操作

import re #导入re模块

pattern = re.compile(r’hello.*!') # 将正则表达式的字符串形式编译成Pattern对象
match = pattern.match(‘hello, Xiaolu! How are you?’) # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None

if match:
print(match.group()) # 使用Match获得分组信息

2.1 匹配字符串

获取包含关键字的句子
import re
text_string=‘’’
文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。
利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。
根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分。
‘’’
regex=‘爬虫’ #关键字
p_string = text_string.split(‘。’)#以句号为分隔符通过split切分
for line in p_string:
if re.search(regex,line) is not None: #search 方法是用来查找匹配当前行是否匹配这个regex,返回的是一个match对象
print(line) #如果匹配到,打印这行信息
可以看到,匹配到了以下两句话:

利用一个爬虫抓取到网络中的信息
根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分

动手练习3

尝试模仿上述代码,在<1>处填写代码,打印包含“文本”这个字符串的行内容。
在这里插入图片描述

#在这里手敲上面代码并填补缺失代码
import re
text_string=‘’’
文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。
利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。
根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分。
‘’’
regex=‘文本’ #关键字
p_string = text_string.split(‘。’)#以句号为分隔符通过split切分
for line in p_string:
if re.search(regex,line) is not None: #search 方法是用来查找匹配当前行是否匹配这个regex,返回的是一个match对象
print(line) #如果匹配到,打印这行信息
若输出为以下两句话,说明填写正确。

文本最重要的来源无疑是网络
我们要把网络中的文本获取形成一个文本数据库

匹配任意一个字符

正则表达式中,有一些保留的特殊符号可以帮助我们处理一些常用逻辑。比如下图中的“.”可以匹配任一字符,换行符除外。

在这里插入图片描述

我们现在来演示下如何查找包含“爬”+任意一个字的句子。代码如下:
import re
text_string = ‘文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分。’
regex =‘爬.’
p_string = text_string.split(‘。’) #以句号为分隔符通过split切分
for line in p_string:
if re.search(regex,line) is not None: #search 方法是用来查找匹配当前行是否匹配这个regex,返回的是一个match对象
print(line) # 如果匹配到,打印这行信息

上述代码基本不变,只需要将regex中的“爬”之后加一个“.”即可以满足需求。

我们来看下输出会多一行。因为不仅是匹配到了“爬取”也匹配到了“爬虫”。

利用一个爬虫抓取到网络中的信息
爬取的策略有广度爬取和深度爬取
根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分

匹配起始和结尾字符串

在这里插入图片描述

“^a”代表的是匹配所有以字母a开头的字符串。

“a$”代表的是所有以字母a结尾的字符串。

我们现在来演示下如何查找以“文本”这两个字起始的句子。代码如下:

import re
text_string = ‘文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分。’
regex =‘^文本’
p_string = text_string.split(‘。’) #以句号为分隔符通过split切分
for line in p_string:
if re.search(regex,line) is not None: #search 方法是用来查找匹配当前行是否匹配这个regex,返回的是一个match对象
print(line) # 如果匹配到,打印这行信息
输出为

文本最重要的来源无疑是网络

动手练习4

尝试模仿上述代码,在<1>处填写代码,尝试设计一个案例匹配以“信息”这个字符串结尾的行,并打印。
在这里插入图片描述

#在这里手敲上面代码并填补缺失代码
import re
text_string = ‘文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分。’
regex =“信息”
p_string = text_string.split(‘。’) #以句号为分隔符通过split切分
for line in p_string:
if re.search(regex,line) is not None: #search 方法是用来查找匹配当前行是否匹配这个regex,返回的是一个match对象
print(line) # 如果匹配到,打印这行信息
若输出为以下这句话,说明填写正确。

利用一个爬虫抓取到网络中的信息

使用中括号匹配多个字符

在这里插入图片描述

"[bcr]at"代表的是匹配“bat”,“cat”以及“rat”

我们先看下文字信息。句子和句子之间以句号分隔。

[重要的]今年第七号台风23日登陆广东东部沿海地区。
上海发布车库销售监管通知:违规者暂停网签资格。
[紧要的]中国对印连发强硬信息,印度急切需要结束对峙。

我们希望提取以[重要的]或者[紧要的]为起始的新闻标题。代码如下:

import re
text_string = [‘[重要的]今年第七号台风23日登陆广东东部沿海地区’,’ 上海发布车库销售监管通知:违规者暂停网签资格’,‘[紧要的]中国对印连发强硬信息,印度急切需要结束对峙’]
regex = ‘^[[ 重紧]…]’
for line in text_string:
if re.search(regex,line) is not None:
print(line)
else :
print(‘not match’)

观测下数据集,我们发现一些新闻标题是以“[重要的]”“[紧要的]”为起始,所以我们需要添加“^”特殊符号代表起始,之后因为存在“重”或者“紧”,所以我们使
“[]”匹配多个字符,然后以“.”“.”代表之后的任意两个字符。运行以上代码,我们看到结果正确提取了所需的新闻标题。

[重要的]今年第七号台风23日登陆广东东部沿海地区
not match
[紧要的]中国对印连发强硬信息,印度急切需要结束对峙
2.2 抽取文本中的数字

通过正则表达式表示年份

[0-9]”代表的是从0到9的所有数字,那相对的”[a-z]” 代表的是从a到z的所有小写字母。

我们通过一个小例子来讲解下如何使用。首先我们定义一个list分配于一个变量strings,匹配年份是在1000 年~ 2999年之间。代码如下:

import re
year_strings=[]
strings = [ ‘1979年,那是一个春天’,‘时速60公里/小时’, ‘你好,2022!’]
for string in strings:
if re.search(‘[1-2][0-9]{3}’, string):# 字符串有中文有数字,匹配其中的数字部分,并且是在1000 ~ 2999之间,{3} 代表的是重复之前的[0-9]三次,是[0-9] [0-9][0-9]的简化写法。
year_strings.append(string)
print(year_strings)

抽取所有的年份

我们使用Python中的re模块的另-个方法 findall() 来返回匹配带正则表达式的那部分字符串。

re.findall(“[a-z]”,“abc1234") 得到的结果是 [“a”,“b”,“c”]。

我们定义一个字符串years_ string, 其中的内容是‘2021是很好的一年,但我相信2022会是更好的一年!’。现在我们来抽取一下所有的年份。代码如下:

import re
years_string = ‘2021是很好的一年,但我相信2022会是更好的一年!’
years = re.findall(‘[2][0-9]{3}’ ,years_string)
years

3.英文文本处理与解析

3.1 分词

文本是不能成段送入模型中进行分析的,我们通常会把文本切成独立含义的字、词或短语,这个过程叫Tokenization。

在NLTK中提供了2种不同的方式的Tokenization,sentence Tokenization(断句)和word Tokenization(分词).
按句子分割使用nltk.sent_tokenize(text) ,分词使用nltk.word_tokenize(sentence)。nltk的分词是句子级别的,所以对于一篇文档首先要将文章按句子进行分割,然后句子进行分词:
!cp -r nltk_data /home/jovyan
import nltk
from nltk import word_tokenize, sent_tokenize

corpus = ‘’‘It is most recommended for those who want to visit China for the first time with short days.
Great contrast of China’s past and present is the best highlight of this tour.
Besides, great accommodation and dinning make your trip more enjoyable.
‘’’

断句

sentences = sent_tokenize(corpus)
print(“断句结果:***”)
print(sentences)

分词

words = word_tokenize(corpus)
print(“分词结果:***”)
print(words)

3.2 停用词

由于一些常用字或者词使用的频率相当的高,英语中比如a,the, he等,每个页面几乎都包含了这些词汇,如果搜索引擎它们当关键字进行索引,那么所有的网站都会被索引,而且没有区分度,所以一般把这些词直接去掉,不可当做关键词。

nltk有内置的停用词列表,首先看看打印停用词的结果。
#导入内置停用词
from nltk.corpus import stopwords
#导入英文停用词
stop_words = set(stopwords.words(‘english’))
print(stop_words)
print(“分词结果:***”)
print(words)

将文本剔除停用词

filtered_corpus = [w for w in words if not w in stop_words]
print(“去除停用词结果:***”)
print(filtered_corpus)
可以看到一些符号如:“,” “.” "'"没有被去掉,这是因为默认的停用词表中没有这部分内容。在很多任务(比如对话任务中)中,停用词还包括下面这些符号和后缀:['!',',','.','?','’','\''],使用下面代码,将他们加上去:
stop_words = set(stopwords.words(‘english’))

#添加符号
new_stopwords = [‘!’,‘,’,‘.’,‘?’,‘’’,‘’',‘good’,‘bad’]
new_stopwords_list = stop_words.union(new_stopwords)
print(new_stopwords_list)
动手练习5

  1. 在<1>处填写代码,将’good’,'bad’设为需要从停用词表中删除的内容;
  2. 在<2>处填写代码,从停用词表中删除内容。
    在这里插入图片描述

#在这里手敲上面代码并填补缺失代码
not_stopwords = {‘good’, ‘bad’}
final_stop_words = set([word for word in stop_words if word not in not_stopwords])
print(final_stop_words)
final_filtered_corpus = [w for w in words if not w in final_stop_words]
print(“去除停用词结果:”)
print(final_filtered_corpus)
如果输出为以下内容,则说明填写正确。

在这里插入图片描述

3.3 词性标注

nltk.download(‘averaged_perceptron_tagger’)

词性标注是对分词结果中的每个单词标注一个正确的词性的程序(如名词、动词等)。词性标注是很多NLP任务的预处理步骤,如句法分析。下表为NLTK词性标注对照表:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

nltk.pos_tag(words):对指定的单词列表进行词性标记,返回标记列表。
import nltk
words = nltk.word_tokenize(‘I love China’)
print(words)
word_tag = nltk.pos_tag(words)
print(word_tag)
从结果我们可以看到China是NNP,NNP代表专有名词。

为什么nltk.pos_tag()方法可以对单词进行词性标记?这是因为NLTK预先使用一些语料库训练出了一个词性标注器,这个词性标注器可以对单词列表进行标记。
词性标注过后,我们可以通过单词的词性来过滤出相应的数据,如我们要过滤出词性为 NNP 的单词,代码如下:
import nltk

document = ‘Today the Netherlands celebrates King’s Day. To honor this tradition, the Dutch embassy in San Francisco invited me to’
sentences = nltk.sent_tokenize(document)

data = []
for sent in sentences:
data = data + nltk.pos_tag(nltk.word_tokenize(sent))

for word in data:
if ‘NNP’ == word[1]:
print(word)

3.4 时态语态归一化

很多时候我们需要对英文中的时态语态等做归一化,这时我们需要 Stemming 词干提取。

Stemming是抽取词的词干或词根形式(不一定能够表达完整语义)。NLTK中提供了三种最常用的词干提取器接口,即Porterstemmer,LancasterStemmer和SnowballStemmer。

PorterStemmer基于Porter词干提取算法,来看例子:

可以用PorterStemmer

import nltk
from nltk.stem import PorterStemmer

stemmer = PorterStemmer()
print(stemmer.stem(‘running’))
print(stemmer.stem(‘makes’))
print(stemmer.stem(‘tagged’))
Snowball Stemmer基于Snowball 词干提取算法,来看例子:

也可以用SnowballStemmer

from nltk.stem import SnowballStemmer
stemmer1 = SnowballStemmer(‘english’) #指定为英文
print(stemmer1.stem(‘growing’))

相关文章:

  • 达芬奇模板 15组现代简洁文字标题动画 Modern Titles v2.0 DR
  • 在Spring Boot项目中实现Word转PDF并预览
  • 路由交换网络专题 | 第八章 | GVRP配置 | 端口安全 | 端口隔离 | Mux-VLAN | Hybrid
  • 数字孪生:从概念验证到产业革命的十年征程
  • 【Castle-X机器人】三、紫外消杀模块安装与调试
  • 前端节流、防抖函数
  • LVGL模拟器:NXP GUIDER+VSCODE
  • 深度学习-学习笔记
  • 字节跳动开源数字人模型latentsync1.5,性能、质量进一步优化~
  • 同世堂:让中医梦想照进职业星河
  • 搭建基于火灾风险预测与防范的消防安全科普小程序
  • 华为OD机试真题——素数之积RSA加密算法(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • ‌MySQL 事务隔离级别详解
  • 【蓝桥杯省赛真题56】Scratch抓不住的蜜蜂 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解
  • LiveCharts.WPF图表模块封装
  • 前端面试宝典---vue原理
  • arduino显示数码管1~9
  • 如何解决IDE项目启动报错 error:0308010C:digital envelope routines::unsupported 问题
  • 【SwitchyOmega安装教程】
  • 案例速成GO+redis 个人笔记
  • 湖南小伙“朱雀玄武敕令”提交申请改名为“朱咸宁”
  • 铁线礁、牛轭礁珊瑚礁“体检”报告首次发布,专家:菲非法活动产生胁迫性影响
  • 北京市平谷区政协原主席王春辉接受纪律审查和监察调查
  • 中国田协通报苏州马拉松“方便门”处理情况:涉事10人禁赛3年
  • 广东省发展改革委原副主任、省能源局原局长吴道闻被开除公职
  • 漫画阅读APP刊载1200余部侵权作品:20人获刑,案件罚金超千万元