【Spark NLP】第 2 章:自然语言基础

  🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

文章目录

什么是自然语言?

语言的起源

口语与书面语

语言学

语音学和音韵学

形态学

句法

语义

社会语言学:方言、语域和其他变体

形式

语境

语用学

罗曼·雅各布森

如何使用语用学

书写系统

起源

字母表

Abjads

Abugidas

音节

徽标

编码

ASCII

Unicode

UTF-8

练习:标记化

标记英语

标记希腊语

Tokenize Ge’ez (Amharic)


什么是自然语言?

人类拥有的最重要的能力之一是语言。语言是我们社会运作方式的重要组成部分。尽管它是人类不可或缺的功能,但它仍然是一种尚未完全了解的现象。它主要通过观察使用和观察病理来研究。也有许多哲学工作探索意义和语言与认知、真理和现实的关系。语言如此难以理解的原因在于它在我们的经验中无处不在。生产和消费有关语言的陈述的行为本身就包含渗透到语言本身的偏见和歧义。幸运的是,我们不需要进入如此高深的哲学!然而,当我们深入研究本书的材料时,我喜欢牢记语言作为锚的宏伟和神秘。

许多动物都有复杂的交流系统,有些甚至有复杂的社会,但没有动物表现出像人类那样交流如此复杂的抽象概念的能力。如果您希望在新石器时代幸存下来或订购比萨饼,这种复杂性非常好,但如果您正在构建一个处理语言的应用程序,那么您的工作就完成了。人类语言似乎比任何其他交流系统都复杂得多。我们的语言规则不仅允许无限独特的句子(例如,“第一匹马先于第二匹马,后者先于第三匹马,后者先于第四匹马......”),它们还允许我们创造令人难以置信的抽象. 这两个方面都与其他人类认知能力有关。

让我们简要介绍一下语言和写作的起源,以了解我们将要处理的这种现象。

语言的起源

关于人类语言的起源有很多争论。我们甚至不能完全确定现代人类语言是在何时何地首次发展的,或者语言是否起源于一个单一的地点和时间。手势理论表明,手语首先起源,然后是口头语言,它与发出越来越复杂的声音所必需的生理特征一起发展。另一个有趣的争论是语言是分阶段发展还是一次性发展起来的。

甚至儿童用来获得语言的机制也没有被完全理解。在中世纪,人们认为如果不教孩子语言,他们会说“原始”或“自然”语言。有进行此类有意和无意实验的故事,并且声称有各种结果。在现代,有一些悲剧让我们观察了人类在童年早期没有接触到语言时会发生什么。当孩子在关键时期之后才接触语言时,他们在学习和理解复杂的语法方面会遇到严重的困难。幼儿的语言习得似乎有一些特别之处,可以让他们学习我们复杂的交流系统。

在这些孩子在关键时期没有获得语言的悲惨情况下,受害者仍然能够学习单词,但他们很难学习复杂的句法。另一个让我们了解语言的悲剧是 FOXP2 基因及其对突变基因的影响。它出现该基因的某些突变会导致言语障碍、说话困难或无法说话。言语障碍患者所经历的一个困难是无法形成长的或复杂的声音或单词序列。这种基因的存在似乎使我们能够创造复杂的序列,这引发了关于语言起源的问题。如果我们在进化出 FOXP2 基因之前没有复杂的语言,那么这个基因会带来什么优势导致它被选中?

1980 年代,尼加拉瓜建立了许多聋童学校。最初,这些孩子使用“家庭标志”或基本的和高度积极的标志进行交流。动机符号是一种形式,其形式受其所代表的事物所决定或至少受到影响——例如,模仿将某物放入口中以代表食物的行为。随着时间的推移,年幼的孩子将这些不同的手语系统组合成一种越来越复杂、抽象的手语。最终,一种全新的语言诞生了,具有完全复杂的语法和抽象的无动机符号

不管语言是如何、何时何地起源的,我们都知道书面形式的出现要晚得多。

口语与书面语

书面语言是在几千年前才发展起来的。书面语言不能也不能代表口语或手势语言中可能存在的所有细微差别。语言不仅仅是一系列声音或手势。它与面部手势和声音或手势产生方式的变化相结合。这些被称为副语言特征

有几种方法可以编写副语言特征。当它们存在时,它们可用于访问复杂的意图。

喀哒声通常被视为南部非洲某些语言的外来特征,但在某些欧洲语言中也被用作副语言特征。在英语中,“tsk tsk”或“tut tut”的发音表示失望、烦恼甚至厌恶。尽管有商定的书面陈述,但这些不是真实的话。除了对口语的描述之外,您很少会发现这些以文本形式呈现。

声调是另一种声音,在某些语言中用作语言特征,在其他语言中用作副语言特征。普通话使用四个声调,但英语使用声调作为副语言特征。中文语标表示整个单词,因此不需要单独表示声调,但用于语音表示普通话的基于拉丁文的拼音书写系统通过元音上的标记来表示声调。英语有一些方法可以表示这些副语言特征。考虑以下之间的区别:

  • You know the king.
  • You know the king?

这两个句子之间的区别纯粹是音调和音高。问号表示句子应该被解释为一个问题,因此它也表示句子的一般语气和音高。

面部手势是无法在传统文本中表示的副语言特征的一个示例。在现代写作中,面部手势可以说是由表情符号或表情符号代表。仍有许多细微差别难以解释。

让我们考虑一下您要求重新安排与朋友共进午餐的场景。假设他们回应以下内容:

  • OK :)

在那个回应中,你无法分辨微笑表示什么。他们可能会使用它,因为您以重新安排而闻名,所以这是幽默的预期。他们可能是出于习惯使用它。另一方面,假设他们回应以下内容:

  • OK. . .

在此响应中,省略号更难解释。它可能代表烦恼,也可能只是表明即将有另一条消息出现。如果这种交流是亲自进行的,那么歧义就会减少,因为这些东西可以通过面部手势和其他副语言特征来感知。

现在让我们看看语言学领域,因为这将为我们在查看语言数据时提供一种结构化的方式来探索这些考虑因素。

语言学

语言学是对人类语言的研究。语言学有许多子领域,但通常有两种类型:一种侧重于语言元素,另一种侧重于语言的使用方式。还有许多跨学科领域将语言学和另一个领域联系起来。让我们看几个子字段。

语音学和音韵学

语音学是对口头语言中使用的声音的研究。因为我们将专注于文本数据,所以我们不会过多地使用这个子字段。基本单位是音素或音素(它们是不同的东西,但用于不同类型的分析)。这些单位使用国际音标 (IPA)表示。IPA 使用符号来表示各种各样的声音。我将在本节中使用它而不做太多解释,但如果您有兴趣了解更多关于 IPA 及其符号的信息,网上有很多很棒的资源。

语言音韵,是音素和规则的集合关于如何使用和实现音素。当一个音素被实现时这是一部电话。在英语中,/t/是音素(/*/是写音素的约定,[*]是音素的约定),/t/有多种可能的实现:

[tʰ]

在重读音节的开头:“team”、“return”

[t]

在像“stop”这样的/s/之后,在像“pot”这样的词的结尾,甚至在某些方言(英国、印度)的元音之间,或者在像“matter”或“technique”这样的非重读音节的开头

[ɾ]

某些方言(北美、澳大利亚、新西兰)中元音之间的拍打声

[ʔ]

某些方言(英国)中元音之间的声门塞音

通常在处理文本数据时,我们不关心语音,但如果我们想使用声音相似度进行搜索,它会很有用。例如,我们可能想要搜索一个名为 Katherine 的人的姓名列表,但Katherine可以有多种不同的拼写方式(Katheryn、Catharine、Katharine 等)。使用一种称为 Soundex 的算法,我们可以通过语音表示查询来搜索相似的发音名称。

形态学

形态学是对语素的研究。语素是可以承载意义的最小元素。有四种语素,由unboundbound以及contentfunctional 定义

未绑定的内容词素、内容词素或词汇词素

代表事物或概念本身的词

示例:“cat,” “remember,” “red,” “quickly”

未绑定的功能性语素或功能性语素

在句子中执行功能的单词

示例:“they,” “from,” “will” (用于制作将来时)

绑定内容词素或派生词缀

把一个词变成另一个词的词缀

示例:“-ty”(“royal”+“-ty”=“royalty”),“-er”(“call”+“-er”=“caller”)

绑定功能语素或屈折词缀

表示句子中单词功能的词缀

示例:“-(e)s”(复数,“cat”+“-(e)s”=“cats”,“pass”+“-(e)s”=“passes”),“-ed”(过去时,“melt” + “-ed” = “melted”

有一些文本处理算法可以很容易地解释为删除或简化某种语素。了解这些差异是了解您要在文本数据中的何处查找信息的良好开端。此信息是特定语言的。某些语言中的功能词素是其他语言中的屈折词缀,因此了解这些区别可以帮助您在不同语言的基本处理中做出决定。

形态学的一个重要区别是语言是综合的还是分析的。这可以被认为是屈折词缀功能语素的比率。使用的屈折词缀越多,语言的综合性就越强。英语和普通话一样,被认为是一种主要的分析语言,可以称为孤立语言。俄语和希腊语比较中庸,有时可以称为融合的。土耳其语和芬兰语非常合成,被称为粘合。语言的类型对于确定如何进行基本的文本处理至关重要。当我们讨论为多种语言构建应用程序时,我们将更深入地介绍这一点。

形态与句法密切相关。事实上,两者都经常被考虑在morpho-syntax的总括概念下。

句法

句法是研究单词如何组合成短语和句子的学科。语法有多种竞争模型。语言学领域流行的模型不一定是计算语言学和 NLP 中流行的模型。

引入语法的最常见方式是使用短语结构树 (PST)。下面我们来看图2-1中的PST:

  • 我看到那个戴帽子的人。

图 2-1。短语结构树

 除了引入语法之外,PST 并没有真正使用。极简程序语法、树伴随语法和头部驱动的短语结构语法分别是语言学、NLP 和计算语言学中的流行模型。有许多不同种类的语法,当我们介绍句法解析器时,我们将更多地介绍它们。

研究句法的难点在于模型要么没有受到足够的约束——也就是说,它们允许在自然界中观察不到的结构——要么受到过度的约束,这意味着它们不能表达在自然界中观察到的结构。所有著名的语法都处理简单的句子,因此理论上对于大多数 NLP 使用任何模型都可以。

语法是人类语言的核心方面,提取用语法编码的信息可能是计算密集型的。有很多方法可以近似提取。我们通常会看到,当我们想要提取信息时,我们会尝试这样做,而无需实际创建已解析的结构。其原因是,正如我们之前所说,人类语言的句法中有无限的潜在短语和句子。因此,解析句子的算法通常非常昂贵。

语义

语义学是对语言元素意义的研究。这个领域与哲学的各个领域,尤其是逻辑领域有着密切的联系。语义领域的一个方面是对意义如何由语言结构组成的建模,因此语义与句法最密切相关。语言意义的某些方面可以看作是组合的;其他的更复杂。短语和句子通常可以被分解,但对话、诗歌和书籍就没有那么容易分析了。

似乎我们总是对提取文本中的语义感兴趣,这在一段时间后是真的。我们应该始终牢记的是,一个文本、一个句子,甚至一个词可以有许多不同的含义。在构建 NLP 管道之前,我们需要知道我们感兴趣的内容。

大多数使用 NLP 的项目都在寻找被分析文本中的含义,因此我们将多次重新审视这个领域。

我们还应该记住其他几个子领域——社会语言学和语用学。

社会语言学:方言、语域和其他变体

社会语言学是对社会语言的研究。它是社会学和语言学之间的交叉学科。理解文本的社会背景对于理解如何解释文本很重要。该领域还为我们提供了一个框架来了解不同的数据集如何相互关联。当我们研究迁移学习时,这将很有用。

社会语言学的一个有用概念是语言变体的概念,它涵盖了方言和俚语的主题。这个想法是语言是变体的集合,人们有自己的变体集合。个人所说的各种变体的集合可以被认为是一种方言个人使用的不同品种称为寄存器。寄存器涵盖形式的概念以及其他语言、手势和写作方式。

形式

由于语言是人类社会交往的基本工具,社会行为的许多方面都有语言的表征。一方面是形式观念。正式性通常被称为从休闲到正式的单一频谱,但它比这更复杂。零售业人员与客户一起使用的正式程度不同于某人申请研究生院或与祖父母交谈时所需的正式程度。非常正式和非常非正式的登记册会导致复杂化。

高度正式的寄存器通常包含没有传达太多含义但用于表明形式的内容。考虑以下零售工人和客户之间的假设对话:

  • 顾客Hello. Do you have any mangoes?
  • 零售工人Hmmm. . .I don’t think so, sir.

客户的问题相对简单。大多数人将零售员工的回答解释为实际上等同于“不”。最初的“嗯。. 。” 要么是因为零售工人不知道并需要考虑商店是否有芒果,要么是因为他们假装考虑了这个要求。突然回答“我不这么认为,先生”可能被认为是粗鲁或不屑一顾。同样,零售工人也不能只说“嗯。. .不,先生”,因为这可能被认为是生硬的。“先生”纯粹是一种正式的标记,称为敬语。

非正式的寄存器可能难以解析,因为其中通常使用速记和俚语。此外,我们经常与我们最亲近的人使用非正式的环境。这意味着我们在非正式记录中的大部分交流都处于一个深度共享的环境中。这会使使用最非正式的沟通变得困难。

语境

登记册不仅基于形式,还基于上下文。寄存器影响发音、形态句法,甚至词义。在使用来自不同种类的语言的文本数据集时,我们必须始终牢记数据集中的不同种类是如何表达的。

考虑两种不同评论中“quiet”一词的含义:

  • The hotel room was quiet.
  • The headphones are quiet.

在第一个方面,“安静”是一个积极的属性,而在第二个方面它可能是消极的。这是一个相对简单的例子;这些差异可能更加微妙,在尝试组合数据集或进行迁移学习时需要考虑它们。

有一个完整的子领域致力于理解语境中的语言使用:语用学。

语用学

语用学是一个研究语言在上下文中的使用和意义的子领域。理解语用学将帮助我们理解我们拥有的文本数据背后的意图。语用学是一个子领域,我认为任何 NLP 实践者都会一次又一次地回到它。

罗曼·雅各布森

虽然它现在有些陈旧,但我喜欢罗马雅各布森语用学模型(见图 2-2)。该模型是围绕一个简单的抽象通信模型构建的。这个想法是沟通有六个不同的部分或因素。

图 2-2。罗曼·雅各布森的语言功能

在这个模型中,沟通中有六个因素,以及六个功能。每个功能都侧重于其相关因素。以下是六个功能(带有相关因素):

情绪化(发话人)

传达发信人状态的消息(“uh-oh!”

宾语(收件人)

对收件人有预期影响的消息(“Open the window.”

诗意的(消息)

为信息本身而发的信息(诗歌、散文)

元语言(代码)

关于消息编码的代码的消息(“What do you call this?”

Phatic(通道)

建立或与沟通渠道相关的消息(“Hello!”,闲聊)

参考(上下文)

从上下文传达信息的消息(“It’s raining.”

这种语用学模型将信息视为关注这些因素的某种组合。它通常通过主要关注一个因素的消息示例进行解释,但应该记住,大多数言语行为是关注多个因素的组合。

如何使用语用学

在处理文本数据集时,值得考虑为什么要编写这些消息。理解这一点需要语用学、社会语言学和领域专业知识的结合。我们可能并不总是能接触到领域专家,但我们可以对数据的语用学和社会背景做出有根据的解释。这些考虑应尽可能早地在此过程中进行,因为这将为许多关于如何使用我们的数据的决策提供信息。

书写系统

在本章中,我们讨论了语言的许多方面,但到目前为止,我们只关注作为语言一部分的方面,这些方面要么只是口语,要么是口语和书面语。书写系统种类繁多,它们可以强烈影响我们处理数据的方式。

起源

虽然写作是人类历史上的最新发展,似乎仍然存在身体适应。什么时候一个人会识字,大脑中专门识别字符的部分——信箱——被激活。对于所有人来说,无论他们学习哪种语言,信箱都位于一个相似的地方。关于它的起源有不同的理论,但信箱的存在是人类和我们的语言能力如何专业化的另一个例子。

在整个历史中,文字似乎被发明了多次。似乎确实存在一种模式,首先创建甚至可能与单词不对应的高度活跃的符号,也称为象形文字,然后进行转换和专门化。

拉丁字母的起源有许多有趣的曲折。它演变的普遍接受的文化链如下:拉丁人从希腊字母表中借用,但请记住,有多个希腊字母表在古典时代。希腊人反过来从腓尼基人那里借用了他们的字符,并添加了一些创新的字母。腓尼基人是居住在黎凡特海岸的迦南人部落。迦南人在他们的书写系统中都有相同或相似的字符。这种书写系统似乎是基于埃及字符的简化版本。埃及文字混合了语标和音标(类似于现代日语)。迦南人取了埃及文字的一些音标并将它们改编成他们自己的语言,然后他们简化了这些符号的外观,直到象形元素不再显眼。埃及人似乎已经从象形文字系统中创新了自己的书写系统。同时,

图 2-3显示了古代象形图中的一些字母及其来源。

图 2-3。一些字母的起源

字母表

字母表是一种基于语音的书写系统,代表辅音和元音。下面是一些字母表的例子:

拉丁

拉丁语在世界范围内使用。它的使用在殖民时代得到了传播。为了适应许多不同的语言,发明了许多新字符。英语字母表相对简单(并且可以说不适合英语)。它的现代形式是在印刷的早期定义的,当时特殊字符更难甚至无法表示。

英语:“Hello!” 发音 /hɛˈloʊ/

西里尔

东欧、中亚和北亚的许多国家都使用西里尔字母。它的名字来自圣西里尔,一位 9 世纪的拜占庭僧侣,他发明了(或至少正式化了)格拉哥里字母,即西里尔字母的前身字母。

英语:“Привет!” 发音 /prʲɪˈvʲet/

希腊语

希腊语被现代希腊语及其方言使用,以及希腊语占多数的地区的一些少数民族语言使用。今天的希腊字母来自古典时代的阁楼(雅典)希腊字母。

希腊语:“Γειά σου!” 发音 /ʝa su/

韩文

Hangul 用于书写韩语,是在 15 世纪世宗大王时期发明的。韩语与其他字母的不同之处在于符号组合成音节块。考虑以下示例:

韩语:“ㅇ+a+b ㄴ+ㅕ+ㅇ” <- + a + nn + yeo + ng> 变成“안녕”发音/anɲjʌŋ/

字母脚本通常很简单,但要注意使用变音符号的语言,字符上的标记。有时我们可能希望删除这些作为规范化数据的一部分,这可能很复杂。然而,这通常可以通过基于规则的方式来解决。

Abjads

Abjad是一种基于语音的书写系统,主要表示辅音,仅表示可选的元音。这些书写系统几乎完全是从右到左书写的,在为使用这些脚本的语言创建 UI 时要牢记这一点。以下是一些abjads的例子:

阿拉伯

阿拉伯语(书写系统)用于书写阿拉伯语(语言)、波斯语、旁遮普语和乌尔都语。它的使用随着伊斯兰教的兴起而传播开来。阿拉伯语(书写系统)起源于阿拉米语 abjad,它传播到阿拉伯半岛并发展出我们今天看到的草书形式。

阿拉伯语:“مرحبا” <m + r + h + b + a> 发音 [mær.ħɑ.bæː]

希伯来语

希伯来语(书写系统)用于书写希伯来语(语言)、亚拉姆语、意第绪语、拉地诺语和其他犹太侨民语言。它是从古代迦南人的abjads发展而来的。

希伯来语:“שלום” <sh + l + o + m> 发音 /ʃaˈlom/

似乎不写元音会使其难以阅读。然而,只有那些学习语言的人是困难的。这就是为什么大多数 abjads 都有可选标记来指示元音以帮助儿童和第二语言学习者。当我们谈论不同的形态句法系统时,我们会明白为什么写元音对闪米特语来说不是一个障碍。

Abugidas

abugida是一种基于语音的书写系统,其中每个字符代表一个音节。abugida 不是为每个可能的音节(音节是什么)设置一个单独的字符,而是每个起始辅音都有一个字符,带有默认元音和改变元音的标记。考虑一下当今使用最广泛的 abugida,梵文。有一个字符क,代表/ka/。如果我们想将元音变为 /u/,我们添加必要的标记 कु,它代表 /ku/。有一个特殊标记表示没有元音也很常见,它通常用于表示出现在音节末尾的辅音。历史上,有些语言没有这样的标记,而是依靠各种约定来表示音节结尾的辅音。以下是 abugidas 的一些示例:

梵文

梵文起源于公元 10 世纪之前的某个时间,由早期的婆罗米文发展而来。我们不确定婆罗米文字的来源,尽管它被认为是源自阿拉姆语的 abjad。

英语:“hello” <na + ma + s - + te> 发音 /nəˈmə.ste/

泰国

泰语(书写系统)也源自婆罗米文。关于泰语书写系统的一件有趣的事情是它也代表音调。有特殊字符来标记音调,以及与某些字符相关的固有音调。

泰语:“你好”<s + wa + s + di> 发音 /sa˨˩.wat˨˩.di˧/

Ge’ez

Ge'ez(书写系统)在东非用于书写埃塞俄比亚的各种语言。它是从南阿拉伯文字发展而来的,可能与现代阿拉伯语(书写系统)无关,后者本身就是最早的迦南文字的后代。最初,Ge'ez 是一个 abjad,但随着时间的推移,一个默认元音发展了,元音标记成为强制性的。因为改变默认元音的标记有时会改变字符的形状,所以可以说 Ge'ez 可能是一个音节。

阿姆哈拉语:“سلام” <sə + la + mə> 发音 /سلام/

音节

音节是一种基于语音的书写系统,其中语言中每个可能的音节都有不同的符号。与其他基于语音的系统不同,音节通常是发明的,而不是派生的。今天仍在使用的不多。音节,如字母,通常非常简单明了,这使得将它们作为数据处理更容易。以下是一些音节的例子:

平假名

平假名是用来书写日语的音节之一。另一种是片假名,也用于书写阿伊努语,这是一种在日本北部使用的有趣语言,与日语无关。平假名和片假名是从中国语标的简化表示发展而来的,类似于迦南文字系统从埃及发展而来的。日语使用汉字、中文标识,并结合平假名。这是必要的,因为日语和汉语是不同的语言,日语是一种粘着性语言,而汉语是高度分析性的。片假名用于写借词和拟声词(如英语“woof”和“bang”)。

日语:“今日は” <kon + nichi + ha> 发音为“konit͡ɕiwa”

Tsalagi

Tsalagi 是 Sequoyah 发明的音节表,用于书写他的母语切罗基语。如果你说英语,你会认出一些字符,但这无助于发音。人物的发音与他们在英语中的发音无关。

Tsalagi:“ᏏᏲ”<if + you> 发音为 /sijo/

徽标

一个标(也是语标)系统是一个基于语义和语音相结合的系统。这是一个有点杂项的类别,因为这些系统的工作方式通常彼此非常不同。那里当今广泛使用的只有一个这样的系统——汉字。它用于书写中国的大部分语言,以及日语(前面提到的汉字)。这些书写系统可以使处理更容易,因为通常分解的可能性较小,因此可以简化基本的文本处理。它们也可能使事情复杂化,因为它们通常在没有单词分隔符(例如空格字符)的情况下编写,并且它们需要更深入的语言知识来处理细微差别加工。

汉族

汉语汉字使用表意书写系统,其中每个字符通常代表汉语中的一个音节,尽管在日语中不一定如此。

中文:“你好”<“you”+“good”>普通话读“ni˨˩ hau˨˩”,粤语读“nei˩˧ hou˧˥”

编码

当我们处理文本数据时,我们正在处理已编码为某种二进制格式的书面数据。这似乎是一件小事,但它经常是困难的根源,尤其是在使用非英语语言时。由于英语世界在现代计算机的发展中发挥了如此重要的作用,因此许多默认设置仅对英语有意义。

让我们回顾一下有关编码的一些细节,以便在(而不是如果)遇到编码问题时牢记。

ASCII

美国信息交换标准代码 (ASCII)是控制字符、拉丁标点符号、阿拉伯数字(在欧洲使用)和英文字符的映射。它最初是为在电传打字机(又称电传打字机)中表示字符而设计的,这是缩写 TTY 的由来。

虽然这是一个旧标准,但一些遗留系统仍然只支持 ASCII。

Unicode

由于文本最终使用字节表示,因此数字和字符之间必须存在一些映射。你的计算机没有“a”的概念,它只知道数字。Unicode 是由 Unicode Consortium 维护的标准化字符编号映射集。例如,“a”映射到 97。字符通常用特定格式的十六进制数字表示——例如“a”是 U+0061。U+####是表示 Unicode 值的标准格式。字符通常按语言分组。以下是的一些示例:

  • 基本拉丁语 (U+0000–U+007F):ASCII 字符
  • Latin-1 Supplement (U+0080–U+00FF):附加控制代码、附加欧洲标点符号和欧洲常用拉丁字符
  • 西里尔字母 (U+0400–U+04FF):大多数使用西里尔字母书写系统的语言的字符

Unicode 以不同的编码实现。这些编码中最常见的由 Unicode 联盟本身维护,一些由 ISO 和 IEC 维护。

UTF-8

8 位 Unicode 转换格式 (UTF-8)是Unicode 的可变宽度实现。它是可变宽度的,因为不同范围内的字符需要不同数量的字节。它使用一个字节来表示 ASCII 字符。它用两个字节来表示U+0080到U+07FF,涵盖了最常用的字母表和abjads(韩文除外)。三个字节涵盖 CJK(中日韩)字符、南亚文字和大多数其他当前使用的语言。四个字节涵盖了 Unicode 的其余部分。它通过在字节上使用位前缀来表示它是多字节模式的一部分来支持这一点。

UTF-8 已取代 ASCII 和 ISO-8859-1(又名 Latin-1)成为最常见的编码。与 ASCII 和 ISO-8859-1 不同,它支持西欧以外的语言。ASCII 编码的数据不是问题,因为它代表一字节的 UTF-8 字符。但是,ISO-8859-1 也表示带有一个字节的 Latin-1 补充。这导致数据以一种方式编码并以另一种方式解码的常见问题。让我们看看“ñ”是如何表示和可能被破坏的。

字符latin1 编码UTF-8 编码latin1 enc 到 utf-8 decutf-8 enc 到 latin1 dec
一个6161aa
nF1C3 B1INVALIDñ

当我们讨论生产化和多语言系统时,我们将更多地讨论这个主题。

练习:标记化

最基本的文本处理技术之一是标记化。这是将一串字符分解成碎片(通常是单词)的过程。这似乎是一项简单的任务,但由于它在任何 NLP 管道中都处于早期阶段,因此使其正确至关重要。它也会受到您正在使用的语言的书写系统的影响。

让我们看看标记语言可能会遇到哪些挑战。让我们从一些基本的分词器开始。

空格分词器

标记被定义为空白字符序列两侧的非空白字符序列。

ASCII 分词器

标记被定义为一系列 ASCII 字母或数字。

gaps参数告诉我们标记器如何定义标记。如果它设置为True,则pattern参数定义分隔标记的内容。如果False,它代表令牌本身。

from nltk import nltk.tokenize.RegexpTokenizer

whitespace_tokenizer = RegexpTokenizer(r'\s+', gaps=True)
ascii_tokenizer = RegexpTokenizer(r'[a-zA-Z0-9_]+', gaps=False)

标记英语

标记英语相对简单。我们可以分割空格:

whitespace_tokenizer.tokenize('Hello world!')

['Hello', 'world!']

或者我们可以使用 ASCII 分词器:

ascii_tokenizer.tokenize('Hello world!')
['Hello', 'world']

标记希腊语

希腊语使用与英语相同的空格字符来分隔单词,因此空格标记器将在这里工作:

whitespace_tokenizer.tokenize('Γειά σου Kόσμε!')
['Γειά', 'σου', 'Kόσμε!']

ASCII 标记器在这里不起作用,因为 ASCII 不支持希腊语:

ascii_tokenizer.tokenize('Γειά σου Κόσμε!')
[]
# 定义一个带有 gaps=False 的正则表达式,它将标记希腊语
pattern = r''
greek_tokenizer = RegexpTokenizer(pattern, gaps=False)
#assert greek_tokenizer.tokenize('Hello World!') == ['Hello', 'your', 'World']

Tokenize Ge’ez (Amharic)

阿姆哈拉语不使用与英语相同的字符来分隔标记,因此空格标记器不起作用:

whitespace_tokenizer.tokenize('Γειά σου Kόσμε!')
['Γειά', 'σου', 'Kόσμε!']
# 定义一个带有 gaps=True 的正则表达式,它将标记阿姆哈拉语
pattern = r''
amharic_sep_tokenizer = RegexpTokenizer(pattern, gaps=True)
#assert amharic_sep_tokenizer.tokenize('Hello,High!') in (['Hello', 'High!'], ['Hello', 'High'])

同样,ASCII 标记器在这里也不起作用:

ascii_tokenizer.tokenize('ሰላም፡ልዑል!')

   [ ] 

# 定义一个带有 gaps=False 的正则表达式,它将标记阿姆哈拉语
pattern = r''
amharic_tokenizer = RegexpTokenizer(pattern, gaps=False)
#assert amharic_tokenizer.tokenize('Hello,High!') == ['Hello', 'High']
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值