自然語言處理N天-Day0301中文文本關鍵字抽取

自然語言處理N天-Day0301中文文本關鍵字抽取

說明:本文依據《中文自然語言處理入門實戰》完成。目前網上有不少轉載的課程,我是從GitChat上購買。

第三課 中文文本中的關鍵字提取

關鍵詞提取就是從文本里面把跟這篇文章意義最相關的一些詞語抽取出來。這個可以追溯到文獻檢索初期,關鍵詞是為了文獻標引工作,從報告、論文中選取出來用以表示全文主題內容信息的單詞或術語,在現在的報告和論文中,我們依然可以看到關鍵詞這一項。因此,關鍵詞在文獻檢索、自動文摘、文本聚類/分類等方面有著重要的應用,它不僅是進行這些工作不可或缺的基礎和前提,也是互聯網上信息建庫的一項重要工作。

關鍵詞抽取方法

  • 關鍵詞分配:就是給定一個已有的關鍵詞庫,對於新來的文檔從該詞庫裡面匹配幾個詞語作為這篇文檔的關鍵詞。
  • 關鍵詞提取:針對新文檔,通過算法分析,提取文檔中一些詞語作為該文檔的關鍵詞。
  • 目前大多數應用領域的關鍵詞抽取算法都是基於後者實現的,從邏輯上說,後者比前者在實際應用中更準確。

1.基於TF-IDF的關鍵詞提取

TF-IDF 是 Term Frequency - Inverse Document Frequency 的簡寫。TF-IDF 是一種數值統計,用於反映一個詞對於語料中某篇文檔的重要性。

TF-IDF 的主要思想就是:如果某個詞在一篇文檔中出現的頻率高,也即 TF 高;並且在語料庫中其他文檔中很少出現,即 DF 低,也即 IDF 高,則認為這個詞具有很好的類別區分能力。

其中TF為詞頻,表示詞彙t在文檔d中出現的頻率。

自然語言處理N天-Day0301中文文本關鍵字抽取

​n_{i,j}是詞t_i在文件d_j中出現的次數。

IDF是逆文檔頻率(Inverse Document Frequency),表示語料庫中包含詞 t 的文檔的數目的倒數。

自然語言處理N天-Day0301中文文本關鍵字抽取

|D|是語料庫中文件總數,|{j:t_i\in d_j}|包含詞t的文件數目,為防止公式中被除數為0,會自動加1。

TF-IDF公式就是將TF和IDF相乘。

jieba已經實現了TF-IDF的抽取功能,使用jieba.analyse引入,參數設置如下

  • sentence:待提取的文本語料;
  • topK:返回 TF/IDF 權重最大的關鍵詞個數,默認值為 20;
  • withWeight:是否需要返回關鍵詞權重值,默認值為 False;
  • allowPOS:僅包括指定詞性的詞,默認值為空,即不篩選。
result_jieba = jieba.analyse.extract_tags(sentence, topK=20, withWeight=True, allowPOS=())
print(result_jieba)

2.基於TextRank的關鍵詞提取

TextRank核心思想是文本中的詞看作圖中的節點,通過邊相互連接,不同的節點會有不同的權重,權重高的節點可以作為關鍵詞。

自然語言處理N天-Day0301中文文本關鍵字抽取

jieba已經實現了TF-IDF的抽取功能,使用jieba.analyse引入

result_TextRank = jieba.analyse.textrank(sentence, topK=20, withWeight=True, allowPOS=('n', 'v'))
print(result_TextRank)

3.基於LDA主題模型的關鍵詞提取

在之前的機器學習中,LDA是和PCA一樣用於降維處理的模型,在這裡作為主題詞模型進行關鍵詞提取。

這裡使用之前處理文獻量化時的數據來做抽取。教程中使用的是gensim的LDA模型,我在這裡使用的是Sklearn的LDA模型(LatentDirichletAllocation)

#-*- coding: utf-8 -*-
#處理文獻摘要
import jieba
import pandas as pd
from dateutil import parser
data = pd.read_excel(r'.\yyjy_data.xls', sheetname=2)
data.head()
def chinese_word_cut(text):
stopwords=stopwordslist(r'C:\Users\01\Desktop\analysis\yyjy_cnki\stopwords.txt')
outstr=''
for word in jieba.cut(text):
if word not in stopwords:
if word != '\t':
outstr += word
outstr += " "
return outstr
def stopwordslist(filepath):
stopwords=[line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
return stopwords
data['Abstract']=data['Abstract'].astype(str)
data['content_cut']=data.Abstract.apply(chinese_word_cut)
data.head()

from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
n_features = 1000
max_df用於去掉出現太頻繁的
max_df = 0.50 means "忽略terms出現超過50%的文本".
max_df = 25 means "忽略terms出現超過25的文本".
max_df的默認值為1,意思為忽略出現超過100%的文本,即不會有任何意義
min_df用於去掉太不常見的
min_df = 0.01 means "忽略不超過1%的".
min_df = 5 means "忽略不超過5的".
tf_vectorizer = CountVectorizer(
strip_accents='unicode',
max_features=n_features,
stop_words='english',
max_df=0.50,
min_df=100)
tf = tf_vectorizer.fit_transform(data.content_cut)
from sklearn.decomposition import LatentDirichletAllocation
n_topics = 10
lda = LatentDirichletAllocation(
n_topics=n_topics,
max_iter=50,
learning_method='online',
learning_offset=50.,
random_state=0)
lda.fit(tf)
def print_top_words(model, feature_names, n_top_words):
for topic_idx, topic in enumerate(model.components_):
print("Topic #%d:" % topic_idx)
print(" ".join([feature_names[i]
for i in topic.argsort()[:-n_top_words - 1:-1]]))
print()
n_top_words = 30
tf_feature_names = tf_vectorizer.get_feature_names()
print_top_words(lda, tf_feature_names, n_top_words)

4.使用HanLP進行關鍵詞提取

可以使用HanLP來完成關鍵字提取,內部採用 TextRankKeyword 實現。

result_han = HanLP.extractKeyword(sentence, 20)
print(result_han)

對比這幾個主題抽取結果,你會發現,主題抽取和之前的分詞緊密相連,如果分詞能夠更加智能化,那麼抽取的主題詞應該不會像這個結果這樣微粒。我在這裡還是建議大家使用LDA模型。

[('人工智能', 0.9750542675762887), ('智能', 0.5167124540885567), ('機器', 0.20540911929525774), ('人類', 0.17414426566082475), ('科學', 0.17250169374402063), ('模擬', 0.15723537382948452), ('技術', 0.14596259315164947), ('計算機', 0.14030483362639176), ('圖像識別', 0.12324502580309278), ('流行語', 0.11242211730309279), ('領域', 0.11159372252391753), ('理論', 0.10842142209463919), ('挑戰性', 0.10725948546907216), ('計算機科學', 0.10059322603690721), ('勝任', 0.09603824920938145), ('能以', 0.09542563662711341), ('縮寫', 0.0918581965484536), ('容器', 0.08756191629402063), ('機器人', 0.08742415105876289), ('包括', 0.08708560101505154)]

[('智能', 1.0), ('人工智能', 0.9494129745270592), ('機器', 0.49663267662671245), ('人類', 0.42644352327508783), ('技術', 0.4081045856122762), ('模擬', 0.37686972900289967), ('包括', 0.3497298194015523), ('科學', 0.3166353404714701), ('理論', 0.30488902877451407), ('計算機', 0.2967448735822335), ('領域', 0.2800715509931106), ('年度', 0.271562368094339), ('需要', 0.26846112321216903), ('心理學', 0.2519058950332978), ('信息', 0.24293798778090905), ('語言', 0.2341066489418511), ('識別', 0.23353569236715208), ('帶來', 0.23309672987030272), ('過程', 0.22882750520149098), ('延伸', 0.2248210588102454)]

[人工智能, 智能, 人類, 研究, 不同, 工作, 包括, 領域, 模擬, 理論, 技術, 新的, 門, 機器, 計算機, 科學, 入選, 複雜, AI, 12月]


分享到:


相關文章: