NLP理论基础
语料库
NLTK : pip install nltk
http://www.nltk.org//
(40条消息) NLTK安装方法_一脑子RMC136的博客-优快云博客_nltk安装教程
文本处理流程
句子→预处理→分词(Tokenize)→特征工程(make features)→机器学习(machine learning)
分词(Tokenize)
把长句子拆成“有意义”的小部件
英文
from nltk.tokenize import word_tokenize
sentences = 'hello world'
token = word_tokenize(sentences)
print(token)
['hello', 'world']
中文
import jieba
seg_list = jieba.cut('我到北京清华大学',cut_all=True)
print('full mode:','/'.join(seg_list)) # 全模式
seg_list = jieba.cut('我到北京清华大学',cut_all=False)
print('default mode:','/'.join(seg_list)) # 精确模式
seg_list = jieba.cut('我到北京清华大学')
print('/'.join(seg_list)) # 默认精确模式
seg_list = jieba.cut_for_search('我到北京清华大学')
print('/'.join(seg_list)) # 搜素引擎模式
full mode: 我/到/北京/清华/清华大学/华大/大学
default mode: 我/到/北京/清华大学
我/到/北京/清华大学
我/到/北京/清华/华大/大学/清华大学
预处理
社交语言
举例:
from nltk.tokenize import word_tokenize
tweet = 'RT @angelababy : love you baby! :D http://ah.love #168cm'
print(word_tokenize(tweet))
['RT', '@', 'angelababy', ':', 'love', 'you', 'baby', '!', ':', 'D', 'http', ':', '//ah.love', '#', '168cm']
如何做呢?
import re :正则表达式 → 常用于字符串处理
对照表:http://www.regexlab.com/zh/regref.htm
#### re.compile 是变为方法 去判定,符合条件的筛选出来
import re
emotions_str = r"""
(?:
[:=;] # 眼睛
[oO\-]? # 鼻子
[D\)\]\<\]/\\OpP] # 嘴
)"""
# []表示里面任何一个都可以,[]?表示可存在可不存在
regex_str = [
emotions_str,
r'<[^>]+>', # HTML tags
r'(?:@[\w_]+)', # @某人
r"(?:\#+[\w_]+[\w\'_\-]*[\w_]+)", # 话题标签
r'http[s]?://(?:[a-z][0-9]|[$-_@.&:+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+', # URLs
r'(?:(?:\d+,?)+(?:\.?\d+)?)', # 数字
r"(?:[a-z][a-z'\-_]+[a-z])", # 含有-和‘的单词
r'(?:[\w_]+)', # 其他
r'(?:\s)', # 其他
]
emotion_re = re.compile(r'^'+emotions_str+'$',re.VERBOSE | re.IGNORECASE)
tokens_re = re.compile(r'('+'|'.join(regex_str)+')',re.VERBOSE | re.IGNORECASE)
def tokenize(s):
return tokens_re.findall(s)
def preprocess(s, lowercase=False):
tokens = tokenize(s)
if lowercase:
tokens = [token if emotion_re.search(token) else token.lower() for token in tokens]
return tokens
tweet = 'RT @angelababy: love you baby! :D http://ah.love #168cm'
print(preprocess(tweet))
['RT', ' ', '@angelababy', ' ', 'love', ' ', 'you', ' ', 'baby', ' ', ':D', ' ', 'http://ah.love', ' ', '#168cm']
纷繁复杂的词性
- Inflection(不影响词性):walk→walking→walked
- derivation(影响词性):nation(noun)→national(objective)→nationalize(verb)
Stemming词干提取
一般来说,就是把不影响词性的inflection的小尾巴砍掉——词根
walking→walk、walked→walk
PorterStemmer
from nltk.stem.porter import PorterStemmer
P = PorterStemmer() # 类调用之前要初始化
print(P.stem('maximum'))
print(P.stem('walking'))
maximum
walk
SnowballStemmer
from nltk.stem import SnowballStemmer
S = SnowballStemmer('english')
print(S.stem('maximum'))
print(S.stem('walking'))
maxim
walk
LancasterStemmer
from nltk.stem.lancaster import LancasterStemmer
L = LancasterStemmer()
print(L.stem('maximum'))
print(L.stem('walking'))
maxim
walk
Lemmatization词形归一
把各种类型的词的变形,都归为一个形式——语料库
went→go、are→be
需要经常更新
from nltk.stem import WordNetLemmatizer
W = WordNetLemmatizer()
print(W.lemmatize('went',pos='v'))
print(W.lemmatize('are',pos='v'))
go
be
词性标注
import nltk
text = nltk.word_tokenize('what does the fox say')
print(text)
tag = nltk.pos_tag(text)
print(tag)
<