原料文本加工
1.电子书
# 导入
url = 'http://address/'
raw = urllib.urlopen(url).read() # out put strings
# 分词 (除去空格/换行符等;产生词汇和标点符号的list)
tokens = nltk.word_tokenize(raw)
# 可以创建nltk文本,进行相关nltk封装操作
text = nltk.Text(tokens)
# 网络文本可能含有不需要的收集信息比如许可证等。需要人工用find等定位,切片
2.html
注:nltk.clean_html已经不能使用,用BeautifulSoup.get_text代替
#导入
url = 'http://address/'
html = urlopen(url).read() #包含有meta元/图像标签/map标签等
#从html中提取文本信息
from bs4 import BeautifulSoup
raw = BeautifulSoup(html)
tokens = nltk.word_tokenize(raw.get_text())
3. NLP流程
字符串处理
1. 链表与字符串区别
字符串for循环不能选择粒度/list可以
一般操作是将一个字符串分词放入一个字符串list中
将结果写入一个文件或终端时,格式化为一个字符串
字符串不可修改
2.Unicode进行文字处理
import codes # 可以将文件进行unicode导入和写出
f = codes.open('/.txt', encoding = 'latin2')
#unicode_escape是虚拟编码, 将所有非ASCII字符转化成unicode格式
import unicodedata # 可以检查unicode字符属性
#相关re module 和其他简单操作不再记录
3. 使用正则表达式检测词组搭配
不要忘记\ , {}, (), |
# 提取字符块
import re
re.findall(r'regexp', word) #找到所有满足regexp的字符
# 查找词干
def stem(word):
regexp = r'^(.*?)(ing|ly|ed|ious|ies|ive|es|s|ment)?$'
stem, tuffix = re.findall(regexp, word)[0]
return stem
# 搜索已分词文本
mody = nltk.Text(corpus.words('txt'))
mody.findall(r''<a> (<.*>) <man>'') #返回中间词,e.g. naive
mody.findall(r''<.*>,<.*>,<bro>") #返回以bro结尾的三个词。
规范化文本
- 去掉词缀
- 提取词干
词形归并
词干提取器
一般而言,优先适用NLTK中的词干提取器而非正则表达式过滤。
class IndexedText(object): def __init__(self, stemmer, text): self._text = text self._stemmer = stemmer self._index = nltk.Index((self._stem(word), i) for (i, word) in enumerate(text)) def concordance(self, word, width=40): key = self._stem(word) wc = width/4 for i in self._index[key]: lcontext = ' '.join(self._text[i-wc:i]) rcontext = ' '.join(self._text[i: i+wc]) ldisplay = '%*s' % (width,lcontext[-width:]) rdisplay = '%-*s' % (width, rcontext[:width]) print ldisplay, rdisplay def _stem(self, word): return self._stemmer.stem(word).lower()