通常,NLP无法一下子处理完整的段落或句子,因此,第一步往往是分句和分词
分词的话,对于英语句子,可以使用NLTK中的word_tokenize函数,对于中文句子,则可使用jieba模块
语料及词性标注
词性标注就是给每个词打上词类标签,如形容词、动词、名词等
常见的中文词性编码
词性标注的分类
词性标注的方法
NLTK
Jieba (中文)
NLTK
import nltk from nltk import data text = nltk.word_tokenize("And now for something completely different") print(text) print(nltk.pos_tag(text))
Jieba
只要你想做中文的分词,jieba分词肯定要用到,不用怀疑
import jieba.posseg as pseg words = pseg.cut('我爱北京天安门') for word,flag in words: print('%s %s'%(word, flag))
分词
把句子切分成词
分词难点
①分词标准
②切分歧义
切分歧义是由于分词细粒度不同造成的
或者这个句子本身就真正存在歧义
③新词
分词工具也要更新迭代
分词的算法
①基于词典的分词算法
②基于统计的分词算法
TF-IDF
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。
TF是词频(Term Frequency),IDF是逆文本频率指数(Inverse Document Frequency)。
TF-IDF实际上就是:TF * IDF
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降
TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类
TF-IDF的计算
即
TF-IDF的作用
提取文本向量的特征
TF-IDF也有缺点
用词频来衡量文章中一个词的重要性不够全面
因为有些关键词可能就出现几次,但是对文章来说其重要性却是非常大的
sklearn可以用TF-IDF
from sklearn.feature_extraction.text import TfidfTransformer from sklearn.feature_extraction.text import CountVectorizer #语料 corpus = ["I come to China to travel", "This is a car popular in China", "I love tea and Apple", "The work is to write some papers in science"] vectorizer = CountVectorizer() #将文本中的词语转换为词频矩阵。 transformer = TfidfTransformer() #TfidfTransformer用于统计vectorizer中每个词语的TF-IDF值 tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus)) #fit_transform函数计算各个词语出现的次数 print(tfidf)
NLTK可以用TF-IDFimport nltk from nltk.text import TextCollection sents = ['this is sentence one', 'this is sentence two', 'this is sentence three'] corpus = TextCollection(sents) #计算tf print(corpus.tf('three', nltk.word_tokenize('one two three, go'))) #0.2 # 1/5 #之前上面已将全部的语料库fit进corpus去,计算 idf 只需传递要计算的 word 即可: #计算idf print(corpus.idf('this')) #0.0 # log(3/3) print(corpus.idf('three')) #1.0986122886681098 # log(3/1) #计算tf-idf print(corpus.tf_idf('three', nltk.word_tokenize('one two three, go'))) #0.21972245773362198 # 0.2 * 1.0986122886681098