初识nlp (1 (分词
来源:互联网 发布:ubuntu切换root用户 编辑:程序博客网 时间:2024/05/16 12:47
1 nltk知识
Python上著名的自然语处理库。带语料库,词性分类库。 带分类,分词,等等功能
pip install -U nltk
安装语料库
import nltk nltk.download()
简易处理流程图
2 tokenize分词
>>> import nltk >>> tokens = nltk.word_tokenize(“hello, world" ) >>> tokens ['hello', ‘,', 'world']
中文分词与英文有差别 :今天 today
中文分词可用 jieba
例子
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)
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
但tokenize会遇到不好办的时候,遇到表情或是html等
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']
http://www.regexlab.com/zh/regref.htm 详情
需要用到正则表达式
[0-9a-zA-Z_]可以匹配一个数字、字母或者下划线;
[0-9a-zA-Z_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如’a100’,’0_Z’,’Py3000’等等;
[a-zA-Z_][0-9a-zA-Z_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;
[a-zA-Z_][0-9a-zA-Z_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
(P|p)ython可以匹配’Python’或者’python’
^表示行的开头,^\d表示必须以数字开头。
python中用 re模块使用正则表达式
切分字符串
用正则表达式切分字符串比用固定的字符更灵活,请看正常的切分代码:
>>> 'a b c'.split(' ')['a', 'b', '', '', 'c']
正则
>>> re.split(r'\s+', 'a b c')['a', 'b', 'c']
>>> re.split(r'[\s\,\;]+', 'a,b;; c d')['a', 'b', 'c', 'd']
用()表示的就是要提取的分组(Group)
m = re.match(r’^(\d{3})-(\d{3,8})$’, ‘010-12345’)
m
<_sre.SRE_Match object; span=(0, 9), match=’010-12345’>
m.group(0)
‘010-12345’
m.group(1)
‘010’
m.group(2)
‘12345’
正则表达式\d+默认贪婪匹配 用\d+? 非贪婪
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()('1023', '00')
在此 对社交网络语言 tokenize
import rer'<[^>]+>', # HTML tagsr'(?:@[\w_]+)', # @某⼈r"(?:\#+[\w_]+[\w\'_\-]*[\w_]+)", # 话题标签r'http[s]?://(?:[a-z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+', # URLsr'(?:(?:\d+,?)+(?:\.?\d+)?)', # 数字r"(?:[a-z][a-z'\-_]+[a-z])", # 含有 - 和 ‘ 的单词r'(?:[\w_]+)', # 其他r'(?:\S)' # 其他
tokens_re = re.compile(r'('+'|'.join(regex_str)+')', re.VERBOSE | re.IGNORECASE)emoticon_re = re.compile(r'^'+emoticons_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 emoticon_re.search(token) else token.lower() for token in tokens] return tokenstweet = 'RT @angelababy: love you baby! :D http://ah.love #168cm'print(preprocess(tweet))# ['RT', '@angelababy', ':', 'love', 'you', 'baby', # ’!', ':D', 'http://ah.love', '#168cm']
用正则表达式 tokenize 网络语言
3、词性归一(对英文有需要
Stemming 就是把不影响词性的inflection的尾巴砍掉
walking 砍ing = walk
Lemmatization 词形归一:把各种类型的词的变形,
went 归一 = go
NLTK实现Stemming
>>> from nltk.stem import SnowballStemmer>>> snowball_stemmer = SnowballStemmer(“english”)>>> snowball_stemmer.stem(‘maximum’)u’maximum’>>> snowball_stemmer.stem(‘presumably’)u’presum’
NLTK实现Lemma
>>> from nltk.stem import WordNetLemmatizer>>> wordnet_lemmatizer = WordNetLemmatizer()>>> wordnet_lemmatizer.lemmatize(‘dogs’)u’dog’>>> wordnet_lemmatizer.lemmatize(‘churches’)u’church’
>>> wordnet_lemmatizer.lemmatize(‘is’, pos=’v’)u’be’
词性默认n,加上pos=v,将词性改成v
NLTK标注POS
>>> import nltk>>> text = nltk.word_tokenize('what does the fox say')>>> text['what', 'does', 'the', 'fox', 'say']>>> nltk.pos_tag(text)[('what', 'WDT'), ('does', 'VBZ'), ('the', 'DT'), ('fox', 'NNS'), ('say', 'VBP')]
NLTK去除stopwords
首先下载词库 nltk.download(‘stopwords’)
from nltk.corpus import stopwords# 先token⼀把,得到⼀个word_list# 然后filter⼀把filtered_words = [word for word in word_list if word not in stopwords.words('english')]
4、简单应用
情感分析
配上ML的情感分析
文本相似度
元素频率表达本特征
# 借⽤NLTK的FreqDist统计⼀下⽂字出现的频率fdist = FreqDist(tokens)# 最常用的50个单词拿出来standard_freq_vector = fdist.most_common(50)# Func: 按照出现频率⼤⼩, 记录下每⼀个单词的位置def position_lookup(v): res = {} counter = 0 for word in v: res[word[0]] = counter counter += 1 return res# 把标准的单词位置记录下来standard_position_dict = position_lookup(standard_freq_vector)print(standard_position_dict)# 得到⼀个位置对照表# {'is': 0, 'the': 3, 'day': 4, 'this': 1,# 'sentence': 5, 'my': 2, 'life': 6}
文本分类
TF: Term Frequency, 衡量⼀个term在⽂档中出现得有多频繁。
TF(t) = (t出现在⽂档中的次数) / (⽂档中的term总数).
IDF: Inverse Document Frequency, 衡量term有多重要。
把罕见的词的重要性(weight)高,
把常见词的重要性低。
IDF(t) = log_e(文档总数 / 含有t的文档总数).
TF-IDF = TF * IDF
from nltk.text import TextCollection# 自动帮你断句, 做统计, 做计算corpus = TextCollection(['this is sentence one', 'this is sentence two', 'this is sentence three'])# 直接就能算出tfidf# (term: 一句话中的某个term, text: 这句话)print(corpus.tf_idf('this', 'this is sentence four'))# 0.444342# 对于每个新句⼦new_sentence = 'this is sentence five'# 遍历一遍所有的vocabulary中的词:for word in standard_vocab: print(corpus.tf_idf(word, new_sentence)) # 会得到(=所有vocab长度)的向量
- 初识nlp (1 (分词
- NLP分词
- NLP分词
- NLP-汉语分词
- NLP:中文分词
- nlp技能,jieba分词
- NLP一些基本概念初识
- 【NLP】中文分词:原理及分词算法
- NLP中的中文分词技术
- NLP 最近常用分词工具
- NLP中的并行分词方法
- NLP(一) Ansj 分词
- 初识nlp word2vec实战1 英语文本分析
- 中文分词技术初识
- 初识中文分词
- 【python 走进NLP】 NLP 使用jieba分词处理文本
- NLP中文信息处理---正向最大匹配法分词
- 【原创】NLP中的中文分词技术
- LeetCode 142. Linked List Cycle II(C++版)
- jar包的命令及实例(详)
- 剑指offer(Java实现)
- 51nod 1785 数据流中的算法
- 离线数据模拟实时数据的技术探索
- 初识nlp (1 (分词
- Potential misconfiguration detected. Fix and restart Hue. 解决办法
- 超轻便的 Cache_Lite 文件缓存
- HC-05蓝牙模块配置方法
- 三层架构与MVC
- 说说自己对ssm整合的看法
- L2-006. 树的遍历
- 简单粗暴的实现背景图无限循环滚动
- Java基础知识之集合操作