NLP流程
对于自然语言的处理,对问题的预处理可以用下图来表示,不管文本从哪里来本地或者网络,清理html,分词,取得vocab。
清理html
在原书中提供了一个nltk.clean_html()函数,但是这个函数已经过时了,现在我们会使用BeautifulSoup库来代替。
例如,课后习题第20题:编写代码来访问喜爱的网页,并从中提取一些文字。例如,访问一个天气网,提取你所在的城市的温度。现在我们以上海市为例,获取上海当天的温度情况。代码如下:
from bs4 import BeautifulSoup
from urllib.request import urlopen
def tem(http):
htbyte=urlopen(http).read() ###爬取网站
html=htbyte.decode('utf-8')
soup=BeautifulSoup(html,'lxml') ##使用BeautifulSoup
ul=soup.find('ul',attrs={'class':'t clearfix'})
soup_tem=BeautifulSoup(str(ul),'lxml')
tem=soup.find('p',attrs={'class':'tem'})
text=tem.get_text()
print('上海市今日温度:',text)
http=r'http://www.weather.com.cn/weather/101020100.shtml'
tem(http)
分词
对于英文来说,分词通常指的是提取单词,比起中文分词来说较为容易。NLTK的正则表达式分词器
函数nltk.regexp_tokenize()和re.findall()类型,但是nltk.regexp_tokenize()分词效率更高,避免了括号的特殊处理的需要。为了增加可读性,将正则表达式分为几行写,每一行添加一个解释。(?x)‘Verbose’标志告诉Python去掉嵌入的注释和空格
>>> text = 'That U.S.A. poster-print costs $12.40...'
>>> pattern = r'''(?x) # set flag to allow verbose regexps
... ([A-Z]\.)+ # abbreviations, e.g. U.S.A.
... | \w+(-\w+)* # words with optional internal hyphens
... | \$?\d+(\.\d+)?%? # currency and percentages, e.g. $12.40, 82%
... | \.\.\. # ellipsis
... | [][.,;"'?():-_`] # these are separate tokens; includes ], [
... '''
>>> nltk.regexp_tokenize(text, pattern)
['That', 'U.S.A.', 'poster-print', 'costs', '$12.40', '...']
通过正则表达式可以对英文做非常多的处理,根据英文词性的关系,可以很方便的提取词干,
re.findall(r'^(.*?)(ing|ly|ed|ious|ies|ive|es|s|ment)$', 'processes')