Jieba庫實(shí)現(xiàn)詞性標(biāo)注及小說人物角色抽取
原創(chuàng):?HR和Python?大鄧和他的Python?今天
公眾號: 小葉葉學(xué)Python
4年人力資源從業(yè)經(jīng)驗(yàn),情報(bào)學(xué)碩士,主要內(nèi)容涵蓋python、數(shù)據(jù)分析和人力資源相關(guān)內(nèi)容
本文運(yùn)用自然語言處理技術(shù)稀拐,對中文小說《神雕俠侶》人物角色進(jìn)行抽取,為使用通過社會(huì)網(wǎng)絡(luò)分析法對人物關(guān)系進(jìn)行分析奠定基礎(chǔ),使文學(xué)研究者睬塌、社會(huì)學(xué)家和普通讀者對小說人物關(guān)系和背景有更全面的認(rèn)識
自然語言處理技術(shù)
自然語言處理(NLP)是一門融語言學(xué)、計(jì)算機(jī)科學(xué)歇万、數(shù)學(xué)于一體的科學(xué)揩晴。國外學(xué)者于20世紀(jì)40年代末至50年代初開始NLP相關(guān)的研究,近年來贪磺,隨著人工智能和計(jì)算機(jī)技術(shù)的發(fā)展硫兰,自然語言處理(NLP)已經(jīng)成為一個(gè)重要的人工智能發(fā)展方向,目前已廣泛的應(yīng)用于機(jī)器翻譯寒锚、問答系統(tǒng)劫映、文本分類、信息檢索刹前、自動(dòng)文本摘要等領(lǐng)域泳赋。中文的自然語言處理相對于英文還是有諸多差異的,英文是以空格來區(qū)分詞語腮郊,每一個(gè)單詞即是一個(gè)詞語摹蘑,而中文則是以字為字符單位,以詞語來表達(dá)意思轧飞,而且存在一詞多義衅鹿、多詞一義等情況,所以相對于英文來說过咬,中文的自然語言處理更為艱難大渤。分詞、詞性標(biāo)注掸绞、句法分析是中文自然語言處理的三大基本任務(wù)泵三,本文主要應(yīng)用分詞耕捞、詞性標(biāo)注兩類處理技術(shù)。
jieba庫基本介紹
jieba庫概述
jieba是優(yōu)秀的中文分詞第三方庫? 中文文本需要通過分詞獲得單個(gè)的詞語 jieba是優(yōu)秀的中文分詞第三方庫烫幕,需要額外安裝 jieba庫提供三種分詞模式俺抽,最簡單只需掌握一個(gè)函數(shù)
jieba分詞的原理
Jieba分詞依靠中文詞庫? 利用一個(gè)中文詞庫,確定漢字之間的關(guān)聯(lián)概率 漢字間概率大的組成詞組较曼,形成分詞結(jié)果 除了分詞磷斧,用戶還可以添加自定義的詞組
jieba庫的優(yōu)點(diǎn)
支持三種分詞模式:
精確模式,試圖將句子最精確地切開捷犹,適合文本分析弛饭;
全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非称记福快侣颂,但是不能解決歧義;
搜索引擎模式枪孩,在精確模式的基礎(chǔ)上憔晒,對長詞再次切分,提高召回率销凑,適合用于搜索引擎分詞丛晌。
安裝jieba:
命令行安裝方法
pip3 install jieba
jupyter notebook中的安裝方法
!pip3 install jieba
!pip3 install jieba
Requirement already satisfied: jieba in d:\ancanda3\lib\site-packages (0.39)
jieba庫常用函數(shù)
分詞
代碼功能
jieba.cut(s)精確模式,返回一個(gè)可迭代的數(shù)據(jù)類型
jieba.cut(s斗幼,cut_all=True)全模式澎蛛,輸出文本s中所有可能單詞
jieba.cut_for_search(s)搜索引擎模式,適合搜索建立索引的分詞
jieba.lcut(s)精確模式蜕窿,返回一個(gè)列表類型谋逻,常用
jieba.lcut(s,cut_all=True)全模式桐经,返回一個(gè)列表類型毁兆,常用
jieba.lcut_for_search(s)搜索引擎模式,返回一個(gè)列表類型阴挣,常用
jieba.add_word(w)向詞典中增加新詞
詞性標(biāo)注
Jieba0.39版本提供55種詞性標(biāo)注气堕,部分符號及含義如表1所示。由表1可知畔咧,人名被標(biāo)注為nr,因此對小說進(jìn)行分詞和詞性標(biāo)注后的文本進(jìn)行進(jìn)一步提取茎芭,提取出詞性為nr的詞作為人物角色名稱,即可構(gòu)建角色列表誓沸。
import jieba
text = '我來到北京清華大學(xué)'
wordlist = jieba.lcut(text)
wordlist
Building prefix dict from the default dictionary ...
Dumping model to file cache C:\Users\z\AppData\Local\Temp\jieba.cache
Loading model cost 1.717 seconds.
Prefix dict has been built succesfully.
['我', '來到', '北京', '清華大學(xué)']
jieba分詞的簡單應(yīng)用
使用 jieba 分詞對一個(gè)文本進(jìn)行分詞梅桩,統(tǒng)計(jì)長度大于2,出現(xiàn)次數(shù)最多的詞語拜隧,這里以《神雕俠侶》為例
import jieba
txt = open("神雕俠侶-網(wǎng)絡(luò)版.txt","r",encoding="utf-8").read()
words = jieba.lcut(txt)? ? # 使用精確模式對文本進(jìn)行分詞
counts = {}? ? # 通過鍵值對的形式存儲詞語及其出現(xiàn)的次數(shù)
for word in words:
? ? if len(word) == 1:? ? # 單個(gè)詞語不計(jì)算在內(nèi)
? ? ? ? continue
? ? else:
? ? ? ? counts[word] = counts.get(word, 0) + 1# 遍歷所有詞語宿百,每出現(xiàn)一次其對應(yīng)的值加 1
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)? ? # 根據(jù)詞語出現(xiàn)的次數(shù)進(jìn)行從大到小排序
for i in range(len(items)):
? ? word, count = items[i]
print("{0:<5}{1:>5}".format(word, count))
從小說中抽取出現(xiàn)的人名及次數(shù)
詞性標(biāo)注
Jieba0.39版本提供55種詞性標(biāo)注趁仙,部分符號及含義如表1所示。由表1可知垦页,人名被標(biāo)注為nr,因此對小說進(jìn)行分詞和詞性標(biāo)注后的文本進(jìn)行進(jìn)一步提取雀费,提取出詞性為nr的詞作為人物角色名稱,即可構(gòu)建角色列表外臂。
import jieba.posseg as psg
sent='中文分詞是文本處理不可或缺的一步坐儿!'
seg_list=psg.cut(sent)
for w in seg_list:
? ? if w.flag == "n":
? ? print(w.flag)
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\z\AppData\Local\Temp\jieba.cache
Loading model cost 1.535 seconds.
Prefix dict has been built succesfully.
n
n
jieba詞性標(biāo)注的簡單應(yīng)用
使用 jieba 分詞對一個(gè)文本進(jìn)行分詞及詞性標(biāo)注,統(tǒng)計(jì)詞性為nr宋光,出現(xiàn)次數(shù)最多的詞語,這里以《神雕俠侶》為例
import jieba
import jieba.posseg as psg
txt = open("神雕俠侶-網(wǎng)絡(luò)版.txt","r",encoding="utf-8").read()
words = psg.cut(txt)? ? # 使用精確模式對文本進(jìn)行分詞
counts = {}? ? # 通過鍵值對的形式存儲詞語及其出現(xiàn)的次數(shù)
for word in words:
? ? if len(word.word) == 1: # 單個(gè)詞語不計(jì)算在內(nèi)
? ? ? ? continue
? ? else:
? ? ? ? if word.flag == "nr":? ? # 僅統(tǒng)計(jì)詞性為nr的詞語
? ? ? ? ? ? counts[word] = counts.get(word, 0) + 1# 遍歷所有詞語炭菌,每出現(xiàn)一次其對應(yīng)的值加 1
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)? ? # 根據(jù)詞語出現(xiàn)的次數(shù)進(jìn)行從大到小排序
fi = open("人物角色提取.txt","w",encoding="utf-8")
for i in range(len(items)):
? ? word,pos = items[i][0]
? ? count = items[i][1]
? ? a = word + ","+ str(count)
? ? fi.write(a + "\n")
fi.close()
提取后的文件內(nèi)容如下圖所示