ieba庫實現詞性標註及小說人物角色抽取
- 2019 年 12 月 11 日
- 筆記
Jieba庫實現詞性標註及小說人物角色抽取
原創: HR和Python 大鄧和他的Python 今天
公眾號: 小葉葉學Python
4年人力資源從業經驗,情報學碩士,主要內容涵蓋python、數據分析和人力資源相關內容
本文運用自然語言處理技術,對中文小說《神鵰俠侶》人物角色進行抽取,為使用通過社會網絡分析法對人物關係進行分析奠定基礎,使文學研究者、社會學家和普通讀者對小說人物關係和背景有更全面的認識
自然語言處理技術
自然語言處理(NLP)是一門融語言學、計算機科學、數學於一體的科學。國外學者於20世紀40年代末至50年代初開始NLP相關的研究,近年來,隨着人工智能和計算機技術的發展,自然語言處理(NLP)已經成為一個重要的人工智能發展方向,目前已廣泛的應用於機器翻譯、問答系統、文本分類、信息檢索、自動文本摘要等領域。中文的自然語言處理相對於英文還是有諸多差異的,英文是以空格來區分詞語,每一個單詞即是一個詞語,而中文則是以字為字符單位,以詞語來表達意思,而且存在一詞多義、多詞一義等情況,所以相對於英文來說,中文的自然語言處理更為艱難。分詞、詞性標註、句法分析是中文自然語言處理的三大基本任務,本文主要應用分詞、詞性標註兩類處理技術。
jieba庫基本介紹
jieba庫概述
jieba是優秀的中文分詞第三方庫 中文文本需要通過分詞獲得單個的詞語 jieba是優秀的中文分詞第三方庫,需要額外安裝 jieba庫提供三種分詞模式,最簡單只需掌握一個函數
jieba分詞的原理
Jieba分詞依靠中文詞庫 利用一個中文詞庫,確定漢字之間的關聯概率 漢字間概率大的組成詞組,形成分詞結果 除了分詞,用戶還可以添加自定義的詞組
jieba庫的優點
支持三種分詞模式:
精確模式,試圖將句子最精確地切開,適合文本分析;
全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
搜索引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜索引擎分詞。
安裝jieba:
命令行安裝方法
pip3 install jieba
jupyter notebook中的安裝方法
!pip3 install jieba
!pip3 install jieba
Requirement already satisfied: jieba in d:ancanda3libsite-packages (0.39)
jieba庫常用函數
分詞
代碼功能
jieba.cut(s)精確模式,返回一個可迭代的數據類型
jieba.cut(s,cut_all=True)全模式,輸出文本s中所有可能單詞
jieba.cut_for_search(s)搜索引擎模式,適合搜索建立索引的分詞
jieba.lcut(s)精確模式,返回一個列表類型,常用
jieba.lcut(s,cut_all=True)全模式,返回一個列表類型,常用
jieba.lcut_for_search(s)搜索引擎模式,返回一個列表類型,常用
jieba.add_word(w)向詞典中增加新詞
詞性標註
Jieba0.39版本提供55種詞性標註,部分符號及含義如表1所示。由表1可知,人名被標註為nr,因此對小說進行分詞和詞性標註後的文本進行進一步提取,提取出詞性為nr的詞作為人物角色名稱,即可構建角色列表。
import jieba
text = '我來到北京清華大學'
wordlist = jieba.lcut(text)
wordlist
Building prefix dict from the default dictionary …
Dumping model to file cache C:UserszAppDataLocalTempjieba.cache
Loading model cost 1.717 seconds.
Prefix dict has been built succesfully.
['我', '來到', '北京', '清華大學']
jieba分詞的簡單應用
使用 jieba 分詞對一個文本進行分詞,統計長度大於2,出現次數最多的詞語,這裡以《神鵰俠侶》為例
import jieba
txt = open("神鵰俠侶-網絡版.txt","r",encoding="utf-8").read()
words = jieba.lcut(txt) # 使用精確模式對文本進行分詞
counts = {} # 通過鍵值對的形式存儲詞語及其出現的次數
for word in words:
if len(word) == 1: # 單個詞語不計算在內
continue
else:
counts[word] = counts.get(word, 0) + 1# 遍歷所有詞語,每出現一次其對應的值加 1
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True) # 根據詞語出現的次數進行從大到小排序
for i in range(len(items)):
word, count = items[i]
print("{0:<5}{1:>5}".format(word, count))

從小說中抽取出現的人名及次數
詞性標註
Jieba0.39版本提供55種詞性標註,部分符號及含義如表1所示。由表1可知,人名被標註為nr,因此對小說進行分詞和詞性標註後的文本進行進一步提取,提取出詞性為nr的詞作為人物角色名稱,即可構建角色列表。

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:UserszAppDataLocalTempjieba.cache
Loading model cost 1.535 seconds.
Prefix dict has been built succesfully.
n
n
jieba詞性標註的簡單應用
使用 jieba 分詞對一個文本進行分詞及詞性標註,統計詞性為nr,出現次數最多的詞語,這裡以《神鵰俠侶》為例
import jieba
import jieba.posseg as psg
txt = open("神鵰俠侶-網絡版.txt","r",encoding="utf-8").read()
words = psg.cut(txt) # 使用精確模式對文本進行分詞
counts = {} # 通過鍵值對的形式存儲詞語及其出現的次數
for word in words:
if len(word.word) == 1: # 單個詞語不計算在內
continue
else:
if word.flag == "nr": # 僅統計詞性為nr的詞語
counts[word] = counts.get(word, 0) + 1# 遍歷所有詞語,每出現一次其對應的值加 1
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True) # 根據詞語出現的次數進行從大到小排序
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()
提取後的文件內容如下圖所示
