【Python机器学习】NLP分词——利用分词器构建词汇表(六)——词汇表归一化

news2024/11/16 9:29:01

目录

大小写转换

词干还原

词形归并

使用场景


词汇表大小对NLP流水线的性能有很大的影响,有一种减少词汇表大小的方法是将词汇表归一化以便意义相似的词条归并成单个归一化的形式。这样做一方面可以减少需要再词汇表中保留的词条数,另一方面也会提高语料库中意义相似但是拼写不同的词条或者n-gram之间的语义关联。

大小写转换

当两个单词只有大小写形式不同时,大小写转换会用来把笔不同的大小写形式进行统一处理,(英文中)当单词出现在了句首或者为了表示强调均采用大写形式来表示时,某个单词的大小写变得不太统一。将这种不统一的大小写形式统一化则称为大小写归一化,或是大小写转换。将单词或字符的大小写统一是一种减小词汇表规模的方法,可以推广到NLP的流水线。它有助于将意义相同的单词统一化为单个词条。

但是,单词的大写有时也包含了一些特定的含义,例如“doctor”和“Doctor”往往具有不同的含义。大写单词有时也表示其是一个专有名词,比如人名、地名或是事物的名称。如果命名实体识别对NLP流水线而言很重要的话,我们就希望能够识别出上面那些不同于其他单词的专有名词。然而如果词条不进行大小写归一化,那么词汇表的规模就大约是原来的两倍,需要消耗的内存和处理时间也大约是原来的两倍,这样可能会增加需要标注的训练数据的数量以保证机器学习流水线收敛到精确地通用解。在机器学习流水线中,标注的用于训练的数据集必须能够代表模型需要处理的所有可能的特征向量所处的空间,包括能够处理大小写的变化情况。对于10000维的词袋向量,通常必须要有100000条甚至更多的标注数据,才能训练出一个不太会发生过拟合的有监督机器学习流水线。在某些情况下,将词汇表规模缩小一般比丢弃部分信息更值当。

在Python中,利用列表解析式能够很方便地对词条进行大小写归一化处理:

tokens=['House','Visitor','Center','center']
normalized_tokens=[x.lower() for x in tokens]
print(normalized_tokens)

如果确信要对整篇文档进行大小写归一化处理,可以在分词前就对文本字符串使用lower()函数进行处理。但是如果这样的话,可能会干扰一些更高级的分词器,这些分词器可以将驼峰式大小写的单词进行分割,比如“WordPerfect”等。到底何时以及如何使用大小写转换,取决于开发者自己。

通过大小写归一化,我们试图在语法规则和词条在句子中的位置影响其大小写之前,将这些词条还原成归一化形式。一种最简单也最常见的文本字符串大小写归一化方法是:利用诸如Python内置的str.lower()函数将所有字符转成小写形式。不幸的是,这种做法除了会将我们希望的那些意义不大的句首大写字母归一化,也会将很多有意义的大小写形式给归一化掉。一个更高的大小写归一化方法是只将句首大写字母转成小写,其他单词保持原有形式。

只将句首字母转成小写可以保留句子中专有名词的含义,如Joe和Smith在句子“Joe Smith”中的情况。这种做法能够正确地将本该在一起的词分成一组,这是因为它们不是专有名字而只在句首时才首字母大写。这种做法可以在分词时将“joe”和“coffee”区分开来。这种做法也能防止一句话当中有“铁匠”含义的“smith”和专有名词“Smith”换在一起。即使采用这种小心谨慎的大小写处理方法,即只将句首的单词转化成小写形式,也会遇到某些情况下专有名词出现在句首而导致的错误。

为了避免上述例子中可能的信息损失,很多NLP流水线根本不进行大小写归一化处理。在很多应用中,将词汇表规模减小一半带来的效率提升会大于专有名词的信息损失。但是,即使不进行大小写归一化处理,有些信息也会损失。如果不将句首的“The”识别为停用词,对有些应用来说可能会带来问题。拥有真正完善手段的流水线会在选择性地归一化那些出现在句首但明显不是专有名词的词之前,先检测出专有名词。我们可以使用任何对应用有意义的大小写处理方法。比如语料库中的“Smith's”和“word smiths”不太多,我们也不关系它们是否要归一化成一个词条,那么就可以将所有文本都转成小写形式。最好的方法就是尝试多种不同做法,看看到底哪一种做法在NLP项目中能获得最高性能。

为了让模型能够处理那些出现古怪大小写形式的文本,大小写归一化可以减少对机器学习流水线的过拟合情况。大小写归一化对搜索引擎来说尤为有用。对搜索而言,归一化能够增加对特定查询找到的匹配数,这也称为搜索引擎的召回率。

对于一个没有进行大小写归一化的搜索引擎,如果搜索“Age”会得到和搜索“age”不一样的文档集合。通过将搜索索引中的词汇表归一化,无论输入查询的大小写如何,都可以保证两类有关“age”的文档均被返回。

但是,上述召回率的额外升高会造成正确率降低,此时对于返回的很多文档,用户并不感兴趣。基于这个原因,现代搜索引擎一般允许用户关闭查询的大小写归一化选项,通常的做法是将需要精确匹配的词用双银号引起来。如果要构建这样的搜索引擎流水线,以便处理上述两种查询,就需要为文档建立两个索引:一个索引将n-gram进行大小写归一化处理,而另一个则采用原始的大小写形式。

词干还原

另一种常用的词汇表归一化技术是消除词的复数形式、所有格的词尾甚至不同的动词形式等带来意义上的微小差别。这种识别词的不同形式背后的公共词干的归一化方法称为词干还原。例如,housing和houses的公共词干是house。词干还原过程会去掉词的后缀,从而试图将具有相似意义的词并到其公共词干。不一定要求词干必须是一个拼写正确的词,而只需要是一个能够代表词的多种可能拼写形式的词条或者标签。

对机器而言,需要某种条件来告诉它“house”和“houses”分别是同一名词的单数和复数形式。词干还原的主要好处之一就是:机器中的软件或者语言模型所需记录其意义的词的个数得以压缩。它在限制信息或意义损失的同时,会尽可能减小词汇表的规模,这在机器学习中称为降维。它能够帮助泛化语言模型,使模型能够在属于同一词干的词上表现相同。因此,只要我们的应用中不需要机器区分house和houses,词干还原就可以将程序或数据集的规模减小一半甚至更多,减小的程度依赖所选词干还原工具的激进程度。

词干还原对关键词搜索或信息检索十分重要。通过词干还原可以拓宽搜索结果,这样可以确保丢失相关文档或者网页的可能性减小。这种拓宽搜素结果的方法会极大地提高搜索的召回率得分,召回率是度量搜索引擎返回所有相关文档的程度的一个指标。

然而,词干还原可能会大幅度降低搜索引擎的正确率得分,这是因为在返回相关文档的同时可能反悔了大量不相关文档。在一些应用中,假阳率会是一个问题。因此,大部分搜索引擎可以通过对词或短语加双引号的方式关闭词干还原甚至大小写转换这些选项。加双引号意味着返回页面必须包含短语的精确拼写形式。

下面是一个使用纯Python实现的词干还原的简单示例,该示例可以处理词尾的s:

def stem(phrase):
    return ' '.join([re.findall('^(.*ss|.*?)(s)?$',word)[0][0].strip("'") for word in phrase.lower().split()])

print(stem('house'))
print(stem("Doctor House's calls"))

上面的词干还原函数使用了一个短的正则表达式来遵守如下的一些简单规则:

  • 如果词结尾不止一个s,那么词干词本身,后缀是空字符串;
  • 如果词结尾只有一个s,那么词干就是去掉s后的词,后缀是字符s;
  • 如果词结尾不是s,那么词干就是词本身,不返回任何后缀。

上面的strip方法能够确保一些词的所有格和复数形式能够被词干还原。

上述函数可以处理常规函数,但是无法处理更复杂的情况。例如,上述规则遇到dishes或者herose就会失效。针对这种更复杂的情况,NLTK包提供了其他词干还原工具。

两种最流行的词干还原工具分别是Porter和Snowball。这些词干还原工具使用了比单个正则表达式更复杂的规则,这样就能够处理更复杂的英文拼写和词尾情况:

from nltk.stem.porter import PorterStemmer
stemmer=PorterStemmer()
s=' '.join([stemmer.stem(w).strip("'") for w in "dish washer's washes dishes".split()])
print(s)

需要注意的是,像上面的正则表达式词干还原工具一样,Porter保留了词尾的撇号('),这样就能把所有格形式和非所有格形式的词区分开来。所有格名词往往都是专有名词,因此这个特性对于那些要将人名和其他名词区分开来的应用来说非常重要。

词形归并

如果知道词义之间可以互相关联,那么可能就能将一些词关联起来,即使它们的拼写完全不一样。这种更粗放的将词归一化成语义词根即词元的方式称为词形归并。

对于任何一个NLP流水线,如果想要对相同语义词根的不同拼写形式都做出统一回复的话,那么词形归并工具就很有用,它会减少必须要回复的词的数目,即语言模型的维度。利用词形归并工具,可以让模型更一般化,当然也可能带来模型精确率的降低,因为它会对同一词根的不同拼写形式一视同仁。例如,即使它们的意义不同,在NLP流水线中使用词形归并的情况下,“chat”、“chatter”、“chatty”甚至“chatbot”可能也会被同等对待。与此类似的是,尽管“bank”、“banked”和“banking”分别和河岸、汽车和金融有关,但是如果使用了词干还原工具,它们会被同等对待。

如果有一个词,经过词形归并处理之后,可能会彻底改变该词的意思,甚至可能得到意义完全相反的词,从而导致与期望回复相反的结果。这种情形称为“刻意欺骗”,即通过精心构造难以处理的输入,有意使机器学习流水线产生错误的响应。

由于考虑了词义,相对于词干还原和大小写归一化,词形归并是一种潜在的更具精确性的词的归一化方法。通过使用同义词表和词尾相关的知识库,词形归并工具可以确保只有那些具有相似意义的词才会被归并成同一词条。

有些词形归并工具除拼写之外还使用词的词性(POS)标签来提高精准率。词的POS标签代表了该词在短语或句子中的语法角色。例如,名词一般是代表人物、地点、事物的词;形容词常常代表了修饰或者描述名词的词;动词代表动作。只孤立地考虑词本身是无法判断词性的,判断词性要考虑该词的上下文。因此,一些高级的词形归并工具无法在孤立的词上运行。

在很多应用中,词形归并比词干还原有效。词干还原工具实际上仅仅用于大规模信息检索应用(关键词搜索)中。如果我们真的希望在信息检索流水线中通过词干还原工具进行降维和提高召回率,那么可能需要在使用词干还原工具前,先使用词形归并工具。由于词元本身是一个有效的英文词,词干还原工具作为词形归并的输出会很奏效。这种技巧会比单独使用词干还原工具能更好地降维和提高信息检索的召回率。

NLTK包提供了识别词元的相关函数:

#nltk.download('wordnet')
from nltk.stem import WordNetLemmatizer
lemmatizer=WordNetLemmatizer()
print(lemmatizer.lemmatize('better'))
print(lemmatizer.lemmatize('better',pos='a'))
print(lemmatizer.lemmatize('good',pos='a'))
print(lemmatizer.lemmatize('goods',pos='a'))
print(lemmatizer.lemmatize('goods',pos='n'))
print(lemmatizer.lemmatize('goodness',pos='n'))
print(lemmatizer.lemmatize('best',pos='a'))

如果没有给定某个词的词性,NLTK词形归并工具会默认其为名词。

使用场景

词干还原工具通常计算速度比较快,所需要的代码和数据集也更简单。但是,相对于词形归并,词干还原会犯更多错误,会对更多的词进行处理,从而对文本的信息内容及意义的缩减量也更大。无论是词干还是词形归并,都会减小词汇表的规模,同时增加文本的歧义性。但是词形归并工具基于词在文本中的用法和目标词义,能够尽可能地保留文本的信息内容。因此,有些NLP包(比如spaCy)不提供词干还原工具,而只提供词形归并工具。

如果应用中包含搜索过程,那么词干还原和词形归并能够通过将查询词关联到更多文档而提高搜索的召回率。但是,词干还原、词形归并甚至大小写转换将显著降低搜索结果的正确率和精确率。上述词汇表压缩方法会导致信息检索系统(搜索引擎)返回更多与词的原本意义不相关的文档。由于搜索结果可以按照相关度排序,搜索引擎和文档索引常常使用词干还原或词形归并来提高所需文档在搜索结果中出现的可能性。但是,最终搜索引擎会将词干还原前和还原后的检索结果混在一起,通过排序展示给用户。

而对基于搜索的聊天机器人来说,精确率更为重要。因此,聊天机器人会先基于未进行词干还原、未进行词形归并的词来搜索最相近的匹配,只有失败了才转向词干还原或者过滤掉的词条匹配来寻找可能的结果。而词条归一化前的匹配结果的级别高于归一化后的匹配结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录|Visual Studio中的Git上传下载使用

目录 前言一、前提准备Step1 仓库准备Step2. 本地仓库和远程仓库绑定当前效果展示 二、下载更新内容到本地仓库情形Step1. 下载 三、更新内容,上传文件到远程仓库情形Step1. 下载Step2. 上传当前效果展示 更新时间 前言 这部分是使用过程中的经验 一、前提准备 St…

【数模资料包】最新数模国赛word+latex模版|数模常用的算法python+matlab代码

【2024最全国赛研赛数模资料包】C君珍贵国一数模资料|最新数模国赛wordlatex模版|数模常用的算法pythonmatlab代码 国赛指:高教社杯全国大学生数学建模竞赛,研赛指:华为杯研究生数学建模竞赛。资料内容具体看文末卡片…

【C++算法/学习】位运算详解

✨ 忍能对面不相识,仰面欲语泪现流 🌏 📃个人主页:island1314 🔥个人专栏:算法学习 🚀 欢迎关注:👍点赞 &…

【Python 千题 —— 基础篇】面积计算(多种图形面积计算)

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 编写一个面向对象的程序,定义一个基类 Shape 和两个派生类 Circle 和 Rectangle,用来计算不同图形…

原子操作与锁

1 原子性 1.1 CPU缓存 L1、L2:一级缓存、二级缓存,均为核心独有 L3:三级缓存,多个核心共用 多级缓存,弥补CPU与内存速度不匹配的问题 1.2 cache line 缓存进行管理的一个最小存储单元,缓存块 1.3 CPU读…

【xilinx】解决 I/O 时钟布局器错误:CLOCK_DEDICATED_ROUTE 异常示例

问题描述 设备&#xff1a; xcvm1102-sfva784-2HP-iS问题&#xff1a;尽管使用 GCIO 引脚作为时钟&#xff0c;但布局器返回 I/O 时钟错误 错误&#xff1a; <span style"background-color:#f3f3f3"><span style"color:#333333"><code&g…

《机器学习》 贝叶斯分类器 原理、参数讲解及代码演示

目录 一、贝叶斯算法 1、简介 2、贝叶斯算法具有以下特点&#xff1a; 二、贝叶斯原理 1、正向概率&#xff08;先验概率&#xff09; 例如&#xff1a; 2、逆向概率&#xff08;后验概率&#xff09; 3、公式 1&#xff09;实例1 2&#xff09;实例2 • 目标&#x…

基于初始运行数据的电池循环寿命预测

这个例子展示了如何使用线性回归(一种监督机器学习算法)预测快速充电锂离子电池的剩余循环寿命。使用基于物理的建模方法预测锂离子电池的循环寿命是非常复杂的&#xff0c;因为不同的操作条件和显著的设备可变性&#xff0c;即使是来自同一制造商的电池。对于这种情况&#xf…

FPGA上板项目(四)——FIFO测试

目录 实验内容实验原理FIFO IP 核时序绘制HDL 代码仿真综合实现上板测试 实验内容 理解 FIFO 原理调用 FIFO IP 核完成数据读写 实验原理 FIFO&#xff1a;First In First Out&#xff0c;先入先出式数据缓冲器&#xff0c;用来实现数据先入先出的读写方式。可分类为同步 FI…

论文翻译 | 通过逻辑增强大型语言模型中的零样本思维链推理

摘要 大型语言模型的最新进展已经展示了它们在各个领域的卓越泛化性。然而&#xff0c;他们的推理能力仍有很大的提高空间&#xff0c;特别是在面对需要多步骤推理的场景时。虽然大型语言模型拥有广泛的知识&#xff0c;但它们的推理往往不能有效地利用这些知识来建立连贯的思维…

机器学习/数据分析--通俗语言带你入门决策树(结合分类和回归案例)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 机器学习是深度学习和数据分析的基础&#xff0c;接下来将更新常见的机器学习算法注意&#xff1a;在打数学建模比赛中&#xff0c;机器学习用的也很多&a…

[LeetCode]根据决策树设计代码解决dfs

目录 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 决策树&#xff1a;根据题意可以知道&#xff0c;全排列需要找到数组内元素不重复的所有排列方式&#xff0c…

Java面向接口编程——开发打印机

题目&#xff1a; 墨盒&#xff1a;彩色、黑白 纸张类型&#xff1a;A4、B5 墨盒和纸张都不是打印机厂商提供的 打印机厂商要兼容市场上的墨盒、纸张 墨盒接口&#xff1a; public interface InkBox {String colorInkBox(); // 墨盒颜色} 纸张接口&#xff1a; public i…

Centos 添加双网卡 (生产环境配置记录)

1、在虚拟机中添加网卡2 [rootntpserver network-scripts]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo …

前端(Vue)tagsView(子标签页视图切换) 原理及通用解决方案

文章目录 tagsView 方案总结tagsView 原理分析创建 tags 数据源生成 tagsViewtagsView 国际化处理contextMenu 展示处理contextMenu 事件处理处理 contextMenu 的关闭行为处理基于路由的动态过渡 tagsView 方案总结 整个 tagsView 整体来看就是三块大的内容&#xff1a; tags…

【SAM下游任务微调】TS-SAM: Fine-Tuning Segment-Anything Model for Downstream Tasks

TS-SAM: Fine-Tuning Segment-Anything Model for Downstream Tasks 论文链接&#xff1a;https://arxiv.org/pdf/2408.01835 代码链接&#xff1a;https://github.com/maoyangou147/TS-SAM 一、摘要 基于适配器的微调方法已经被研究用于改进SAM在下游任务上的性能。然而&am…

【2024】Datawhale X 李宏毅苹果书 AI夏令营 Task1

本文是关于李宏毅苹果书“第1章 机器学习基础”学习内容的记录。 1、术语解释 术语解释机器学习&#xff08;Machine Learning, ML&#xff09;机器学习是一种人工智能&#xff08;AI&#xff09;技术&#xff0c;它使计算机能够从数据中学习并做出决策或预测&#xff0c;而无…

【python计算机视觉编程——3.图像到图像的映射】

python计算机视觉编程——3.图像到图像的映射 3.图像到图像的映射3.1 单应性变换3.1.1 直接线性变换算法&#xff08;DLT&#xff09;3.1.2 仿射变换 3.2 图像扭曲3.2.1 图像中的图像3.2.2 分段仿射扭曲3.2.3 图像配准 3.3 创建全景图3.3.1 RANSAC3.3.2 稳健的单应性矩阵估计3.…

【二叉树】LC405-删除二叉搜索树的节点

文章目录 1 删除二叉树的节点思路其他代码参考 1 删除二叉树的节点 https://leetcode.cn/problems/delete-node-in-a-bst/description/ 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。…

探索全球设计灵感:六大海外设计平台

海外设计网站对于设计师而言&#xff0c;不仅是灵感的源泉&#xff0c;更是专业成长的加速器。这些平台聚集了全球创意人士&#xff0c;提供了一个分享和发现最新设计趋势的环境。设计师可以通过这些网站学习行业内的创新技术&#xff0c;参与设计挑战&#xff0c;提升个人设计…