Python 自然語言處理(基於jieba分詞和NLTK)
----------歡迎加入學習交流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教程
相關文章
- 自然語言處理之jieba分詞自然語言處理Jieba分詞
- 自然語言處理:分詞方法自然語言處理分詞
- 【自然語言處理篇】--以NLTK為基礎講解自然語⾔處理的原理和基礎知識自然語言處理
- 詞!自然語言處理之詞全解和Python實戰!自然語言處理Python
- Python自然語言處理實戰(3):中文分詞技術Python自然語言處理中文分詞
- NLP自然語言處理中的hanlp分詞例項自然語言處理HanLP分詞
- 自然語言處理中的分詞問題總結自然語言處理分詞
- NLP自然語言處理 jieba中文分詞,關鍵詞提取,詞性標註,並行分詞,起止位置,文字挖掘,NLP WordEmbedding的概念和實現自然語言處理Jieba中文分詞詞性標註並行
- Python自然語言處理Python自然語言處理
- 基於 Python 的簡單自然語言處理實踐Python自然語言處理
- Python自然語言處理 5 分類和標註詞彙Python自然語言處理
- Python自然語言處理 1 語言處理與PythonPython自然語言處理
- 自然語言處理NLP(6)——詞法分析自然語言處理詞法分析
- [Python] 基於 jieba 的中文分詞總結PythonJieba中文分詞
- 精通Python自然語言處理 4 :詞性標註--單詞識別Python自然語言處理詞性標註
- Python自然語言處理 6 學習分類文字Python自然語言處理
- jieba與nltk結合處理評論(一)Jieba
- 自然語言處理工具pyhanlp分詞與詞性標註自然語言處理HanLP分詞詞性標註
- Python自然語言處理 3 處理原始文字Python自然語言處理
- 基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理機器學習演算法自然語言處理
- Python自然語言處理實戰(1):NLP基礎Python自然語言處理
- 基於圖深度學習的自然語言處理方法和應用深度學習自然語言處理
- 入門自然語言處理必看:圖解詞向量自然語言處理圖解
- Pyhanlp自然語言處理中的新詞識別HanLP自然語言處理
- NPL---自然語言處理單詞界定問題自然語言處理
- 自然語言處理(NLP)自然語言處理
- 【Python】jieba分詞模組PythonJieba分詞
- 全棧 - 17 NLP 使用jieba分詞處理文字全棧Jieba分詞
- 中文自然語言處理工具集:分詞,相似度匹配自然語言處理分詞
- Hanlp自然語言處理中的詞典格式說明HanLP自然語言處理
- 精通Python自然語言處理 2 :統計語言建模Python自然語言處理
- 自然語言處理(NLP)系列(一)——自然語言理解(NLU)自然語言處理
- 自然語言處理(NLP)概述自然語言處理
- 自然語言處理NLP(四)自然語言處理
- 精通Python自然語言處理 1 :字串操作Python自然語言處理字串
- 【精讀】自然語言處理基礎之RNN自然語言處理RNN
- 自然語言處理工具HanLP-N最短路徑分詞自然語言處理HanLP分詞
- 自然語言處理工具中的中文分詞器介紹自然語言處理中文分詞