Python 自然語言處理(基於jieba分詞和NLTK)
阿新 • • 發佈:2018-12-22
----------歡迎加入學習交流QQ群:657341423
自然語言處理是人工智慧的類別之一。自然語言處理主要有那些功能?我們以百度AI為例
從上述的例子可以看到,自然語言處理最基本的功能是詞法分析,詞法分析的功能主要有:
- 分詞分句
- 詞語標註
- 詞法時態(適用於英文詞語)
- 關鍵詞提前(詞幹提取)
由於英文和中文在文化上存在巨大的差異,因此Python處理英文和中文需要使用不同的模組,中文處理推薦使用jieba模組,英文處理推薦使用nltk模組。模組安裝方法可自行搜尋相關資料。
英文處理
import nltk f = open('aa.txt','r',encoding='utf-8') text = f.read() f.close() ---------- # sent_tokenize 文字分句處理,text是一個英文句子或文章 value = nltk.sent_tokenize(text) print(value) # word_tokenize 分詞處理,分詞不支援中文 for i in value: words = nltk.word_tokenize(text=i) print(words) ---------- # pos_tag 詞性標註,pos_tag以一組詞為單位,words是列表組成的詞語列表 words = ['My','name','is','Lucy'] tags = nltk.pos_tag(words) print(tags) ---------- # 時態,過去詞,進行時等 # 詞語列表的時態復原,如果單詞是全變形的無法識別 from nltk.stem import PorterStemmer data = nltk.word_tokenize(text="worked presumably goes play,playing,played",language="english") ps = PorterStemmer() for w in data: print(w,":",ps.stem(word=w)) # 單個詞語的時態復原,如果單詞是全變形的無法識別 from nltk.stem import SnowballStemmer snowball_stemmer = SnowballStemmer('english') a = snowball_stemmer.stem('plays') print(a) # 複數復原,如果單詞是全變形的無法識別 from nltk.stem import WordNetLemmatizer wordnet_lemmatizer = WordNetLemmatizer() a = wordnet_lemmatizer.lemmatize('leaves') print(a) ---------- # 詞幹提取,提前每個單詞的關鍵詞,然後可進行統計,得出詞頻 from nltk.stem.porter import PorterStemmer porter = PorterStemmer() a = porter.stem('pets insurance') print(a) ---------- from nltk.corpus import wordnet word = "good" # 返回一個單詞的同義詞和反義詞列表 def Word_synonyms_and_antonyms(word): synonyms = [] antonyms = [] list_good = wordnet.synsets(word) for syn in list_good: # 獲取同義詞 for l in syn.lemmas(): synonyms.append(l.name()) # 獲取反義詞 if l.antonyms(): antonyms.append(l.antonyms()[0].name()) return (set(synonyms), set(antonyms)) # 返回一個單詞的同義詞列表 def Word_synonyms(word): list_synonyms_and_antonyms = Word_synonyms_and_antonyms(word) return list_synonyms_and_antonyms[0] # 返回一個單詞的反義詞列表 def Word_antonyms(word): list_synonyms_and_antonyms = Word_synonyms_and_antonyms(word) return list_synonyms_and_antonyms[1] print(Word_synonyms(word)) print(Word_antonyms(word)) ---------- # 造句 print(wordnet.synset('name.n.01').examples()) # 詞義解釋 print(wordnet.synset('name.n.01').definition()) ---------- from nltk.corpus import wordnet # 詞義相似度.'go.v.01'的go為詞語,v為動詞 # w1 = wordnet.synset('fulfil.v.01') # w2 = wordnet.synset('finish.v.01') # 'hello.n.01'的n為名詞 w1 = wordnet.synset('hello.n.01') w2 = wordnet.synset('hi.n.01') # 基於路徑的方法 print(w1.wup_similarity(w2))# Wu-Palmer 提出的最短路徑 print(w1.path_similarity(w2))# 詞在詞典層次結構中的最短路徑 print(w1.lch_similarity(w2))# Leacock Chodorow 最短路徑加上類別資訊 # 基於互資訊的方法 from nltk.corpus import genesis # 從語料庫載入資訊內容 # brown_ic = wordnet_ic.ic('ic-brown.dat') # nltk自帶的語料庫建立資訊內容詞典 genesis_ic = wordnet.ic(genesis,False,0.0) print(w1.res_similarity(w2,genesis_ic)) print(w1.jcn_similarity(w2,genesis_ic)) print(w1.lin_similarity(w2,genesis_ic))
由於上述的方法是建立在語料庫中,有時候一些不被記錄的單詞可能無法識別或標註。這時候需要自定義詞性標註器,詞性標註器的型別有幾種,具體教程可以看——>自定義詞性標註器
中文處理
import jieba import jieba.analyse f = open('aa.txt','r',encoding='utf-8') text = f.read() f.close() ---------- # 分詞 seg_list = jieba.cut(text, cut_all=True) print("Full Mode: " + "/ ".join(seg_list)) # 全模式 seg_list = jieba.cut(text, cut_all=False) print("Default Mode: " + "/ ".join(seg_list)) # 精確模式 seg_list = jieba.cut_for_search(text) # 搜尋引擎模式 print(", ".join(seg_list)) ---------- # 關鍵字提取 # 基於TF-IDF演算法的關鍵詞抽取 # sentence 為待提取的文字 # topK 為返回幾個 TF/IDF 權重最大的關鍵詞,預設值為 20 # withWeight 為是否一併返回關鍵詞權重值,預設值為 False # allowPOS 僅包括指定詞性的詞,預設值為空,即不篩選 keywords = jieba.analyse.extract_tags(sentence=text, topK=20, withWeight=True, allowPOS=('n','nr','ns')) # 基於TextRank演算法的關鍵詞抽取 # keywords = jieba.analyse.textrank(text, topK=20, withWeight=True, allowPOS=('n','nr','ns')) for item in keywords: print(item[0],item[1]) ---------- # 詞語標註 import jieba.posseg # 新建自定義分詞器,tokenizer 引數可指定內部使用的 jieba.Tokenizer 分詞器。jieba.posseg.dt 為預設詞性標註分詞器。 posseg = jieba.posseg.POSTokenizer(tokenizer=None) words = posseg.cut(text) for word, flag in words: print('%s %s' % (word, flag))
jieba分詞也是基於語料庫,我們可以對原有的語料庫新增詞語,或者匯入自定義的語料檔案,如下所示:
# 對原有的語料庫新增詞語
jieba.add_word(word, freq=None, tag=None)
# 匯入語料檔案
jieba.load_userdict('disney.txt')
語料檔案格式如下:每行分三個部分(用空格隔開),詞語 詞頻(可省) 詞性(可省)。ns是詞語標記,詞語和標註之間用空格隔開,txt檔案格式為uft-8
jieba更多教程——>jieba教程