【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按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安