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

目录

正则表达式的工作机理

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

缩略语


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

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

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

python">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.”的末尾句号分隔出去。但是,这样会遇到一个新问题。我们必须将不想放入词汇表的空白符和标点符号过滤掉,参考下面的例子:

python">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分词器来快速运行示例,帮助我们快速重现一些实验结果:

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

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

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

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

缩略语

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


http://www.ppmy.cn/news/1518284.html

相关文章

大语言模型算力优化策略:基于并行化技术的算力共享平台研究

目录 大语言模型算力优化策略:基于并行化技术的算力共享平台研究 摘要 引言 算力共享平台的设计 1. 平台架构 2. 并行化计算技术 模型并行化 流水线并行化 3. 资源管理和调度 实验与结果分析 结论与展望 首先,大语言模型(如GPT系列、BERT等)和算力共享的结合是近…

为什么2024年生意更难做了

因为暂时看不到新的增长点。 甚至说连过去还能稳定运营的生意,也在出问题。 因为随着入场人数的增加,竞争加剧的趋势会把所有人都给卷进去。 任何行业,只要一卷,就会丧失利润。 而2024年,就会是这个情况。 2023年…

3.4.1 爬取王者荣耀英雄皮肤实战

第四节:爬取王者荣耀英雄皮肤实战 课程目标 爬取王者荣耀英雄皮肤实战 课程内容 编码实现 爬虫部分 import requests # 导入requests库,用于发送HTTP请求 from fake_useragent import UserAgent # 导入UserAgent库,用于生成随机的Use…

RabbitMQ如何保证消息不丢失(面试版)

下图是RabbitMQ消息的发送过程,在任何环节消息都有可能丢失: 生产者确认机制 开启生产者确认机制,确保生产者的消息能到达队列 RabbitMQ提供了publisher confirm 机制来避免消息发送到MQ过程中丢失 。 消息发送到MQ后 , 会返回一…

MQTT学习:MQTT vs AMQP,mosquitto安装,调试工具mqttfx mqttx

前言 物联网vs互联网? 数据量/数据源:物联网的数据多是设备的自动采集,其数量远远超过互联网,互联网的数据更多是人工生成的 MQTT 协议(Message Queuing Telemetry Transport)vs AMQP 协议(Advanced Message Queuing Protocol)是两种在物联网中广泛使用的协议。 物联网…

SQL存储过程:数据库编程的瑞士军刀

SQL存储过程:数据库编程的瑞士军刀 在数据库管理系统中,存储过程是一种强大的工具,它允许开发者将SQL代码封装在可重用的单元中。存储过程不仅可以提高数据库操作的效率,还可以增强数据的安全性和一致性。本文将详细介绍SQL存储过…

速盾:如何选择适合企业的高防 IP 和 CDN?

在当前互联网时代,企业面临着越来越多的网络安全威胁,其中之一就是DOS/DDOS攻击。为了保护企业的在线业务,很多企业都会选择使用高防IP和CDN服务。然而,如何选择适合企业的高防IP和CDN服务呢?下面是一些关键因素可以帮…

《黑神话:悟空》游戏中的福建元素

《黑神话:悟空》作为一款深受玩家喜爱的动作角色扮演游戏,不仅在游戏剧情和角色设计上独具匠心,还巧妙地融入了丰富的中国传统文化元素,其中福建元素尤为突出。以下是对游戏中福建元素的详细解析: 一、地域文化与背景…

本地部署一个WordPress博客结合内网穿透实现异地远程访问本地站点

文章目录 前言1. 安装WordPress2. 创建WordPress数据库3. 安装相对URL插件4. 安装内网穿透发布网站4.1 命令行方式:4.2. 配置wordpress公网地址 5. 配置WordPress固定公网地址 前言 本文主要介绍如何在Linux Ubuntu系统上使用WordPress搭建一个本地网站&#xff0c…

十分钟弄懂最快的APP自动化工具uiautomator2

相信很多使用appium做过APP自动化的人都深有感触: appium运行慢、时间长uiautomatorviewer定位元素时得关掉appium server在低版本的appium上获取toast需要切换automationName 现在有一款自动化测试工具uiautomator2,它几乎完美的避免了以上的问题。简…

CSS选择器的魔法:探索:not-child()与:nth-child()

CSS选择器是前端开发中的强大工具,它们允许我们以精确的方式选择和操作网页上的元素。在这篇文章中,我们将深入探讨两个非常有用的CSS选择器::not-child()和:nth-child()。通过这些选择器,我们可以创建动态且具有吸引力的网页布局…

如何监控Eureka集群:Prometheus与Grafana的监控集成

如何监控Eureka集群:Prometheus与Grafana的监控集成 在微服务架构中,Eureka作为服务注册与发现的解决方案扮演着关键角色。为了确保Eureka集群的健康和性能,监控其状态是至关重要的。Prometheus和Grafana是现代监控和可视化工具的佼佼者&…

全志/RK安卓屏一体机:医疗自助服务终端,支持鸿蒙国产化

医疗自助服务终端 为了解决传统医疗模式下的“看病难、看病慢”等问题,提高医疗品质、效率与效益,自助服务业务的推广成为智慧医疗领域实现信息化建设、高效运作的重要环节。 医疗自助服务终端是智慧医疗应用场景中最常见的智能设备之一,它通…

Linux虚拟机搭建K8S环境

文章目录 一、环境准备二、系统初始化三、部署master四、添加node节点五、部署网络六、部署dashboard七、登录dashboard面板 一、环境准备 首先在vmware上新建4台相同配置的虚拟机,除了IP和主机名外,其余配置相同。由于是搭建K8S初始环境,没…

-[meetingbot4ios.AppDelegate window]: unrecognized selector sent to instance

这个错误的困扰了我半天,具体错误如下: *** Terminating app due to uncaught exception NSInvalidArgumentException, reason: -[meetingbot4ios.AppDelegate window]: unrecognized selector sent to instance 0x60000370c0c0 *** First throw call …

bash代码片段snippets

bash代码片段 # Rename all *.txt to *.text for file in *.txt; domv -- "$file" "${file%.txt}.text" donewhile read x z y; doof"xag.1/$x.png" if"xag/$y.png"cp $if $of done < db.log tree -L 2 | sed s/\xc2\xa0/ /g &g…

以数据安全筑牢新时代旅游安全之基,硬盘文件数据销毁,硬盘销毁

在数字化高速发展的时代&#xff0c;旅游行业也迎来了大数据的浪潮。全国旅游标准化技术委员会近日发布标准《旅游大数据安全与隐私保护要求&#xff08;征求意见稿&#xff09;》&#xff0c;并公开征求意见&#xff0c;截止时间为 2024 年 10 月 8 日。这一举措无疑为新时代旅…

Eureka的生命周期管理:服务注册、续约与下线的完整流程解析

目录 引言Eureka概述 2.1. 什么是Eureka 2.2. Eureka的核心概念Eureka服务注册的流程 3.1. Eureka客户端的启动 3.2. 服务实例向Eureka Server注册 3.3. Eureka Server的处理与响应Eureka服务续约的流程 4.1. 心跳机制的作用 4.2. 客户端续约的流程 4.3. 续约失败的处理 4.4. …

如何在Java中使用protobuf

写在前面 本文看下在Java中如何使用protofbuf。 1&#xff1a;介绍 1.1&#xff1a;什么是protobuf 是一种数据格式&#xff0c;同json&#xff0c;xml&#xff0c;等。但是一种二进制数据格式。 1.2&#xff1a;强在哪里&#xff1f;为啥要用&#xff1f; 小&#xff0c…

Linux基础知识(一、什么是Linux)

一、Linux之父——林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09; Linux操作系统最初是在1991年10月份由芬兰赫尔辛基大学的在校生Linus Torvalds所发布,最初被发布的LINUX0.02版本因其高质量的代码与开放源代码&#xff0c;迅速引起了一大批黑客的加…