一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

用Python對自己的文章做文本分析

 明滅的煙頭 2023-03-21 發(fā)布于四川

新型冠狀病毒疫情加劇,讓人閑的不行。重新打開我的簡書之后,發(fā)現(xiàn)我在簡書上也寫了72篇文章了……

想“溫故而知新”一下,但是在家總是慵懶,就算是自己寫的文章也不想看。但是又十分好奇自己在過去的一年多的時間里到底寫了啥,于是決定用python對自己的文章進(jìn)行簡單的文本分析,分析目標(biāo)是:

  1. 得到每一篇文章的關(guān)鍵詞;

  2. 使用這些關(guān)鍵詞生成所有文本的關(guān)鍵詞共現(xiàn)網(wǎng)絡(luò)。

一、文本預(yù)處理

首先先導(dǎo)出并解壓自己的文章,簡書的導(dǎo)出非常方便,這也是我喜歡用簡書編輯器的原因(包括本文也是用簡書編輯器寫的),寫出來的東西都還可以是自己的。

一共有8個文件夾,由于所有文本都是使用markdown寫的,所以文本預(yù)處理比較簡單,僅僅需要去除特殊符號(如:#、\n等)。在對具體文本進(jìn)行分析時候發(fā)現(xiàn),許多文本中均出現(xiàn)了許多代碼,并且部分文章中英文混雜。轉(zhuǎn)念一想,文章以中文為主,并且代碼部分與其他部分關(guān)聯(lián)較小,無論是用TF-IDF方法還是TextRank都不會出現(xiàn)在關(guān)鍵詞的前列,所以在預(yù)處理階段暫時不處理這個問題。核心代碼如下(其實(shí)很簡單):

  1. f = open(text_file, 'r', encoding='UTF-8')
  2. data = f.read()
  3. str = re.sub('[^\w]', '', data) #去除特殊符號(如:#、\n等)

二、TF-IDF模型提取關(guān)鍵詞

在提取關(guān)鍵詞之前,需要先對每個文本進(jìn)行分詞,中文分詞的方法包括jieba、SnowNlp等。(引自:Jieba、NLTK等中英文分詞工具進(jìn)行分詞)本文使用jieba分詞方法。

import jieba

TF-IDF模型是最簡單的提取關(guān)鍵詞的模型,學(xué)術(shù)的解釋如下。

TF-IDF(term frequency–inverse document frequency,詞頻-逆向文件頻率)是一種用于信息檢索(information retrieval)與文本挖掘(text mining)的常用加權(quán)技術(shù)。TF-IDF是一種統(tǒng)計(jì)方法,用以評估一字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時會隨著它在語料庫中出現(xiàn)的頻率成反比下降。(引自:關(guān)鍵字提取算法TF-IDF和TextRank(python3))

一個詞是不是關(guān)鍵詞,在TF-IDF模型看來,僅僅在于兩個方面1)在當(dāng)前文本出現(xiàn)的頻次高;2)在所有文本中出現(xiàn)的頻次不能太高。基于這個思想,TF-IDF的計(jì)算方法如下:

1.計(jì)算詞頻(tf),等于某個詞在文本中的詞數(shù)除以文本的總詞數(shù)。

2.計(jì)算逆向文本頻率(IDF),先計(jì)算文本總數(shù)除以包含該詞的文檔數(shù),為了防止分母等于0,在分母的位置加上1,在完成除法計(jì)算后取對數(shù)。

3.TF-IDF值是詞頻與逆向文本頻率之積。

用Python計(jì)算每篇文章每個詞的tf-idf值,需要先對每個文本進(jìn)行分詞,對每個詞需要遍歷所有的文本的所有詞,工作量比較大。硬上的話,代碼效率估計(jì)會比較低。但是!在看jieba算法的時候,驚奇的發(fā)現(xiàn)jieba算法已經(jīng)內(nèi)嵌有TF-IDF算法(當(dāng)然也有TextRank算法),不用造輪子的感覺很舒服,核心代碼如下。

  1. import jieba.analyse as anls
  2. for x, w in anls.textrank(str, topK=5, withWeight=True): # 選擇輸出5個關(guān)鍵詞
  3. file_list[name][file].append([x, w])

為了看到分詞效果,把結(jié)果輸出到csv中。從結(jié)果看還是很不錯的,比如在《人是如何廢掉的》這篇文章中,把“手機(jī)”“挫敗”這兩個關(guān)鍵詞找出來了,在《人是如何好起來的》中把“自律”“計(jì)劃”找出來了。這兩篇一年前寫的文章對一年后的生活依然能夠有很好的概括,解決措施也完全適用,果然還是知易行難。

三、關(guān)鍵詞共現(xiàn)網(wǎng)絡(luò)

關(guān)鍵詞共現(xiàn)網(wǎng)絡(luò)構(gòu)造的關(guān)鍵是構(gòu)造共詞矩陣。在已經(jīng)得到每一篇文章的關(guān)鍵詞后,假如不考慮每個詞的連接強(qiáng)度的計(jì)算方法,共詞矩陣的構(gòu)造非常簡單,只需要將所有關(guān)鍵詞提取出來,將每兩個關(guān)鍵詞共同出現(xiàn)的次數(shù)分別計(jì)算出來形成矩陣即可。

在完成共詞矩陣的構(gòu)造后,繪圖部分同樣使用Python實(shí)現(xiàn),所幸在Python中也有前人做好了輪子。使用的是networkx。結(jié)果如下圖。

雖然這個結(jié)果圖沒有Gephi、CiteSpace等軟件畫出的圖好看,但是也著實(shí)讓人興奮了好一陣。一個個區(qū)域放大來看,確實(shí)看出了很多東西。從整體看來,我的文章還是關(guān)聯(lián)度比較高的。從主要部分看,主要是兩個方面的內(nèi)容:學(xué)習(xí)生活,從周圍部分來看,主要是生活的內(nèi)容。

1. “學(xué)習(xí)”部分

學(xué)習(xí)這一部分,科研是大頭,“教育”是一個關(guān)鍵的中心詞,連接了“學(xué)科”、“研究生”、“研究生”、“高?!薄ⅰ袄碚摗?、“經(jīng)濟(jì)”等方面的內(nèi)容,說明我的文章都涉足過這些內(nèi)容。另外,出現(xiàn)的“學(xué)位點(diǎn)”“京津冀”也倍感親切,這是我曾經(jīng)參與過的課題,學(xué)位點(diǎn)項(xiàng)目涉及的招生規(guī)模、學(xué)位授予、產(chǎn)業(yè)結(jié)構(gòu),京津冀項(xiàng)目涉及的創(chuàng)新、協(xié)同、機(jī)制、區(qū)域發(fā)展等方面的內(nèi)容都出現(xiàn)在關(guān)鍵詞共現(xiàn)圖上了,愈感興奮。另外還把“北京”和“服務(wù)業(yè)”連接起來了,在圖中居然能夠反映第三產(chǎn)業(yè)對于北京的重要性,有點(diǎn)厲害。有意思的是,“經(jīng)濟(jì)”這一個連接詞不僅連接了“教育”,還連接了王者榮耀(“兵線、“裝備””)和之前看的《經(jīng)濟(jì)戰(zhàn)爭與戰(zhàn)爭經(jīng)濟(jì)》這本書的相關(guān)內(nèi)容,不說看書,看來我對游戲的態(tài)度也是認(rèn)真的(手動狗頭)。

在“京津冀”關(guān)鍵詞的右邊,出現(xiàn)了“游戲”、“小游戲”、“彈球”、“障礙物”、“控制”、“圖形化”、“代碼”等詞語,都是我在寫畢業(yè)論文的時候思考和干活的主要方面,這也能挖出來。

此外,看到“青年教師”四個字,也想起了去年讀博前看的《“青椒”的歷史印痕——大學(xué)青年教師學(xué)術(shù)與生活的社會考察》這本書,以及當(dāng)時深深的焦慮。

2. “生活”部分

“生活”部分比較雜,比如有探討時間管理的。

有思考親密關(guān)系的。

也分析過原生家庭的特征與影響。

除了主要部分外,各個分支也能夠展現(xiàn)我的興趣和曾經(jīng)的思考方向,比如寫過紀(jì)念我諾退役的文章,也曾經(jīng)也研究過服裝的搭配(好像也沒什么卵用- -)。

曾經(jīng)用CiteSpace形成的知識圖譜分析過中國高等教育教育的特點(diǎn),但是倍感吃力。現(xiàn)在通過自己文章的文本數(shù)據(jù)分析自己的過去一年的思考,還真有一種弄恍然大悟的感覺。劉則淵教授曾經(jīng)說過一句話,“一圖展春秋,一覽無余;一圖勝萬言,一目了然”,今天體會到了這種感覺,酣暢淋漓。要得到知識圖譜背后的“隱喻”,對所分析的數(shù)據(jù)熟悉程度要高(比如都是你自己寫的- -),而且要對知識圖譜所涉及的領(lǐng)域足夠了解,不然也只是牽強(qiáng)附會而已。

代碼如下:

文本分析部分代碼

  1. import os
  2. import sys
  3. import re
  4. import jieba
  5. import jieba.analyse as anls
  6. import pickle
  7. import pandas as pd
  8. def saveResult(obj, savePath): # 保存函數(shù)
  9. with open(savePath, 'wb') as f:
  10. pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)
  11. file_dir = 'article' # 換成自己的路徑
  12. file_list = {}
  13. get_result = []
  14. for filename in os.listdir(file_dir):
  15. file_list[filename] = {}
  16. for name in file_list:
  17. file_name = file_dir + name
  18. for file in os.listdir(file_name):
  19. file_list[name][file] = []
  20. text_file = file_name + '/' + file
  21. f = open(text_file, 'r', encoding='UTF-8')
  22. data = f.read()
  23. str = re.sub('[^\w]', '', data)
  24. keywords = ''
  25. # 使用TF-IDF算法得到關(guān)鍵詞
  26. for x, w in anls.textrank(str, topK=5, withWeight=True):
  27. file_list[name][file].append([x, w])
  28. keywords += x + ', '
  29. get_result.append([file, keywords])
  30. name = ['title', 'keywords']
  31. contents = pd.DataFrame(columns=name, data=get_result)
  32. contents.to_csv('文章關(guān)鍵詞.csv', encoding='utf-8')
  33. # 把所有關(guān)鍵詞提取出來
  34. wordlist = []
  35. for name in file_list:
  36. file_name = file_dir + name
  37. for file in os.listdir(file_name):
  38. wcolunm = file_list[name][file]
  39. if wcolunm == []:
  40. continue
  41. for i in range(len(wcolunm)):
  42. word = wcolunm[i][0]
  43. try:
  44. index = wordlist.index(word)
  45. except:
  46. wordlist.append(word)
  47. # 構(gòu)建詞向量矩陣
  48. wordMatrix = {}
  49. for word1 in wordlist:
  50. wordMatrix[word1] = {}
  51. for word2 in wordlist:
  52. wordMatrix[word1][word2] = 0
  53. for name in file_list:
  54. file_name = file_dir + name
  55. for file in os.listdir(file_name):
  56. wcolunm = file_list[name][file]
  57. if wcolunm == []:
  58. continue
  59. for i in range(len(wcolunm)):
  60. word1 = wcolunm[i][0]
  61. w1 = wcolunm[i][1]
  62. for j in range(len(wcolunm)):
  63. word2 = wcolunm[j][0]
  64. w2 = wcolunm[j][1]
  65. if j == i:
  66. wordMatrix[word1][word2] += 1
  67. else:
  68. wordMatrix[word1][word2] += w1*w2
  69. saveResult(wordMatrix, 'wordMatrix.pkl')
  70. print('保存成功!')

繪圖部分代碼

  1. import networkx as nx
  2. import matplotlib.pyplot as plt
  3. import pickle
  4. from pylab import mpl
  5. mpl.rcParams['font.sans-serif'] = ['SimHei'] # 在plt中顯示中文字符
  6. def loadResult(savePath): # 提取函數(shù)
  7. with open(savePath, 'rb') as f:
  8. return pickle.load(f)
  9. wordMatrix = loadResult('wordMatrix.pkl')
  10. gList = []
  11. for word1 in wordMatrix:
  12. for word2 in wordMatrix:
  13. if word1 != word2 and wordMatrix[word1][word2] > 0:
  14. gList.append((word1, word2, wordMatrix[word1][word2]))
  15. G = nx.Graph()
  16. G.add_weighted_edges_from(gList)
  17. nx.draw(G, with_labels=True)
  18. plt.show()

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    白白操白白在线免费观看| 樱井知香黑人一区二区| 国产一级性生活录像片| 好吊妞在线免费观看视频| 微拍一区二区三区福利| 亚洲国产中文字幕在线观看| 国产成人精品一区二区在线看| 激情少妇一区二区三区| 最新国产欧美精品91| 一区二区三区亚洲国产| 五月天丁香亚洲综合网| 成人精品视频在线观看不卡| 超碰在线播放国产精品| 激情图日韩精品中文字幕| 蜜桃传媒视频麻豆第一区| 亚洲高清亚洲欧美一区二区| 欧美一区二区不卡专区| 日本高清不卡在线一区| 色综合伊人天天综合网中文| 一区二区不卡免费观看免费| 午夜福利网午夜福利网| 深夜视频成人在线观看 | 女厕偷窥一区二区三区在线| 激情中文字幕在线观看| 日本精品中文字幕在线视频| 中文字幕一区二区熟女| 99国产精品国产精品九九| 东北老熟妇全程露脸被内射| 国产精品香蕉免费手机视频| 91人妻人澡人人爽人人精品| 欧美午夜一级艳片免费看| 欧美字幕一区二区三区| 国产午夜精品久久福利| 在线观看免费午夜福利| 日韩av欧美中文字幕| 91精品国自产拍老熟女露脸| 色丁香一区二区黑人巨大| 99久久国产亚洲综合精品| 人人妻在人人看人人澡| 国产精品不卡免费视频| 91人妻丝袜一区二区三区|