前言

本章名称:REGULAR EXPRESSIONS, TEXT NORMALIZATION, EDIT DISTANCE

从 DLHLP 2020 那边了解到了这本书,开源免费,关于 Speech 和 NLP 的一本非常优秀的书,cs224n 的官网推荐的 ref 里面也有这本书。在书这个角度上有仓鼠症的我当然是第一时间下载,然后没看几页,最近发现 写博客也挺好的,可以同步,也可以保存草稿,不会让我的桌面那么乱了,之后一些学习的东西也可以挂在这里,当然也希望能够多写东西进而练练文笔,能写出一些让别人看起来舒服而不是光自己能看懂的东西(当然这个才是需要功夫和耐心的,可能又要数倍的时间)

教材开源网址:

Speech and Language Processing


https://web.stanford.edu/~jurafsky/slp3/

本篇笔记的记载顺序基本按照教材原文,基本上属于教材原文的精炼。

 正文

lemmatization: 判断两个词是否有相同的词根。

Lemma: “sing” 就是 “sang”, “sung”, “sings” 的 common lemma。

Stemming: simpler version of lemmatization in which we mainly just strip suffixes from the end of the word.

正则有很多变种,书中介绍的正则叫做 extended regular expressions。

正则是大小写敏感的。

方括号"[ ]" 表示一组待匹配的内容。比如我想做某个字母的大小写不敏感,我就可以用下面的例子。

[gG]reat 就可以匹配 great 或者 Great。

方括号里面也可以有很多内容,[0123456789]就可以匹配任意一位数字。当然你肯定觉得这样很费事,所以正则里可以用横线dash“-”来表示range。不像 python 或部分编程语言,正则的 range 是前闭后也闭。

所以 [1-3] 可以匹配 1 或 2 或 3。 [0-9] 就是所有数字,[A-Z] 和 [a-z] 就是所有的大写字母和小写字母。

caret ^ 放在方括号里的开头表示 取反,就是不在范围内的匹配。如果没出现在方括号里,就是正常的表达式里出现 ^ ,那它就是匹配他自己。

[^123] 表示除了 1 或 2 或 3 的任何字符都可以被匹配。[1^] 匹配 1 或者 ^ 。1^ 表示匹配 1^ 这两个连续字符。

question mark ? 表示前面的那个字符可能有也有可能没有。

比如 dogs? 就可以匹配 dog 或 dogs。

星号 asterisk * 表示匹配零个或若干个前面的字符。问号升级版了属于是。

Ah*! 就可以匹配 A! Ah! Ahh! 等等。有意思的情况是,a* 是可以匹配 123 的,以为里面没有 "a" 哈哈哈哈哈。结合前面的知识点,a[12]* 就是a加上零个或若干个 1 或者 2,比如 a111 a222 a121 a345 都可以匹配。

OK,基础学完了,课间考试,如何表达正整数?

[0-9][0-9]*,因为如果只有 [0-9]*,什么都没有也可以匹配。这样太不优雅了,所以又有了升级版。

加号 + ,表示至少一个,或若干个。

所以如果表示一串数字,一般优雅的表示是 [0-9]+ 。

period (/./),英文句号,表示通配符,可以匹配除了回车的任何字符。

比如 a.b 就可以匹配 aab a1b a'b 等等。

通配符经常和星号一起用,.* 表示任意长度的字符串(可以是什么都没有)。

一个有趣的应用是,比如我想找出现过两次 Tom 的一行,就可以用正则 Tom.*Tom 来匹配。

Anchors 是一类有意思的高级符号,下面分开介绍。

^ 表示一行的开头, “^The” 只会匹配出现在最开头的 The,如果The 出现在其他地方则不会被匹配。对应的 $ 表示一行的结尾。所以 “^The mouse.$” 只会匹配一行中只有 “The mouse.” 这些字符的行。

\b 表示 word boundary ,“\bwhat\b” 就只会匹配单独的 word "what",不会匹配 “whatever”。值得注意的是,这里word的定义是根据编程语言定义的,word 指下划线,字母,数字的组合,也就是说 “\b88” 会匹配 “88” 但是无法匹配 “188”,因为 1 也是 word 的内容,还没到边界。但是"$88" 可以被匹配,因为 "$" 并没有被列入 word。

\B 就是表示 \b 的反义,所有不能匹配 \b 的都能匹配 \B,反之亦然。

才记到 2.1.2 就已经用了这么久……笔记有点太细了