­

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()

提取後的文件內容如下圖所示