自然語言學習03-關鍵字提取 筆記

前言

關鍵詞提取就是從文本里面把跟這篇文章意義最相關的一些詞語抽取出來。

關鍵詞抽取從方法來說主要有兩種:

  • 第一種是關鍵詞分配:就是給定一個已有的關鍵詞庫,對於新來的文檔從該詞庫裏面匹配幾個詞語作爲這篇文檔的關鍵詞。

  • 第二種是關鍵詞提取:針對新文檔,通過算法分析,提取文檔中一些詞語作爲該文檔的關鍵詞。

目前大多數應用領域的關鍵詞抽取算法都是基於後者實現的,從邏輯上說,後者比前者在實際應用中更準確。

下面介紹一些關於關鍵詞抽取的常用和經典的算法實現。

基於 TF-IDF 算法進行關鍵詞提取

TF-IDF 是 Term Frequency - Inverse Document Frequency 的簡寫。TF-IDF 是一種數值統計,用於反映一個詞對於語料中某篇文檔的重要性。在信息檢索和文本挖掘領域,它經常用於因子加權。TF-IDF 的主要思想就是:如果某個詞在一篇文檔中出現的頻率高,也即 TF 高;並且在語料庫中其他文檔中很少出現,即 DF 低,也即 IDF 高,則認爲這個詞具有很好的類別區分能力。

TF 爲詞頻(Term Frequency),表示詞 t 在文檔 d 中出現的頻率,計算公式:

enter image description here

其中,ni,jni,j 是該詞 titi 在文件 djdj 中的出現次數,而分母則是在文件 djdj 中所有字詞的出現次數之和。

IDF 爲逆文檔頻率(Inverse Document Frequency),表示語料庫中包含詞 t 的文檔的數目的倒數,計算公式:

enter image description here

|D| 表示語料庫中的文件總數,|{j:ti∈dj}||{j:ti∈dj}| 包含詞 titi 的文件數目,如果該詞語不在語料庫中,就會導致被除數爲零,因此一般情況下使用 1+|{j:ti∈dj}|1+|{j:ti∈dj}|。

TF-IDF 在實際中主要是將二者相乘,也即 TF * IDF, 計算公式:

enter image description here

TF-IDF 傾向於過濾掉常見的詞語,保留重要的詞語。

jieba 已經實現了基於 TF-IDF 算法的關鍵詞抽取,通過命令 import jieba.analyse引入,函數參數解釋如下:

jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
  • sentence:待提取的文本語料;

  • topK:返回 TF/IDF 權重最大的關鍵詞個數,默認值爲 20;

  • withWeight:是否需要返回關鍵詞權重值,默認值爲 False;

  • allowPOS:僅包括指定詞性的詞,默認值爲空,即不篩選。

example

獲取 Top20 關鍵字,用空格隔開打印:

import jieba.analyse
    sentence  = "人工智能(Artificial Intelligence),英文縮寫爲AI。它是研究、開發用於模擬、延伸和擴展人的智能的理論、方法、技術及應用系統的一門新的技術科學。人工智能是計算機科學的一個分支,它企圖瞭解智能的實質,並生產出一種新的能以人類智能相似的方式做出反應的智能機器,該領域的研究包括機器人、語言識別、圖像識別、自然語言處理和專家系統等。人工智能從誕生以來,理論和技術日益成熟,應用領域也不斷擴大,可以設想,未來人工智能帶來的科技產品,將會是人類智慧的“容器”。人工智能可以對人的意識、思維的信息過程的模擬。人工智能不是人的智能,但能像人那樣思考、也可能超過人的智能。人工智能是一門極富挑戰性的科學,從事這項工作的人必須懂得計算機知識,心理學和哲學。人工智能是包括十分廣泛的科學,它由不同的領域組成,如機器學習,計算機視覺等等,總的說來,人工智能研究的一個主要目標是使機器能夠勝任一些通常需要人類智能才能完成的複雜工作。但不同的時代、不同的人對這種“複雜工作”的理解是不同的。2017年12月,人工智能入選“2017年度中國媒體十大流行語”。"
    keywords = "  ".join(jieba.analyse.extract_tags(sentence , topK=20, withWeight=False, allowPOS=()))
    print(keywords)

下面只獲取 Top10 的關鍵字,並修改一下詞性,只選擇名詞和動詞

keywords =(jieba.analyse.extract_tags(sentence , topK=10, withWeight=True, allowPOS=(['n','v'])))
print(keywords)
[('人工智能', 0.9750542675762887), ('智能', 0.5167124540885567), ('機器', 0.20540911929525774), ('人類', 0.17414426566082475), ('科學', 0.17250169374402063), ('模擬', 0.15723537382948452), ('技術', 0.14596259315164947), ('計算機', 0.14030483362639176), ('圖像識別', 0.12324502580309278), ('流行語', 0.11242211730309279)]

基於 TextRank 算法進行關鍵詞提取

TextRank 是由 PageRank 改進而來,核心思想將文本中的詞看作圖中的節點,通過邊相互連接,不同的節點會有不同的權重,權重高的節點可以作爲關鍵詞。公式如下:

節點 i 的權重取決於節點 i 的鄰居節點中 i-j 這條邊的權重 / j 的所有出度的邊的權重 * 節點 j 的權重,將這些鄰居節點計算的權重相加,再乘上一定的阻尼係數,就是節點 i 的權重,阻尼係數 d 一般取 0.85。

TextRank 用於關鍵詞提取的算法如下:

(1)把給定的文本 T 按照完整句子進行分割,即:

enter image description here

(2)對於每個句子,進行分詞和詞性標註處理,並過濾掉停用詞,只保留指定詞性的單詞,如名詞、動詞、形容詞,其中 ti,jti,j 是保留後的候選關鍵詞。

enter image description here

(3)構建候選關鍵詞圖 G = (V,E),其中 V 爲節點集,由(2)生成的候選關鍵詞組成,然後採用共現關係(Co-Occurrence)構造任兩點之間的邊,兩個節點之間存在邊僅當它們對應的詞彙在長度爲 K 的窗口中共現,K 表示窗口大小,即最多共現 K 個單詞。

(4)根據 TextRank 的公式,迭代傳播各節點的權重,直至收斂。

(5)對節點權重進行倒序排序,從而得到最重要的 T 個單詞,作爲候選關鍵詞。

(6)由(5)得到最重要的 T 個單詞,在原始文本中進行標記,若形成相鄰詞組,則組合成多詞關鍵詞。

同樣 jieba 已經實現了基於 TextRank 算法的關鍵詞抽取,通過命令 import jieba.analyse 引用,函數參數解釋如下:

jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))

直接使用,接口參數同 TF-IDF 相同,注意默認過濾詞性。

example

result = "  ".join(jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')))
print(result)
智能  人工智能  機器  人類  研究  技術  模擬  包括  科學  工作  領域  理論  計算機  年度  需要  語言  相似  方式  做出  心理學

修改一下詞性,只需要名詞和動詞

result = "  ".join(jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('n','v')))
print(result)
智能  人工智能  機器  人類  技術  模擬  包括  科學  理論  計算機  領域  年度  需要  心理學  信息  語言  識別  帶來  過程  延伸

基於 LDA 主題模型進行關鍵詞提取

語料是一個關於汽車的短文本,下面通過 Gensim 庫完成基於 LDA 的關鍵字提取。整個過程的步驟爲:文件加載 -> jieba 分詞 -> 去停用詞 -> 構建詞袋模型 -> LDA 模型訓練 -> 結果可視化。

notice 

pycharm 調整代碼格式 ctrl+alt+L

eclipse 調整代碼格式 ctrl+shift+F

error

解決方法:https://blog.csdn.net/qq_38355352/article/details/88783832

在pycharm裏不寫也可

error

NLP後加上//

改爲UTF-8

# coding:utf-8
# 引入庫文件
import jieba.analyse as analyse
import jieba
import matplotlib
import pandas as pd
from docutils.nodes import inline
from gensim import corpora, models, similarities
import gensim
import numpy as np
import matplotlib.pyplot as plt
#%matplotlib inline
# 設置文件路徑
dir = "D://CodeSpace//pycharm//NLP//"
file_desc = "".join([dir, 'car.csv'])
stop_words = "".join([dir, 'stopwords.txt'])
# 定義停用詞
stopwords = pd.read_csv(stop_words, index_col=False, quoting=3, sep="\t", names=['stopword'], encoding='utf-8')
stopwords = stopwords['stopword'].values
# 加載語料
df = pd.read_csv(file_desc, encoding='utf-8')
# 刪除nan行
df.dropna(inplace=True)
lines = df.content.values.tolist()
# 開始分詞
sentences = []
for line in lines:
    try:
        segs = jieba.lcut(line)
        segs = [v for v in segs if not str(v).isdigit()]  # 去數字
        segs = list(filter(lambda x: x.strip(), segs))  # 去左右空格
        segs = list(filter(lambda x: x not in stopwords, segs))  # 去掉停用詞
        sentences.append(segs)
    except Exception:
        print(line)
        continue
# 構建詞袋模型
dictionary = corpora.Dictionary(sentences)
corpus = [dictionary.doc2bow(sentence) for sentence in sentences]
# lda模型,num_topics是主題的個數,這裏定義了5個
lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=10)
# 我們查一下第1號分類,其中最常出現的5個詞是:
print(lda.print_topic(1, topn=5))
# 我們打印所有5個主題,每個主題顯示8個詞
for topic in lda.print_topics(num_topics=10, num_words=8):
    print(topic[1])
0.024*"設計" + 0.011*"車身" + 0.007*"採用" + 0.006*"感" + 0.006*"式"
0.016*"二手車" + 0.012*"停車" + 0.010*"瓜子" + 0.007*"優惠" + 0.007*"平臺" + 0.005*"市場" + 0.005*"汽車" + 0.005*"車主"
0.024*"設計" + 0.011*"車身" + 0.007*"採用" + 0.006*"感" + 0.006*"式" + 0.005*"動力" + 0.005*"寶沃" + 0.005*"動感"
0.040*"汽車" + 0.018*"服務" + 0.012*"用戶" + 0.012*"出行" + 0.011*"共享" + 0.010*"城市" + 0.010*"發展" + 0.008*"平臺"
0.012*"車輛" + 0.012*"司機" + 0.010*"汽車" + 0.009*"機動車" + 0.007*"相關" + 0.007*"4S店" + 0.006*"維修" + 0.006*"億"
0.025*"中國" + 0.024*"市場" + 0.022*"汽車" + 0.018*"品牌" + 0.009*"奧迪" + 0.009*"技術" + 0.008*"經銷商" + 0.008*"新"
0.016*"系統" + 0.014*"智能" + 0.012*"駕駛" + 0.010*"汽車" + 0.010*"車輛" + 0.009*"車型" + 0.008*"全新" + 0.008*"發動機"
0.024*"充電" + 0.010*"樁" + 0.009*"指數" + 0.009*"企業" + 0.008*"品牌" + 0.007*"發展" + 0.007*"汽車" + 0.007*"皮卡"
0.017*"產品" + 0.016*"汽車" + 0.012*"品牌" + 0.011*"車型" + 0.010*"技術" + 0.009*"SUV" + 0.008*"全新" + 0.007*"車"
0.050*"汽車" + 0.023*"新能源" + 0.015*"中國" + 0.012*"發展" + 0.011*"國家" + 0.011*"企業" + 0.008*"召回" + 0.007*"生產"
0.025*"萬輛" + 0.024*"銷量" + 0.024*"增長" + 0.020*"同比" + 0.012*"銷售" + 0.011*"汽車" + 0.011*"輛" + 0.010*"乘用車"

基於 pyhanlp 進行關鍵詞提取

除了 jieba,也可以選擇使用 HanLP 來完成關鍵字提取,內部採用 TextRankKeyword 實現,

from pyhanlp import *
sentence  = "人工智能(Artificial Intelligence),英文縮寫爲AI。它是研究、開發用於模擬、延伸和擴展人的智能的理論、方法、技術及應用系統的一門新的技術科學。人工智能是計算機科學的一個分支,它企圖瞭解智能的實質,並生產出一種新的能以人類智能相似的方式做出反應的智能機器,該領域的研究包括機器人、語言識別、圖像識別、自然語言處理和專家系統等。人工智能從誕生以來,理論和技術日益成熟,應用領域也不斷擴大,可以設想,未來人工智能帶來的科技產品,將會是人類智慧的“容器”。人工智能可以對人的意識、思維的信息過程的模擬。人工智能不是人的智能,但能像人那樣思考、也可能超過人的智能。人工智能是一門極富挑戰性的科學,從事這項工作的人必須懂得計算機知識,心理學和哲學。人工智能是包括十分廣泛的科學,它由不同的領域組成,如機器學習,計算機視覺等等,總的說來,人工智能研究的一個主要目標是使機器能夠勝任一些通常需要人類智能才能完成的複雜工作。但不同的時代、不同的人對這種“複雜工作”的理解是不同的。2017年12月,人工智能入選“2017年度中國媒體十大流行語”。"
result = HanLP.extractKeyword(sentence, 20)
print(result)
[人工智能, 智能, 人類, 研究, 不同, 工作, 包括, 領域, 模擬, 理論, 技術, 新的, 門, 機器, 計算機, 科學, 入選, 複雜, AI, 12月]

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章