NLP 笔记(二):基本文字处理

知识讲解

正则表达式

正则表达式 (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)处理:

  1. 在运行文本中对单词进行分段、标记
  2. 规范字格式
  3. 在运行文本中对句子进行分段

分词

问题:语言问题。不同语言差异较大,很难统一算法。

中文分词:

  • 中文词汇是由汉字组成的,汉字通常含有一个音节和一个语素,每个词汇平均由2.4个汉字组成;

  • 标准基线分割算法:最大匹配算法(也称贪心算法 - Greedy) ,对英语不适用

    给定一个中文词汇表和一个字符串

    1. 在字符串开头启动指针
    2. 在字典中找到与从指针开始的字符串匹配的最长单词
    3. 将指针移动至越过此单词
    4. 跳至第 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
2
3
4
5
6
7
import re

key = r"<html><body><h1>hello world<h1></body></html>"
p = r"(?<=<h1>).+?(?=<h1>)"
pattern = re.compile(p)
matcher = re.search(pattern, key)
print(matcher.group(0))

输出:hello world


匹配第一个“python”

1
2
3
4
5
6
7
import re

key = r"javapythonhtmlvhdlpython"
p = r"python"
pattern = re.compile(p)
matcher = re.search(pattern, key)
print(matcher)

输出:<re.Match object; span=(4, 10), match='python'>


找到所有一级标题

1
2
3
4
5
6
import re

key = r"<h1>hello world<h1>" #源文本
p = r"<h1>.+<h1>" #正则表达式规则
pattern = re.compile(p)
print(pattern.findall(key))

输出:['<h1>hello world<h1>']


匹配“http://”和“https://”

1
2
3
4
5
6
import re

key = r"http://www.poshoaiu.com and https://iusdhbfw.com" #源文本
p = r"https?://" #正则表达式规则
pattern = re.compile(p)
print(pattern.findall(key))

输出:['http://', 'https://']


多字符匹配

1
2
3
4
5
6
7
8
9
10
11
import re

key1 = r"12345<hTml>hello</Html>67890"
p1 = r"<[Hh][Tt][Mm][Ll]>.+?</[Hh][Tt][Mm][Ll]>"
pattern1 = re.compile(p1)
print(pattern1.findall(key1))

key2 = r"mat cat pat"
p2 = r"[^p]at"
pattern2 = re.compile(p2)
print(pattern2.findall(key2))

输出:

1
2
['<hTml>hello</Html>']
['mat', 'cat']
0%