【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调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(