完整源碼可在公衆號:「01二進制」後臺回覆:「翟天臨」獲取html
昨天是元宵節,在南京,元宵節一到也意味着這個年過完了,咱們也該回到本身的工做崗位上了。都說今年的瓜特別多(葫蘆娃的那種),可是過年期間最甜的我想非翟天臨的「知網是什麼?」莫屬了吧。python
前段時間,微博上開始不斷爆出翟天臨學術不端,論文抄襲的消息,以致於牽扯到其導師、院長甚至整個北京電影學院。git
我日常不怎麼關注娛樂圈,因此剛開始並無把這件事放在心上,直到網上爆出翟的論文大篇幅抄襲陳坤論文的消息,我纔對這位娛樂圈博士的文章起了興趣。接下來就讓咱們以一個coder的角度來硬核分析下翟的論文吧。github
工欲善其事,必先利其器,在開始分析以前,我先說明這次分析所處的實驗環境,以避免出現異常:bash
說實話,起初我覺得就算翟不知「知網」爲什麼物,「知網」也該收錄翟的文章吧,可我在知網搜了很久也沒能找到翟的論文,好在我在今日頭條上找到了他的文章,保存在data/zhai.txt
中。說到這,還真要感謝翟天臨啊,都是由於他,你們才變得這麼有學術精神,開始研究起本科碩士博士論文了。app
上一節咱們已經將他的論文保存到一個txt中了,因此咱們須要先將文章加載到內存中:機器學習
# 數據獲取(從文件中讀取)
def readFile(file_path):
content = []
with open(file_path, encoding="utf-8") as f:
content = f.read()
return content
複製代碼
我統計了下,除去開頭的標題和末尾的致謝,總共25005個字。函數
接下來咱們來進行數據清理,在這裏我用了pkuseg對內容進行分詞處理,同時去掉停用詞後輸出分詞的結果。工具
所謂停用詞就是在語境中沒有具體含義的文字,例如這個、那個,你我他,的得地,以及標點符合等等。由於沒人在搜索的時候去用這些沒意義的停用詞搜索,爲了使得分詞效果更好,我就要把這些停用詞過濾掉。學習
# 數據清理(分詞和去掉停用詞)
def cleanWord(content):
# 分詞
seg = pkuseg.pkuseg()
text = seg.cut(content)
# 讀取停用詞
stopwords = []
with open("stopwords/哈工大停用詞表.txt", encoding="utf-8") as f:
stopwords = f.read()
new_text = []
# 去掉停用詞
for w in text:
if w not in stopwords:
new_text.append(w)
return new_text
複製代碼
執行結果:
pkuseg是北大推出的一個分詞工具,官方地址是:github.com/lancopku/pk…
停用詞表的下載地址在:github.com/YueYongDev/…
停用詞表 | 效果較好的文本種類 |
---|---|
哈工大停用詞表 | 文獻期刊類文本 |
百度停用詞表 | 新聞報道類文本 |
四川大學停用詞表 | 郵件文獻類文本 |
參考文獻:官琴, 鄧三鴻, 王昊. 中文文本聚類經常使用停用詞表對比研究[J]. 數據分析與知識發現, 2006, 1(3).
有興趣閱讀此篇論文的可在公衆號:「01二進制」後臺回覆:「停用詞表對比研究」獲取
說是數據統計,其實也沒什麼好統計的,這裏簡單化一下,就是統計下各個詞出現的頻率,而後輸出詞頻最高的15個詞
# 數據整理(統計詞頻)
def statisticalData(text):
# 統計每一個詞的詞頻
counter = Counter(text)
# 輸出詞頻最高的15個單詞
pprint.pprint(counter.most_common(15))
複製代碼
打印的結果:
真的是個不可多得的「好演員」啊,能將角色帶入生活,即便肚中無貨卻仍用本身的表演能力爲本身設立一個「學霸」人設,人物形象如此飽滿,興許這就是創做的藝術吧!
文章中說的最多的就是生活、角色、人物、性格這些詞,這些正是一個好演員的精神所在,若是咱們將這些詞作成詞雲的話,可能效果會更好。
詞雲生成這個部分我採用的是wordcloud庫,使用起來很是簡單,網上教程也有不少,這裏須要提一點的就是:爲了防止中文亂碼狀況的發生,須要配置font_path這個參數。中文字體能夠選用系統的,也能夠網上找,這裏我推薦一個免費的中文字體下載的網址:www.lvdoutang.com/zh/0/0/1/1.…
下面是生成詞雲的代碼:
# 數據可視化(生成詞雲)
def drawWordCloud(text, file_name):
wl_space_split = " ".join(text)
# 設置詞雲背景圖
b_mask = plt.imread('assets/img/bg.jpg')
# 設置詞雲字體(若不設置則沒法顯示中文)
font_path = 'assets/font/FZZhuoYTJ.ttf'
# 進行詞雲的基本設置(背景色,字體路徑,背景圖片,詞間距)
wc = WordCloud(background_color="white",font_path=font_path, mask=b_mask, margin=5)
# 生成詞雲
wc.generate(wl_space_split)
# 顯示詞雲
plt.imshow(wc)
plt.axis("off")
plt.show()
# 將詞雲圖保存到本地
path = os.getcwd()+'/output/'
wc.to_file(path+file_name)
複製代碼
分析完了「李鬼」,咱們有必要請出他的真身「李逵」兄弟了,一樣仍是和以前同樣的套路,先找到數據,而後分詞統計詞頻,這裏就不重複操做了,直接放出詞雲圖。
看到這圖是否是以爲和翟的詞雲圖異常類似,那麼,這「真假李逵」之間到底有多像呢?接下來咱們來計算下兩篇文章的類似度吧。
文章類似度的比較有不少種方法,使用的模型也有不少類別,包括TF-IDF,LDA,LSI等,這裏方便起見,就只使用TF-IDF來進行比較了。
TF-IDF 實際上就是在詞頻 TF 的基礎上再加入 IDF 的信息,IDF 稱爲逆文檔頻率,不瞭解的能夠看下阮一峯老師的講解:www.ruanyifeng.com/blog/2013/0…,裏面對 TFIDF 的講解也是十分透徹的。
scikit-learn 也簡稱 sklearn, 是機器學習領域當中最知名的 Python 模塊之一,官方地址爲:github.com/scikit-lear… Sklearn 中的模塊TfidfVectorizer來計算兩篇文章之間的類似度,代碼以下:
# 計算文本類似度
def calculateSimilarity(s1, s2):
def add_space(s):
return ' '.join(cleanWord(s))
# 將字中間加入空格
s1, s2 = add_space(s1), add_space(s2)
# 轉化爲TF矩陣
cv = TfidfVectorizer(tokenizer=lambda s: s.split())
corpus = [s1, s2]
vectors = cv.fit_transform(corpus).toarray()
# 計算TF係數
return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))
複製代碼
除了Sklearn,咱們還可使用gensim調用一些模型進行計算,考慮到文章篇幅,就由讀者本身去搜集資料實現吧。
咱們將翟的論文和陳的論文分別傳入該函數後,輸出結果爲:
兩篇文章的類似度爲:
0.7074857881770839
複製代碼
其實這個結果我仍是挺意外的,只知道這「李鬼」長得像,卻沒想到類似度居然高達70.7%。固然,做爲弟弟,翟的這個事和吳秀波的事比起來,那都不是個事。🙈
完整源碼可在公衆號:「01二進制」後臺回覆:「翟天臨」獲取