前言
本項目運用了TF-IDF關(guān)鍵詞提取技術(shù),結(jié)合詞云數(shù)據(jù)可視化、LDA (Latent Dirichlet Allocation)模型訓練以及語音轉(zhuǎn)換系統(tǒng),來實現(xiàn)一個基于TensorFlow的文本摘要程序。
首先,我們利用TF-IDF(Term Frequency-Inverse Document Frequency)技術(shù)來提取文本中的關(guān)鍵詞。這有助于找出文本中最具代表性的詞匯,為后續(xù)的摘要提取提供了重要的信息。
其次,我們運用詞云數(shù)據(jù)可視化技術(shù),將關(guān)鍵詞以視覺化的方式展示出來。這能夠幫助用戶直觀地理解文本的重點和關(guān)注點。
接下來,我們使用LDA模型進行訓練,這是一種用于主題建模的技術(shù)。通過LDA模型,我們能夠發(fā)現(xiàn)文本中隱藏的主題結(jié)構(gòu),從而更好地理解文本內(nèi)容的分布和關(guān)聯(lián)。
最后,我們將這些技術(shù)結(jié)合在一起,創(chuàng)建了一個基于TensorFlow的文本摘要程序。這個程序可以自動提取文本的關(guān)鍵信息、主題結(jié)構(gòu),并生成簡明扼要的文本摘要。
另外,我們還融合了語音轉(zhuǎn)換系統(tǒng),使得生成的文本摘要能夠通過語音方式呈現(xiàn),提升了用戶的體驗和使用便捷性。
通過這個項目,我們能夠?qū)⒍喾N技術(shù)融合在一起,實現(xiàn)一個功能強大的文本摘要程序,為用戶提供更便捷、直觀的文本理解和獲取體驗。
總體設計
本部分包括系統(tǒng)整體結(jié)構(gòu)圖和系統(tǒng)流程圖。
系統(tǒng)整體結(jié)構(gòu)圖
系統(tǒng)整體結(jié)構(gòu)如圖所示。
系統(tǒng)流程圖
系統(tǒng)流程如圖所示。
運行環(huán)境
本部分包括 Python 環(huán)境和TensorFlow環(huán)境。
Python 環(huán)境
需要Python 3.6及以上配置,在Windows環(huán)境下推薦下載Anaconda完成對Python環(huán)境的配置,下載地址為https://www.anaconda.com/。也可下載虛擬機在Linux環(huán)境下運行代碼。
TensorFlow環(huán)境
安裝方法如下:
方法一
打開Anaconda Prompt,輸入清華倉庫鏡像。
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config -set show_channel_urls yes
創(chuàng)建Python 3.6的環(huán)境,名稱為TensorFlow,此時Python版本和后面TensorFlow的版本有匹配問題,此步選擇Python 3.x。
conda create -n tensorflow python=3.6
有需要確認的地方,都輸入y。在Anaconda Prompt中激活TensorFlow環(huán)境:
conda activate tensorflow
安裝CPU版本的TensorFlow:
pip install -upgrade --ignore -installed tensorflow
測試代碼如下:
import tensorflow as tf
hello = tf.constant( 'Hello, TensorFlow! ')
sess = tf.Session()
print sess.run(hello)
# 輸出 b'Hello! TensorFlow'
安裝完畢。
方法二
打開Anaconda Navigator,進入Environments 單擊Create,在彈出的對話框中輸入TensorFlow,選擇合適的Python版本,創(chuàng)建好TensorFlow環(huán)境,然后進入TensorFlow環(huán)境,單擊Not installed在搜索框內(nèi)尋找需要用到的包。例如,TensorFlow,在右下方選擇apply,測試是否安裝成功。在Jupyter Notebook編輯器中輸入以下代碼:
import tensorflow as tf
hello = tf.constant( 'Hello, TensorFlow! ')
sess = tf.Session()
print sess.run(hello)
# 輸出 b'Hello! TensorFlow'
能夠輸出hello TensorFlow
,說明安裝成功。
模塊實現(xiàn)
本項目包括6個模塊:數(shù)據(jù)預處理、詞云構(gòu)建、關(guān)鍵詞提取、語音播報、LDA主題模型、模型構(gòu)建,下面分別給出各模塊的功能介紹及相關(guān)代碼。
1. 數(shù)據(jù)預處理
在清華大學NLP實驗室推出的中文文本數(shù)據(jù)集THUCNews中下載,下載地址為https://github.com/gaussic/text-classification-cnn-rnn。共包含5000條新聞文本,整合劃分出10個候選分類類別:財經(jīng)、房產(chǎn)、家居、教育、科技、時尚、時政、體育、游戲、娛樂。
1)導入數(shù)據(jù)
通過jupyter notebook來實現(xiàn),相關(guān)代碼如下:
#導入相應數(shù)據(jù)包
import pandas as pd
import numpy as np
#數(shù)據(jù)的讀入及讀出
df_news=pd.read_table("./cnews.val.txt",names=["category","content"])
df_news.head()
從文件夾讀出相應的數(shù)據(jù),分別表示新聞數(shù)據(jù)的類別及內(nèi)容,如圖所示。
#數(shù)據(jù)的類別及總量
df_news.category.unique()
df_news.content.shape
#為方便后續(xù)對數(shù)據(jù)的處理,將原始表格型據(jù)結(jié)構(gòu)轉(zhuǎn)換成列表格式
content_list=df_news.content.values.tolist()
數(shù)據(jù)類別處理代碼編譯成功,如圖所示。
2)數(shù)據(jù)清洗
新聞文本數(shù)據(jù)中不僅包括了中文字符,還包括了數(shù)字、英文字符、標點等,分詞是中文文本分析的重要內(nèi)容,正確的分詞可以更好地構(gòu)建模型。中文語料中詞與詞之間是緊密相連的,這一點不同于英文或者其他語種的語料,因此,不能像英文使用空格分詞,而是使用jieba庫中的分割方法。
#jieba分詞
content_fenci = [] #建立一個空的
for line in content_list:
text = jieba.lcut(line) #給每一條都分詞
if len(text) > 1 and text != '\r': #換行
content_fenci.append(text) #將分詞后的結(jié)果放入
#content_fenci[0] #分詞后的一個樣本
df_content=pd.DataFrame({'content':content_fenci})
df_content.head()
分詞后結(jié)果如圖所示。
#導入停用詞
def drop_stopwords(contents,stopwords):
content_clean = [] #放清理后的分詞
all_words = []
for line in contents:
line_clean=[]
for word in line:
if word in stopwords:
continue
line_clean.append(word)
all_words.append(str(word))
content_clean.append(line_clean)
return content_clean,all_words
content_clean,all_words = drop_stopwords(content_fenci,stopwords_list,)
df_clean= pd.DataFrame({'contents_clean':content_clean})
df_clean.head()
清洗后結(jié)果如圖所示。
3)統(tǒng)計詞頻
統(tǒng)計文本中每個單詞出現(xiàn)的次數(shù),對該統(tǒng)計按單詞頻次進行排序。如圖所示。
相關(guān)代碼如下:
tf= Counter(all_words)
2. 詞云構(gòu)建
詞云是對文本中出現(xiàn)頻率較高的關(guān)鍵詞予以視覺化的展現(xiàn),詞云過濾掉大量低頻低質(zhì)的文本信息,使瀏覽者快速閱讀文本就可領略文本的主旨。
#導入背景圖片后的詞云
mask = imread('4.png')#讀入圖片
wc=wordcloud.WordCloud(font_path=font,mask=mask,background_color='white',scale=2)
#scale:按照比例進行放大畫布,如設置為2,則長和寬都是原來畫布的2倍
wc.generate_from_frequencies(tf)
plt.imshow(wc) #顯示詞云
plt.axis('off') #關(guān)閉坐標軸
plt.show()
wc.to_file('ciyun.jpg') #保存詞云
3. 關(guān)鍵詞提取
TF-IDF是一種統(tǒng)計方法,字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時也會在語料庫中出現(xiàn)的頻率成反比下降,接下來通過TF-IDF算法的運用實現(xiàn)關(guān)鍵詞提取。
import jieba.analyse
index = 2
#print(df_clean['contents_clean'][index])
#詞之間相連
content_S_str = "".join(content_clean[index])
print(content_list[index])
print('關(guān)鍵詞:')
print(" ".join(jieba.analyse.extract_tags(content_S_str, topK=10, withWeight=False)))
4. 語音播報
將上述提取成功的關(guān)鍵詞通過pyttsx3
轉(zhuǎn)換成語音進行播報。
import pyttsx3
voice=pyttsx3.init()
voice.say(" ".join(jieba.analyse.extract_tags(content_S_str, topK=10, withWeight=False)))
print("準備語音播報.....")
voice.runAndWait()
5. LDA主題模型
LDA是一種文檔主題生成模型,也稱為三層貝葉斯概率模型,模型中包含詞語(W)、主題(Z)和文檔(theta)三層結(jié)構(gòu)。文檔到主題、主題到詞服從多項式分布,得出每個主題都有哪些關(guān)鍵詞組成。在實際運行中,因為單詞數(shù)量多,而一篇文檔的單詞數(shù)是有限的,如果采用密集矩陣表示,會造成內(nèi)存浪費,所以gensim內(nèi)部是用稀疏矩陣的形式來表示。首先,將分詞清洗后的文檔,使用dictionary = corpora.Dictionary (texts)
生成詞典;其次,將生成的詞典轉(zhuǎn)化成稀疏向量。
def create_LDA(content_clean):
#基于文本集建立(詞典),并獲得特征數(shù)
dictionary = corpora.Dictionary(content_clean)
#基于詞典,將分詞列表集轉(zhuǎn)換成稀疏向量集,稱作語料庫
dic = len(dictionary.token2id)
print('詞典特征數(shù):%d' % dic)
corpus = [dictionary.doc2bow(sentence) for sentence in content_clean]
#模型訓練
lda = gensim.models.LdaModel(corpus=corpus, id2word = dictionary,num_topics = 10,passes=10)
#passes 訓練幾輪
print(lda.print_topic(1,topn=5))
print('-----------')
for topic in lda.print_topics(num_topics=10, num_words = 5):
print(topic[1])
create_LDA(content_clean)
6. 模型構(gòu)建
貝葉斯分類器的原理是通過某對象的先驗概率,利用貝葉斯公式計算出后驗概率,即該對象屬于某一類的概率,選擇具有最大后驗概率的類作為所屬類。一個mapping對象將可哈希的值映射為任意對象,映射是可變對象。目前Python中只有一種標準映射類型一字典, 用花括號表示,但是花括號中的每個元素都是一個鍵值對(key: value),字典中的鍵值對也是無序的。
df_train=pd.DataFrame({"content":content_clean,"label":df_news['category']})
#為了方便計算,把對應的標簽字符類型轉(zhuǎn)換為數(shù)字
#映射類型(mapping)
#非空字典
label_mapping = {"體育": 0, "娛樂": 1, "家居": 2, "房產(chǎn)": 3, "教育":4, "時尚": 5,"時政": 6,"游戲": 7,"科技": 8,"財經(jīng)": 9}
df_train['label'] = df_train['label'].map(label_mapping)
#df_train.head()
#將每個新聞信息轉(zhuǎn)換成字符串形式,CountVectorizer和TfidfVectorizer的輸入為字符串
def create_words(data):
words = []
for index in range(len(data)):
try:
words.append( ' '.join(data[index]))
except Exception:
print(index)
return words
#把數(shù)據(jù)分成測試集和訓練集
x_train,x_test,y_train,y_test =train_test_split(df_train['content'].values,df_train['label'].values,random_state=0)
train_words = create_words(x_train)
test_words = create_words(x_test)
#模型訓練
#第一種
#CountVectorizer屬于常見的特征數(shù)值計算類,是一個文本特征提取方法
#對于每個訓練文本,只考慮每種詞匯在該訓練文本中出現(xiàn)的頻率
vec = CountVectorizer(analyzer = 'word',max_features=4000,lowercase=False)
vec.fit(train_words)
classifier = MultinomialNB()
classifier.fit(vec.transform(train_words),y_train)
print("模型準確率:",classifier.score(vec.transform(test_words), y_test))
#第二種,TfidfVectorizer除了考量某一詞匯在當前訓練文本中出現(xiàn)的頻率之外
#關(guān)注包含這個詞匯的其它訓練文本數(shù)目的倒數(shù),訓練文本的數(shù)量越多特征化的方法就越有優(yōu)勢
vectorizer = TfidfVectorizer(analyzer='word',max_features = 40000,
lowercase=False)
vectorizer.fit(train_words)
classifier.fit(vectorizer.transform(train_words),y_train)
print("模型準確率為:",classifier.score(vectorizer.transform(test_words),
y_test))
系統(tǒng)測試
詞云如圖1所示,關(guān)鍵詞提取如圖2所示,LDA測試結(jié)果如圖3所示,貝葉斯結(jié)果如圖4所示。
工程源代碼下載
詳見本人博客資源下載頁文章來源:http://www.zghlxwxcb.cn/news/detail-637175.html
其它資料下載
如果大家想繼續(xù)了解人工智能相關(guān)學習路線和知識體系,歡迎大家翻閱我的另外一篇博客《重磅 | 完備的人工智能AI 學習——基礎知識學習路線,所有資料免關(guān)注免套路直接網(wǎng)盤下載》
這篇博客參考了Github知名開源平臺,AI技術(shù)平臺以及相關(guān)領域?qū)<遥篋atawhale,ApacheCN,AI有道和黃海廣博士等約有近100G相關(guān)資料,希望能幫助到所有小伙伴們。文章來源地址http://www.zghlxwxcb.cn/news/detail-637175.html
到了這里,關(guān)于基于TF-IDF+TensorFlow+詞云+LDA 新聞自動文摘推薦系統(tǒng)—深度學習算法應用(含ipynb源碼)+訓練數(shù)據(jù)集的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!