自然语言处理学习篇01——Basic Text Processing

来源:互联网 发布:10019 签名数据失败 编辑:程序博客网 时间:2024/05/21 13:53

前言:

自然语言处理(Natural Language Processing——NLP)广泛应用于语音识别、机器翻译、自动问答等领域。早期的自然语言处理技术是基于“词性”和“语法”的,到了70年代走到了尽头,取而代之的是基于“数理统计”的方法。NLP的历史可以参考《数学之美》(吴军 著)一书。

本系列跟随斯坦福Dan Jurafsky教授和Christopher Manning助理教授来学习NLP的具体知识。其中包括word and sentence tokenization(单词和语句分割)、text classification(文本分类)sentiment analysis(情感分析)等,probality(概率论)、statistics(统计学)、machine learning(机器学习)的基础理论,以及一些基础算法如n-gram language modeling(n阶语言模型)、naive bayes and maxent classifiers、 Hidden Markov Models(隐含马尔可夫模型)等内容。

斯坦福NLP课程网址https://www.coursera.org/course/nlp

(本人英语水平有限,如有纰漏,欢迎拍砖微笑


第一章:Basic Text Processing

第一章讲述基本的文本处理,包含如下四个方面的内容:
  1. Regular Expression
  2. Word Tokenization
  3. Word Normalization and Stemming
  4. Sentence Segmentation

1.1 Regular Expressions(正则表达式)


直观地想,假如我们想要从一大段文本中找到某个词,会面临什么样的问题?word形式的问题,比如说woodchuck(土拨鼠),其出现的形式还可能是woodchucks/Woodchuck/Woodchucks。这就需要我们通过一些“规则"进行处理,Regular Expressins就是这样的一些规则。


[ ] : 匹配方括号中的任意一个字符,如下图[wW]可以匹配W或者w。


[ a-b ] : 匹配从a到b范围内的所有字符。


^ : 行开头; $ : 行结尾。如下图第一个 ^[A-Z]匹配所有行开头非大学字母的行。
. : 句号代表所有字符。
\. : 在句号前面加一个反斜杠代表句号本身。



[^ ] : 否定方括号里的字符。如[^A-Z]代表非大写字母。


? : 问号的前一个字符可省略。
* : 星号的前一个字符可重复0次或多次。
+ :星号的前一个字符可重复1次或多次。


| :代表”或“,”析取“的含义。如a | b | c 就相当于[abc]。



(读者可以到网站 regexpal.com 尝试)


1.2 Word Tokenization


对于每一个NLP任务来说,首先要做的就是text normalization(文本标准化)工作,其中又包括以下三个方面的内容:

1. Segmenting/tokenizing words in running text(切分单词)

2. Normalizing word formats(归一化单词格式)

3. Segmenting sentences in running text(切分句子)

本篇讲述第一方面。在这方面中,Jurafsky教授对于单词计数上的一些问题尚未下最后的定论,只是说明各种情况各种理解都可以认为是正确的。下面来看具体讲解。


1.2.1  How many words?

对于给定的一句话,该如何数这句话的单词个数。

我们在生活中说话不可能一次正确,往往带有Fragments(单词碎片)pauses(停顿)或者重复等等,如下面这句话。

I do uh main- mainly business data processing.

其中带有uh语气词,main - mainly停顿和重复,这都会对”数词“造成困扰。


这里介绍几个定义Lemma、Wordform、Type、Token、N、V和|V|


例1:Seuss's cat in the hat is different from other cats!

Lemma(词元):如cat 和 cats具有相同的词元。

Wordform(词形):cat 和cats是两种不同的词形。


Type:单词的个数,不计重复的单词

Token:总单词个数,计算重复的单词(简单理解就是单词间的空格数+1)

例2:they lay back on the San Francisco grass and looked at the stars and their

上句中,假如把San Francisco拆开算,当做两个单词,那么就有15 tokens,倘若算为一个,就是14 tokens

而上句中the和and都出现了两次,因此有13types或者12types,倘若再把they和their当做一个,则为11types,这些都依赖于具体的规则。

N:token数

V:词汇集合,|V| 则代表词汇量


上图分别展示了三个语料库中的N和|V|(中间一行貌似是统计莎士比亚作品中的单词和词汇量)


1.2.2 Issues in Tokenization (切词中的各种问题)

在语言中有很多习以为常的形式如 连写、引号、dot、dash等

如下面的几种情形:

what're, I'm, isn't    ---------------->  这种情况好处理,拆分为what are, I am, is not.

Hewlett-Packard   ----------------->  拆成Hewlett Packard可以吗?(问号代表没有定论)

Lowercase             ----------------->  lower-case  lowercase lower case ?

San Francisco       ----------------->  one token or two?

m.p.h.,  PhD.          ----------------->  ??

不仅是英语,其他语言也有各种问题。如法语中L'ensenble ----> one token or two? 德语中的名词复合词是没有分割符的,如:Lebensversicherungsgesellschaftsangestellter(小白表示完全不懂什么意思)。汉语和日语字与字之间也是连在一起的。


下面介绍一下汉语的切词.

汉语的切词(word tokenization in Chinese)又称为Word Segmentation。汉语中每个词由n个字构成,n的平均值2.4,即每个词大概有2.4个字组成。

汉语切词采用”Maximum Matching"(最大匹配)算法,过程如下:

事先有一张汉语词汇表,以及一个句子。

Step 1. 起始指针指向句子的开头。

Step 2. 找到词汇表中匹配的最大的单词,设置一个分隔。

Step 3. 指针跳到分隔后,继续执行Step 2.循环。

例:莎拉波娃现在居住在美国东南部的弗罗里达。

莎拉波娃    现在    居住    在    美国    东南部    的    佛罗里达

当然,还有更先进的probabilistic segmentation algorithms (我直译为“概率分割法”,估计后面会讲到),效果更好。


1.3 Word Normalization and Stemming(单词归一化和词干)


1.3.1 Normalization(归一化)

我们需要normalize单词的形式,比如说在IR(信息检索)中,indexed text(索引)和query terms(查询条目)必须有相同的形式,像U.S.A和USA。

我们经常会需要隐式地定义一些单词的等价形式,方法通常是把句号去掉,比如说上面的U.S.A和USA。

当然我们也会遇到“输入的单词”和“想要搜索的单词”不等价的情况(antisymmetirc expansion),比如说输入“window”而搜索“window或者windows”,输入“windows”搜索“Windows,windows,window”,这使得搜索变得很负责,所以我们还是尽可能使用等价(symmetric expansion)的和简单的扩展方法。


1.3.2 Case folding(小写化)

在一些应用比如说IR中,我们通常需要把所有单词都转为小写形式,因为大多数用户都倾向于使用小写。但也存在一些例外,比如,当我们在句子中间遇到大些字母如General Motors,Fed(Federal Reserve Bank)或者SAIL(Stanford Artificial Intelligence Lab),我们很可能想要保持住它原有的大些形式。

对于sentiment analysis(情感分析),MT(机器翻译)和Information extraction(信息提取)中,大小写很关键,比如说US和us完全不同。


1.3.3 Lemmatization(单词的变形)

通常我们也会使用变形来把单词变成其基本形式,如:

am, are, is -> be

car, cars, car's, cars' -> car

the boy's cars are different colors -> the boy car be different color

因此一般来说,lemmatization的任务就是找到一个准确的字典上有的单词的形式。


1.3.4 Morphology(词法)

Morphology是研究Morphemes(词素——构成单词的最小单元)的。

Stems(词根)

Affixes(词缀)

如stems这个单词中,’stem‘是词根,末尾的's'是词缀。


1.3.5 Stemming

Stemming即把单词的形式删除词缀,转化为其词根的过程,如

automate(s), automatic, automation -> automat

for example compressed and compression are bothaccepted as equivalent to compress -> forexampl compress and compress ar both accept as equival to compress


1.3.6 Porter's algorithm(波特算法,英语中最常见的stemming方法)



如上图所示,当动词+ing时要把ing省去。


1.3.7 实践

在linux系统或者mac的终端敲入如下代码,寻找符合条件的以ing结尾的单词,shakes.txt是所使用的文本文件,读者可自行寻找一个英语文档当作待处理的文本。

tr -sc 'A-Za-z' '\n' < shakes.txt        |         tr 'A-Z' 'a-z'         |             grep 'ing$'             |      sort      |     uniq -c                    |       sort  -n  -r    |     less

        

非字母转为换行  待处理文本         |    大写字母转为小写 |     寻找所有结尾为ing的单词 | 排序  |      相同的合并并计数  |       按照个数排序  |   显示

显示效果如下图所示:




1.4 Sentence Segmentation(句子分割)

关于句子分割,我们都知道一些约定俗成的规则。

首先,感叹号!和问号?是明显的句子结尾,而 . 则不一定,比如说.02%、4.3等情况。因此,我们需要建立一个binary classifier(二元分类器)对句号 . 进行处理,典型的方法是Decision Tree(决策树),如下图判断一个单词是不是到了句子的末尾(E-O-S)。


上面的决策树很简单,假如想要使判断更加准确,就需要引入更多的特性,设置更多的if-then-else语句,相应的决策树也更加复杂。

对features进行分类,除了决策树,还有其他分类器,如Logistic regression(逻辑回归)、SVM、Neural Nets(神经网络)等等,以后会讲到。




原创粉丝点击