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 Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字