前言
最近在看些自然语言处理的知识,这里分享下语言处理的过程。
一般而言,自然语言预处理包含分词、去停用词、权重计算等。
0x01 nltk库安装
这里以nltk库为例。nltk的全称是natural language toolkit,是一套基于python的自然语言处理工具集。
- 安装nltk库
pip install nltk
- 下载必要数据集
进入python终端。
import nltk
nltk.download()
运行后下载所需要的数据集,这里需要下载停用词数据集stopwords
0x02 分词
针对英文分词的方式有很多种,相对而言英文分词比较简单,中文由于词语之间没有明显特征,所以很复杂。
英文分词可以使用re正则模块或者调用nltk.regexp_tokenize函数。
示例如下:
word='this is a test simple!'
pattern = r"""(?x) # set flag to allow verbose regexps
(?:[A-Z]\.)+ # abbreviations, e.g. U.S.A.
|\d+(?:\.\d+)?%? # numbers, incl. currency and percentages
|\w+(?:[-']\w+)* # words w/ optional internal hyphens/apostrophe
|\.\.\. # ellipsis
# special characters with meanings
"""
text = nltk.regexp_tokenize(words, pattern)
0x03 去停用词
去除一些常用的停用词,这里是通过一些data集进行匹配去除。
选用停用词集stopwords
from nltk.corpus import stopwords
stopworddic = set(stopwords.words('english'))
text = [i for i in text if i not in stopworddic]
0x05 单词词干化(*非必须)
from nltk.stem.lancaster import LancasterStemmer
st = LancasterStemmer()
st.stem('stemmed') #=>'stem'
st.stem('stemming') #=>'stem'
0x06 词干抽取
将文本列表中的词语抽取其词干,以统一特征表征形式,特征降维以减少计算量。NLTK中提供了三种最常用的词干提取器接口,即 Porter stemmer, Lancaster Stemmer 和 Snowball Stemmer。抽取词的词干或词根形式(不一定能够表达完整语义)
>>> from nltk.stem.porter import PorterStemmer
>>> porter_stemmer = PorterStemmer()
>>> from nltk.stem.lancaster import LancasterStemmer
>>> lancaster_stemmer = LancasterStemmer()
>>> from nltk.stem import SnowballStemmer
>>> snowball_stemmer = SnowballStemmer(“english”)
>>> porter_stemmer.stem(‘maximum’)
u’maximum’
>>> lancaster_stemmer.stem(‘maximum’)
‘maxim’
>>> snowball_stemmer.stem(‘maximum’)
u’maximum’
>>> porter_stemmer.stem(‘presumably’)
u’presum’
>>> snowball_stemmer.stem(‘presumably’)
u’presum’
>>> lancaster_stemmer.stem(‘presumably’)
‘presum’
>>> porter_stemmer.stem(‘multiply’)
u’multipli’
>>> snowball_stemmer.stem(‘multiply’)
u’multipli’
>>> lancaster_stemmer.stem(‘multiply’)
‘multiply’
>>> porter_stemmer.stem(‘provision’)
u’provis’
>>> snowball_stemmer.stem(‘provision’)
u’provis’
>>> lancaster_stemmer.stem(‘provision’)
u’provid’
>>> porter_stemmer.stem(‘owed’)
u’owe’
>>> snowball_stemmer.stem(‘owed’)
u’owe’
>>> lancaster_stemmer.stem(‘owed’)
‘ow’
各有优劣,看具体文本情况。对于分类、聚类这样对于特征词语的具体形态没有要求的情况下,进行词干抽取虽然抽取后的词干可能无实际意义但是却会大大减少计算时间,提高效率。
0x07 词形还原
词形还原Lemmatization是把一个任何形式的语言词汇还原为一般形式(能表达完整语义)。相对而言,词干提取是简单的轻量级的词形归并方式,最后获得的结果为词干,并不一定具有实际意义。词形还原处理相对复杂,获得结果为词的原形,能够承载一定意义,与词干提取相比,更具有研究和应用价值。
from nltk.stem import WordNetLemmatizer
wordnet_lemmatizer = WordNetLemmatizer()
word = wordnet_lemmatizer.lemmatize('birds')
bird
nltk的lemmatization算法很鸡肋,基本可以理解为只有复数还原为单数形式,当然feet这样的非常态复数形式也可以实现,但是你要想形容词变名词,就不太怎么好使了。