由于工作需要,俺近期一直在学习自然语言处理相关的技术。主要是看英文资料,包括经典书籍,论文,网页博客之类。不得不说,俺感觉这个领域有点黑啊! 因为没有很好的快速入门资料,要么你得慢慢啃二三百页的书,要么就是看看论文里说的天花乱坠,各种基本概念直接用,啥也看不懂。中文资料少,英文资料看得又慢。在这个老板今天要你学新技术明天就得出设计图的坑爹时代,哪有时间啃砖头啊?这是要把俺们这种零基础的人往绝路上逼啊!
所以在俺痛苦挣扎之后,决定要帮助可怜的同行们开辟一条活路,把俺学习的东西总结一下,以后好应付老板那厮们。不过丑话说在前头,俺学的是英文语言的处理,对中文的不熟,所以这里讲的概念都是以英文为基础的,纯是因为工作需要,鸟人们别说俺不爱国啥的,跟那没关系。
废话少说,直接进入正题:
1. 分词 (Tokenization)
NLP里最基础的概念了,一切都从这里开始。Token就是符号,包括单词和标点两种。Tokenization就是把一句话或者一段话分解成单个的单词和标点。比如说:
I hate my boss.
这句话,分词之后就成了:
['I', 'hate', 'my', 'boss', '.']
这样一个五元数组。注意最后的句点也算啊。
2. 词干提取 (Stemming)
把各种词形统一到一个基础词形。英文单词有各种单数,复数,时态等等变化,比如:
run 就有 run, runs, running, ran; take 有 take, takes, taking, taken, took 等等不同的形态。洋鬼子懒,能用现成的词就不发明新词了,哪像我们苦逼的,啊不是,勤劳的老祖宗仓颉任劳任怨,绝不偷懒。所以给你一句洋文,你的处理程序要处理其中各种单词的各种可能形态,这明显是坑爹。为了让我们码农的日子好过一点,我们就发明了一个简单粗暴的方法:
不管你句子里的词是什么形态,老子的字典里就一种形态:基本型,老子没时间考虑什么过去式,单复数,就那鸟老板给的那点工资还让我考虑什么形态?开玩笑!爱谁谁全都得给我归到基本型!怎么做?简单,英文单词的形态变化不都是加个词缀什么的吗?词缀不就是那么些个吗?什么s, es,ed, d, ing的,搞个列表把所有词缀都加进来,然后不管什么单词,只要是以这些词缀结尾的,统统给我删掉就行了。什么?这种方法有漏洞?像took, takes这种词会误操作成took,tak? 那我就不管了,除非老板给涨工资,就这么着吧。NLTK里讲了两个做Stemming的软件(Stemmer): Porter Stemmer 和 Lancaster Stemmer。看看实例吧,这个是nltk给的例子:
|
乱七八糟的一堆句子, 就当是单词的集合好了,不用考虑句子含义.
Porter Stemmer 做的结果是:
|
不怎么样啊, 人名Dennis都给人家砍了个s, strange 也处理成了strang, lying倒是正确处理成了lie,还算有点用。
再来看看 Lancaster Stemmer吧:
['den', ':', 'list', ',', 'strange', 'wom', 'lying', 'in', 'pond', 'distribut','sword', 'is', 'no', 'bas', 'for', 'a', 'system', 'of', 'govern', '.', 'suprem','execut', 'pow', 'der', 'from', 'a', 'mand', 'from', 'the', 'mass', ',', 'not','from', 'som', 'farc', 'aqu', 'ceremony', '.']
这个更牛,den是什么?dennis的爱称?这个俺得研究一下。listen直接成了list, women成了wom, 一塌糊涂啊。