文本预处理(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’))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/80670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

socket编程基础

上一篇 --- 网络基础概念&#xff08;下&#xff09;https://blog.csdn.net/Small_entreprene/article/details/147320155?fromshareblogdetail&sharetypeblogdetail&sharerId147320155&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link 理…

CSS 解决手机浏览器默认行为(点击出现蓝色背景)

最近写了一个 Web 应用&#xff0c;可以兼容手机端和PC端&#xff0c;在PC端调试的时候没有发现这个问题&#xff0c;但是在手机上或者PC浏览器改成手机模式进行调试的时候就会出现下面这个场景&#xff1a; 这是两个 div&#xff0c;点击的时候&#xff0c;会出现一个蓝色的背…

多模态大语言模型arxiv论文略读(三十八)

Tables as Texts or Images: Evaluating the Table Reasoning Ability of LLMs and MLLMs ➡️ 论文标题&#xff1a;Tables as Texts or Images: Evaluating the Table Reasoning Ability of LLMs and MLLMs ➡️ 论文作者&#xff1a;Naihao Deng, Zhenjie Sun, Ruiqi He, A…

聊聊Spring AI Alibaba的YuQueDocumentReader

序 本文主要研究一下Spring AI Alibaba的YuQueDocumentReader YuQueDocumentReader community/document-readers/spring-ai-alibaba-starter-document-reader-yuque/src/main/java/com/alibaba/cloud/ai/reader/yuque/YuQueDocumentReader.java public class YuQueDocument…

OCR定制识别:解锁文字识别的无限可能

OCR 定制识别是什么&#xff1f; OCR&#xff0c;即光学字符识别&#xff08;Optical Character Recognition&#xff09; &#xff0c;它就像是一个神奇的 “文字翻译器”&#xff0c;能把图片里的文字转化成计算机可编辑的文本。比如&#xff0c;你扫描一份纸质文档成图片&am…

麒麟系统(基于Ubuntu)上使用Qt编译时遇到“type_traits文件未找到”的错误

在麒麟系统&#xff08;基于Ubuntu&#xff09;上使用Qt编译时遇到“type_traits文件未找到”的错误&#xff0c;通常是由于C标准库头文件缺失或项目配置问题导致的。以下是逐步解决方案&#xff1a; 1. 安装C标准库和开发工具 确保系统已安装完整的开发工具链和标准库&#…

服务器上安装node

1.安装 下载安装包 https://nodejs.org/en/download 解压安装包 将安装包上传到/opt/software目录下 cd /opt/software tar -xzvf node-v16.14.2-linux-x64.tar.gz 将解压的文件夹移动到安装目录(/opt/nodejs)下 mv /opt/software/node-v16.14.2-linux-x64 /opt/nodejs …

Vue3 + Vite + TS,使用 ExcelJS导出excel文档,生成水印,添加背景水印,dom转图片,插入图片,全部代码

Vue3 Vite TS,使用 ExcelJS导出excel文档&#xff0c;生成水印&#xff0c;添加背景水印&#xff0c;dom转图片&#xff0c;插入图片&#xff0c;全部代码 ExcelJS生成文档并导出导出表头其他函数 生成水印设置文档的背景水印dom 转图片插入图片全部代码 ExcelJS 读取&#…

devops自动化容器化部署

devops 一、简单案例体验gitlabrunner部署静态文件二、devops企业级部署方案1、流程图2、依赖工具3、流程图4、主机规划5、安装工具软件1、安装git2、安装gitlab3、安装jenkins-server4、安装harbor5、安装web-server&#xff0c;也就是部署服务的机子&#xff0c;需要安装dock…

高级 SQL 技巧:提升数据处理能力的实用方法

在数据驱动的时代,SQL 作为操作和管理关系型数据库的标准语言,其重要性不言而喻。基础的 SQL 语句能满足日常的数据查询需求,但在处理复杂业务逻辑、进行数据分析和优化数据库性能时,就需要掌握一些高级 SQL 技巧。这些技巧不仅能提高查询效率,还能实现复杂的数据处理任务…

21.disql命令登录达梦数据库,查询并操作数据库

目录 1.连接达梦数据库 1.1 windows或linux系统 步骤&#xff08;1&#xff09;&#xff1a;打开终端窗口 步骤&#xff08;2&#xff09;&#xff1a;进入梦数据库安装目录下的 bin 文件夹 步骤&#xff08;3&#xff09;&#xff1a;用disql命令进行登录 1.2 docker部署…

N8N MACOS本地部署流程避坑指南

最近n8n很火&#xff0c;就想在本地部署一个&#xff0c;尝尝鲜&#xff0c;看说明n8n是开源软件&#xff0c;可以在本地部署&#xff0c;于是就尝试部署了下&#xff0c;大概用了1个多小时&#xff0c;把相关的过程记录一下&#xff1a; 1、基础软件包 abcXu-MacBook-m2-Air…

qt之开发大恒usb3.0相机一

1.在大恒相机给的sample里没有看见qt开发的demo. 第一步先运行c sdk中中的demo&#xff0c;看了下代码&#xff0c;大恒使用的UI框架是MFC.然后 vs2022编译。运行结果 第一步&#xff0c;先用qt进行坐下页面布局&#xff0c;如下图&#xff08;保存图片的地方做了些更改&#…

leetcode-枚举

枚举 3200. 三角形的最大高度 题目 给你两个整数 red 和 blue&#xff0c;分别表示红色球和蓝色球的数量。你需要使用这些球来组成一个三角形&#xff0c;满足第 1 行有 1 个球&#xff0c;第 2 行有 2 个球&#xff0c;第 3 行有 3 个球&#xff0c;依此类推。 每一行的球必…

DeepSeek智能时空数据分析(三):专业级地理数据可视化赏析-《杭州市国土空间总体规划(2021-2035年)》

序言&#xff1a;时空数据分析很有用&#xff0c;但是GIS/时空数据库技术门槛太高 时空数据分析在优化业务运营中至关重要&#xff0c;然而&#xff0c;三大挑战仍制约其发展&#xff1a;技术门槛高&#xff0c;需融合GIS理论、SQL开发与时空数据库等多领域知识&#xff1b;空…

如何用WordPress AI插件自动生成SEO文章,提升网站流量?

1. 为什么你需要一个WordPress AI文章生成插件&#xff1f; 每天手动写文章太耗时&#xff1f;SEO优化总是不达标&#xff1f;WordPress AI插件能帮你24小时自动生成原创内容&#xff0c;从关键词挖掘到智能排版&#xff0c;全程无需人工干预。 痛点&#xff1a;手动写作效率低…

鼠标指定范围内随机点击

鼠标指定范围内随机点击 点赞神器 将鼠标移动到相应位置后按F5 F6键&#xff0c;设置点击范围&#xff0c; F8开始&#xff0c;ESC中止。 有些直播有点赞限制&#xff0c;例如某音&#xff0c;每小时限制3千次&#xff0c;可以设置1200毫秒&#xff0c;3000次。 软件截图&#…

数据库设置外键的作用

数据库外键&#xff08;Foreign Key&#xff09;是关系型数据库中用于建立表与表之间关联关系的重要约束&#xff0c;其核心作用是确保数据的一致性、完整性和关联性。以下是外键的主要作用及相关说明&#xff1a; 1. 建立表间关联关系 外键通过引用另一张表的主键&#xff0…

发币流程是什么,需要多少成本?

这是一个专注于Web3相关开发的账号&#xff0c;具体会讲解步骤以及开发方案 偶尔会有科普&#xff0c;有兴趣的可以点右上角关注一下 发币&#xff08;发行数字货币&#xff09;的流程通常涉及技术实现、法律合规、经济模型设计等多个环节&#xff0c;以下是关键步骤的简要说明…

测试常用的Linux系统指令详解

为什么测试工程师需要掌握Linux命令&#xff1f; 在现代软件测试领域&#xff0c;约75%的服务端应用运行在Linux环境中&#xff0c;能够熟练使用Linux命令的测试工程师&#xff0c;其工作效率比仅依赖GUI工具的测试人员高出40%以上。本文将系统介绍测试工作中最实用的Linux命令…