【Python机器学习】NLP分词——利用分词器构建词汇表(四)——标点符号的处理

本文主要是介绍【Python机器学习】NLP分词——利用分词器构建词汇表(四)——标点符号的处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

正则表达式的工作机理

改进的用于分词的正则表达式

缩略语


某些情况下,除空格外还有一些字符用于将句子中的词分隔开,比如之前case中“26.”末尾的句号(英文)。分词器不仅可以利用空格还可以基于标点符号(如逗号、句号、分号、连字符等)将句子切开。在某些情况下,我们希望这些标点符号也像词一样,被看成独立的词条,但另一些情况下可能又要忽略这些标点符号。

在“26.”的例子中,由于英文句号导致出错,末尾的句号可能会对NLP流水线的后续部分如词干还原造成误导,因为词干还原的目的是利用规则将相似词聚成组,而这些规则往往要基于一致的词拼写结果。

下面的代码给出了将标点符号作为分隔符的一种做法:

import pandas as pd
import resentence="""
Thomas Jefferson Began buliding Monticelli as the age of 26.\n
"""
token=re.split(r'[-\s.,;!?]+',sentence)
print(token)

可以看到,“.”已经没有出现在分词结果中。

正则表达式的工作机理

上述代码中正则表达式的工作机理:方括号[]表示一个字符类,即字符集。右方括号]后面的+表示必须匹配方括号内的一个或多个字符。字符类中的\s是一个预定义字符类的快捷表示,该字符类包括所有的空白符,如敲击空格键、制表键或者回车键产生的字符。字符类 r'[\s]' 等价于r'\t\n\r\x0b\x0c'。这6个空白符分别是空格(' ')、制表符('\t')、换行符('\n')、回车符('\r')、以及换页符('\f')。

这里没有使用任何字符区间。字符空间是一种特定的字符类,方括号中采用连字符来表示。如 r'[a-z]' 可以匹配所有的小写字母。字符区间 r'[0-9]' 匹配任何从0到9的数字,其等价于 r'[0123456789]' 。正则表达式 r'[_a-zA-Z]' 表示可以匹配任意下划线字符或者大小写英文字母。

左方括号之后的连字符(-)是正则表达式的一个惯有用法。连字符不能放在方括号内的任何地方。否则正则表达式解析器会认为这里意味着有一个字符区间,如 r'[0-9]' 。为了表明确实是一个真正的连字符,必须将其放在紧挨在该字符类左方括号的后面。因此,任何需要表明是真正的连字符的地方,都应使其要么是左方括号后的第一个字符,要么通过转义符来表示。

re.split函数从左到右遍历输入字符串中的每个字符,并根据正则表达式进行匹配。一旦发现有匹配上的字符,它会在匹配上的字符之前和之后分隔字符串,同时跳过匹配的一个或多个字符。re.split那一行的处理就像 str.split 一样,但它适用于任何与正则表达式匹配的字符或多字符序列。

圆括号(和)用于对正则表达式进行分组,就像它们用于对数学、Python和大多数其他编程语言表达式进行分组一样。这些圆括号强制正则表达式匹配圆括号内的整个表达式,然后再尝试匹配圆括号后面的字符。

改进的用于分词的正则表达式

我们对正则表达式进行编译从而加快分词器的运行速度。编译后的正则表达式对象在很多方面都比较方便,而不仅仅是速度。

正则表达式的编译时机:

Python中的正则表达式模块可以对正则表达式进行预编译,这样就可以在代码库中对它们进行复用。例如:有一个正则表达式可以提供电话号码。可以使用re.complie()对该表达式进行预编译,然后就可以将其以参数的方式传递给分词函数或者类。因为Python会对最近的MAXCACHE=100个正则表达式的编译对象进行缓存,所以上述处理基本不会带来速度上的好处。但是如果有超过100个不同的正则表达式在同时进行工作,或者想调用正则表达式的方法而不是相应的re函数的话,re.complie()就会很有用

上面那个简单的正则表达有助于将“26.”的末尾句号分隔出去。但是,这样会遇到一个新问题。我们必须将不想放入词汇表的空白符和标点符号过滤掉,参考下面的例子:

sentence="""
Thomas Jefferson Began buliding Monticelli as the age of 26.\n
"""
pattern=re.compile(r"([-\s.,;!?])+")
tokens=pattern.split(sentence)
print([x for x in tokens if x and x not in '- \t\n.,;!?'])

因此,Python内置的re包看省区对于上述示例句子处理的很好,只要注意过滤掉一些不想要的词条即可。实在没有别的理由需要从别的地方找一个其他的正则表达式包,除非满足以下条件:

1、集合的重合匹配;

2、多线程;

3、近似正则表达式匹配(类似于UNIX系统的TREagrep);

4、特性完备地支持Unicode;

5、更大的MAXCACHE默认值。

随着需求的变化,分词器很容易就变得复杂无比。在一些情况下,我们可能想在句号(.)处进行分割,但是这时候句号后面不能跟着数字,否则我们可能会把小数切开。还有一些情况,我们可能不会在句号后面分割句子,因为这时句号是颜文字的一部分。

有多个Python库可以用于分词,它们的优缺点如下:

1、spaCy:精确、灵活、快速,用Python语言编写;

2、standford coreNLP:更精确,但不够灵活、快速,依赖于Java8;

3、NLTK:很多NLP竞赛和对比的标配,流行,用Python语言编写。

NLTK和standford coreNLP历史最悠久。尽管standford coreNLP具有Python API,但它还要依赖Java 8  的coreNLP后端,因而需要另外安装和配置。因此,我们可以使用NLTK分词器来快速运行示例,帮助我们快速重现一些实验结果:

from nltk.tokenize import RegexpTokenizer
tokenizer=RegexpTokenizer(r'\w+|$[0-9.]\S+')
print(tokenizer.tokenize(sentence))

上述分词器相比之前的要好一些,它忽略了空白符词条,并且可以将不包含其他标点符号的词条中的句尾标点符号分隔开来。

一个更好的分词器是来自NLTK包的treebankWordTokenizer分词器,它内置了多种常见的英文分词规则。例如,它从相邻的词条中将短语结束符号(?!.:,)分开,将包含句号的小数当成单个词条。另外,它还包含一些英文缩略的规则,例如,“don't”会切分成["do","n,t"]。该分词器有助于NLP流水线的后续步骤,如词干还原。下面是该分词器的示例:

from nltk.tokenize import TreebankWordTokenizer
tokenizer=TreebankWordTokenizer()
print(tokenizer.tokenize(sentence))

缩略语

对于一些应用来说,例如使用句树法的基于语法的NLP模型,将“wasn.t”切分成“was”和“not”很重要,这样可以使句树法分析器能够将与已知语法规则保持一致并且可预测的词条集作为输入。存在大量标准和非标准的缩略词处理方法。通过将缩略语还原为构成它的各个词,只需要对依存树分析器或者句法分词器进行编程以预见各词的不同拼写形式,而不需要面对所有可能的缩略语。

这篇关于【Python机器学习】NLP分词——利用分词器构建词汇表(四)——标点符号的处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序