兩中文稿相似度分析 (Similarity)

分詞後文件一

鴻夏戀 26 日 再 傳 破局,夏普 表明 未來 不 排除 其他 籌資辦法,不過 鴻海 回應,到 2015 年 3 月 26 日前,雙方 都 還 有 談判機會,為什麼 鴻海 一定 要 拿 下 夏普 股權,專家 認為,鴻海 發展 自家 大 電視 品牌「睿俠」,用 的 就 是 夏普 面板,如果 鴻海 的 品牌 之 路 要 走 得 穩,夏普 的 技術 將 是 一 大 助力,另外 鴻海 董事長 郭台銘 這麼 勤於 奔走、與 夏普 周璇,為 的 也 是 背後 老大哥 蘋果,如果 能 成功 讓 美日台 連線 敗部復活,去 三星 化 對 台廠 更是 一 大 利多。

分詞後文件二

蘋果 成長 性 日 漸 疲弱,夏普 轉向 三星 懷抱,已 是 既定 政策,未來 3 年,夏普 不 僅 要 布局 智慧 手機,車 用 中 小 型 面板,海外 東南亞 市場,也 要 利用 三星 知名 度,擴大 冰箱、洗衣機 等 家電 銷售量。另外 三星 向來 覬覦 的 多 功能 事務機,也 可能 攜手 合作,讓 原本 處於 競爭 的 日韓 關係,進入 全新 階段。林宏文:「白色 家電 如果 要 幫 三星 去 做 代工,打 韓國 跟 其他 國家 市場,這 其實 也 正 中 了,三星 現在 的 想法,因為 三星 最 大 的 勁敵,其實 是 LG 樂金,樂金 在 白色 家電,其實 是 全 世界 第 一。」夏普 公布 營收 後,鴻海 也 公布 第 一 季 財報,雖然 稅後盈餘,比 去 年 同期 增加,但 營益率 卻 不 到 2 %,每股 獲利 只 有 1.38 元,蘋果 光芒 黯淡,負面 效應 日 漸 顯,未來 鴻夏戀 能 否 露出 一絲曙光,沒 有 定論 前,這 段 鴻夏戀 還 有 得 談。

公式及原理

程式列表

#!/usr/bin/env python # -*- coding: utf-8 -*- # 作業系統 import os import sys # 字碼轉換 import codecs # 科學運算 import numpy as np import numpy.linalg as LA # 文字處理 import nltk from nltk.corpus import stopwords # 移除中文停詞 def removeChineseStopWords(textFile): newTextFile = textFile chineseFilter1 = [u',', u'。', u'、', u';', u':', u'?', u'「', u'」'] for chin in chineseFilter1: newTextFile = newTextFile.replace(chin, ' ') return newTextFile # 讀取中文檔案 def getTokensFromFile(textFileName): textFileHandle = codecs.open(textFileName, 'rU','utf8') textContent = textFileHandle.read() for word in stopwords.words('english'): textContent = textContent.replace(word, ' ') textTokens = nltk.word_tokenize(removeChineseStopWords(textContent)) textFileHandle.close() return textTokens # 字詞頻度表 def getTokenFreqList(textTokens): tokenFrequency = nltk.FreqDist(textTokens) # 刪除單一字 for word in tokenFrequency: if len(word) == 1: tokenFrequency.pop(word) # 刪除數字 for word in tokenFrequency: try: val = float(word) tokenFrequency.pop(word) except: pass # 刪除廢詞 chineseFilter = [u'可能', u'不過', u'如果', u'恐怕', u'其實', u'進入', u'雖然', u'這麼', u'處於', u'因為', u'一定'] for word in tokenFrequency: if word in chineseFilter: tokenFrequency.pop(word) return tokenFrequency # 輸出字詞頻度表 def OutputDocWordFreq(wordFrequency): for word in wordFrequency: print '"%s",%d' % (word, wordFrequency[word]) # 計算 2 向量間距離 def getDocDistance(a, b): if LA.norm(a)==0 or LA.norm(b)==0: return -1 return round(np.inner(a, b) / (LA.norm(a) * LA.norm(b)), 4) # 計算文件相似度 def getDocSimilarity(wordFrequencyPair, minTimes=1): dict1 = {} for key in wordFrequencyPair[0].keys(): if wordFrequencyPair[0].get(key, 0) >= minTimes: dict1[key] = wordFrequencyPair[0].get(key, 0) dict2 = {} for key in wordFrequencyPair[1].keys(): if wordFrequencyPair[1].get(key, 0) >= minTimes: dict2[key] = wordFrequencyPair[1].get(key, 0) for key in dict2.keys(): if dict1.get(key, 0) == 0: dict1[key] = 0 for key in dict1.keys(): if dict2.get(key, 0) == 0: dict2[key] = 0 v1 = [] for w in sorted(dict1.keys()): v1.append(dict1.get(w)) print "(1)", w, dict1.get(w) v2 = [] for w in sorted(dict2.keys()): v2.append(dict2.get(w)) print "(2)", w, dict2.get(w) result = 0 try: result = getDocDistance(v1, v2) except(RuntimeError, TypeError, NameError): pass return result # 主程式 if __name__=="__main__": if len(sys.argv) < 2: print(u'需要輸入 2 份文件') exit() trainFileName = sys.argv[1] trainTokens = getTokensFromFile(trainFileName) trainTokenFrequency = getTokenFreqList(trainTokens) testFileName = sys.argv[2] testTokens = getTokensFromFile(testFileName) testTokenFrequency = getTokenFreqList(testTokens) wordFrequencyPair = [trainTokenFrequency, testTokenFrequency] print getDocSimilarity(wordFrequencyPair, 1)

運行結果