NLTK(3)处理文本、分词、词干提取与词形还原

2024-04-14 23:32

本文主要是介绍NLTK(3)处理文本、分词、词干提取与词形还原,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 访问文本
  • @字符串处理
  • @编码
  • @正则表达式
  • 分词
    • @正则表达式分词(不好)
    • Tokenize命令
    • @自定义函数
  • 规范化文本
    • 将文本转换为小写
    • 查找词干
      • @自定义函数(不好)
      • NLTK词干提取器
        • Porter
        • Lancaster
        • Snowball
    • 词形还原

访问文本

方法一:

 f=open(r"E:\dict\q0.txt","r")for line in f:print(line.strip())

方法二:

 with open(r"C:\Users\cuitbnc\Desktop\dqdg.txt","r+") as f:str=f.read()

方法三:

 import nltk
path=nltk.data.find(r'C:\Users\cuitbnc\Desktop\dqdg.txt')
raw=open(path,'rU').read()
len(raw)

strip() 方法删除输入行结尾的换行符

@字符串处理

有用的字符串方法:

方法	功能
s.find(t)	字符串s中包含t的第一个索引(没找到返回(-1)
s.rfind(t)	字符串s中包含t的最后一个索引(没找到返回-1)
s.index(t)	与s.find(t)功能类似,但没找到时引起ValueError
s.rindex(t)	与s.rfind(t)功能类似,但没找到时引起ValueError
s.join(text)	使用s连接text中的文本为一个字符串
s.split(t)	在所有找到t的位置将s分割成列表(默认为空白符)
s.splitlines()	将s按行分割成字符串列表
s.lower()	小写版本的字符串s
s.upper()	大写版本的字符串s
s.title()	首字母大写版本的字符串s
s.strip()	s不带前导或尾随空格的副本
s.replace(t, u)	用u替换s中的t

@编码

 path = nltk.data.find('corpora/unicode_samples/polish-lat2.txt')f = open(path, encoding='latin2')for line in f:line = line.strip()print(line)

encode()

@正则表达式

re.findall()只是给我们后缀。这是因为括号有第二个功能:选择要提取的子字符串。
如果我们要使用括号来指定析取的范围,但不想选择要输出的字符串,必须添加?:
r在字符串之前表示防止转义

在Python中使用正则表达式,需要使用import re导入re库。
re.search(p, s) 检查字符串s中是否有模式p(只匹配到一项)

re.findall() 找出指定正则表达式的所有匹配
search()函数从全部内容匹配,如果有多个,找到第一个匹配的
findall()函数从全部内容匹配,如果有多个,找出所有匹配的

word = 'supercalifragilisticexpialidocious'
re.findall(r'[aeiou]', word)
#['u', 'e', 'a', 'i', 'a', 'i', 'i', 'i', 'e', 'i', 'a', 'i', 'o', 'i', 'o', 'u']

re.sub() 替换
sub()的第一个参数是要匹配的模式,第二个参数是要替换上的模式。

#使用示例:把日期格式从'09/30/2018'转换成'2018-09-30'
text = 'Today is 9/30/2018. PyCon starts 3/13/2013.'
re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
# 'Today is 2018-9-30. PyCon starts 2013-3-13.'

正则表达式基本元字符,其中包括通配符,范围和闭包

操作符	行为
.	通配符,匹配所有字符
^abc	匹配以abc开始的字符串
abc$	匹配以abc结尾的字符串
[abc]	匹配字符集合中的一个
[A-Z0-9]	匹配字符范围中的一个
ed|ing|s	匹配指定的一个字符串(析取)
*	前面的项目零个或多个,例如a*, [a-z]*(也叫Kleene 闭包)
+	前面的项目1 个或多个,例如a+, [a-z]+
?	前面的项目零个或1 个(即可选),例如a?, [a-z]?
{n}	精确重复n次,n为非负整数
{n,}	至少重复n次
{,n}	重复不多于n次
{m,n}	至少重复m次不多于n次
a(b|c)+	括号表示操作符的范围

分词

分词是一个比你可能预期的要更为艰巨的任务。没有单一的解决方案能在所有领域都行之有效,我们必须根据应用领域的需要决定哪些是词符。

@正则表达式分词(不好)

raw.split() 在空格符处分割原始文本

注意:在正则表达式前加字母r(表示"原始的"),它告诉Python解释器按照字面表示对待字符串,而不去处理正则表达式中包含的反斜杠字符。

正则表达式符号

符号	功能
\b	词边界(零宽度)
\d	任一十进制数字(相当于[0-9])
\D	任何非数字字符(等价于[^0-9])
\s	任何空白字符(相当于[ \t\n\r\f\v])
\S	任何非空白字符(相当于[^ \t\n\r\f\v])
\w	任何字母数字字符(相当于[a-zA-Z0-9_])
\W	任何非字母数字字符(相当于[^a-zA-Z0-9_])
\t	制表符
\n	换行符

Tokenize命令

raw = """DENNIS: Listen, strange women lying in ponds distributing swordsis no basis for a system of government.  Supreme executive power derives froma mandate from the masses, not from some farcical aquatic ceremony."""
tokens = word_tokenize(raw)

word_tokenize(raw)

@自定义函数

对于一些书写系统,由于没有词的可视边界,文本分词变得更加困难。
根据(Brent, 1995),我们可以定义一个目标函数,一个打分函数,我们将基于词典的大小和从词典中重构源文本所需的信息量尽力优化它的值。
计算目标函数:给定一个假设的源文本的分词(左),推导出一个词典和推导表,它能让源文本重构,然后合计每个词项(包括边界标志)与推导表的字符数,作为分词质量的得分;得分值越小表明分词越好。
在这里插入图片描述

规范化文本

将文本转换为小写

set(w.lower() for w in text) 通过使用lower()我们将文本规范化为小写

查找词干

@自定义函数(不好)

def stem(word):for suffix in ['ing', 'ly', 'ed', 'ious', 'ies', 'ive', 'es', 's', 'ment']:if word.endswith(suffix):return word[:-len(suffix)]return word

去掉看起来像后缀的词

NLTK词干提取器

Porter

nltk.PorterStemmer()

porter = nltk.PorterStemmer()[porter.stem(t) for t in tokens]#['DENNI', ':', 'Listen', ',', 'strang', 'women', 'lie', 'in', 'pond',
'distribut', 'sword', 'is', 'no', 'basi', 'for', 'a', 'system', 'of', 'govern',
'.', 'Suprem', 'execut', 'power', 'deriv', 'from', 'a', 'mandat', 'from',
'the', 'mass', ',', 'not', 'from', 'some', 'farcic', 'aquat', 'ceremoni', '.']
Lancaster

nltk.LancasterStemmer()

lancaster = nltk.LancasterStemmer()
[lancaster.stem(t) for t in tokens]
#['den', ':', 'list', ',', 'strange', 'wom', 'lying', 'in', 'pond', 'distribut',
'sword', 'is', 'no', 'bas', 'for', 'a', 'system', 'of', 'govern', '.', 'suprem',
'execut', 'pow', 'der', 'from', 'a', 'mand', 'from', 'the', 'mass', ',', 'not',
'from', 'som', 'farc', 'aqu', 'ceremony', '.']
Snowball

SnowballStemmer()

from nltk.stem import SnowballStemmer  
snowball_stemmer = SnowballStemmer(“english”)  
snowball_stemmer.stem(‘maximum’)

Porter 和Lancaster 词干提取器按照它们自己的规则剥离词缀。请看Porter词干提取器正确处理了词lying(将它映射为lie),而Lancaster词干提取器并没有处理好。
词干提取过程没有明确定义,我们通常选择心目中最适合我们的应用的词干提取器。如果你要索引一些文本和使搜索支持不同词汇形式的话,Porter词干提取器是一个很好的选择.

词形还原

WordNet为我们提供了稳健的词形还原的函数
要求手动注明词性,否则可能会有问题。因此一般先要分词、词性标注,再词性还原。
WordNetLemmatizer()
wnl.lemmatize() 函数可以进行词形还原,第一个参数为单词,第二个参数为该单词的词性

from nltk.stem import WordNetLemmatizer
wnl = WordNetLemmatizer()#lemmatize nouns
print(wnl.lemmatize('men', 'n'))#lemmatize verbs
print(wnl.lemmatize('ate', 'v'))#lemmatize adjectives
print(wnl.lemmatize('saddest', 'a'))

men
eat
sad

这篇关于NLTK(3)处理文本、分词、词干提取与词形还原的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904326

相关文章

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP