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

相关文章

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性