通常,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