【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办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合