✎知识讲解
✎正则表达式
正则表达式 (Regular Expressions) 是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规定字符串。
✎基本语法
析取:字符集合[]
,范围表示[A-Z]
Pattern | Matches |
---|---|
[wW]oodchuck | Woodchuck, woodchuck |
[1234567890] | 任一数字 |
[A-Z] | 任一大写字母 |
[a-z] | 任一小写字母 |
[0-9] | 任一数字 |
否定析取:[^Ss]
(仅当"^"出现在字符集合模式[]
的第一个字符时)
Pattern | Matches |
---|---|
[^A-Z] | 任一非大写字母 |
[^Ss] | 既不是"S"也不是"s" |
a^b | 与字段相同 |
其他析取:析取中的“|”,对匹配条件进行逻辑“或”运算
Pattern | Matches |
---|---|
groundhog|woodchuck | groundhog 或 woodchuck |
a|b|c | = [abc] |
特殊字符:? * + . ^ $(要表示这些特殊符号本身,需要在其前加一个\
进行转义)
Pattern | Matches |
---|---|
? | 匹配前面的子表达式一次或零次 |
* | 匹配前面的子表达式任意次 |
+ | 匹配前面的子表达式一次或多次 |
. | 匹配除"\n"和"\r"之外的任意单个字符 |
^ | 匹配输入字行首,如果设置了RegExp对象的Multiline属性,也匹配“\n”或“\r”之后的位置 |
$ | 匹配输入字行尾,如果设置了RegExp对象的Multiline属性,也匹配“\n”或“\r”之前的位置 |
✎举例
例子:找到文本中“the”的所有实例。
错解:
-
[tT]he
,错误返回其他词汇,即匹配本不应被匹配的字符串(there,then,other)错误类型:False positives(误报 Type I)
-
the
,遗漏了大写字母开头的实例,即没有匹配到本应被匹配的字符串(The)错误类型:False negatives(漏报 Type II)
处理错误:降低应用程序中的错误率通常涉及两种对立的工作:
- 提高准确性或精确度(最小化False positives)
- 提高覆盖率或召回度(最小化False negatives)
✎总结
- 正则表达式起着至关重要的作用。对于任何的文本处理来说,正则表达式通常是复杂序列的首选模型;
- 对于许多困难的任务,我们使用机器学习分类器,但是正则表达式将作为分类器中的特征值,在获取一般化时非常有用。
✎字标记
✎文本归一化
每个NLP任务都需要做文本归一化(Text Normalization)处理:
- 在运行文本中对单词进行分段、标记
- 规范字格式
- 在运行文本中对句子进行分段
✎分词
问题:语言问题。不同语言差异较大,很难统一算法。
中文分词:
-
中文词汇是由汉字组成的,汉字通常含有一个音节和一个语素,每个词汇平均由2.4个汉字组成;
-
标准基线分割算法:最大匹配算法(也称贪心算法 - Greedy) ,对英语不适用
给定一个中文词汇表和一个字符串
- 在字符串开头启动指针
- 在字典中找到与从指针开始的字符串匹配的最长单词
- 将指针移动至越过此单词
- 跳至第 2 步重复此过程
✎词语规范化
- 规范化 (Normalization):信息检索需要规范化用语,索引文本 & 查询字词必须有相同的格式。
- 大写转换 (Case folding):由于用户倾向于使用小写字母,经常将所有字母转换为小写;对于情感分析,MT,信息提取等,字母的大小写转换是非常有帮助的。
- 词形还原 (Lemmatization):将变形或变体形式转换为基本形式(如:am, are, is → be,car, cars, car’s, cars’ → car)。
语素:
- 构成单词的微小而有意义的单元
- 词干(stems):核心含义单位
- 词缀(Affixes):依附于词干上的单元,通常具有语法功能
✎词干提取
定义:在信息检索中,将词语缩短至其词干形式。词干提取即是对词缀的粗略删减。
e.g. automate(s), automatic, automation all reduced to automat.
词干提取算法 (Porter’s algorithm)
✎句子划分与决策树
句子划分(Sentence Segmentation)
- !,?是相对明确的标点符号
- 句号“.”的含义模糊
- 句子边界
- 缩写表示(Dr.)
- 数学表示(.02%)
- 构建二元分类器
- Looks at a “.”
- Decides EndOfSentence / NotEndOfSentence
- Classifiers: hand-written rules, regular expressions, or machine-learning
决策树(Decision Tree) ,可用来确定单词是否为句子结尾。
决策树的实现:
- 决策树仅仅是 if-then-else 的语句,有趣的是其选择功能;
- 难以手动建立决策树结构:手动构建至适用于简单的特征及领域;对于数字要素,选择每个阈值太难,相反,结构通常通过机器学习从训练语料库中得出。
✎练习
提取“hello world”
1 | import re |
输出:hello world
匹配第一个“python”
1 | import re |
输出:<re.Match object; span=(4, 10), match='python'>
找到所有一级标题
1 | import re |
输出:['<h1>hello world<h1>']
匹配“http://”和“https://”
1 | import re |
输出:['http://', 'https://']
多字符匹配
1 | import re |
输出:
1 | ['<hTml>hello</Html>'] |