兩中文稿相似度分析 (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)

運行結果

文件 1
(1) LG 0 (1) 一絲曙光 0 (1) 三星 1 (1) 世界 0 (1) 事務機 0 (1) 代工 0 (1) 光芒 0 (1) 全新 0 (1) 公布 0 (1) 其他 1 (1) 冰箱 0 (1) 利多 1 (1) 利用 0 (1) 功能 0 (1) 助力 1 (1) 勁敵 0 (1) 勤於 1 (1) 原本 0 (1) 另外 1 (1) 台廠 1 (1) 合作 0 (1) 同期 0 (1) 向來 0 (1) 周璇 1 (1) 品牌 2 (1) 回應 1 (1) 國家 0 (1) 增加 0 (1) 夏普 5 (1) 奔走 1 (1) 定論 0 (1) 家電 0 (1) 專家 1 (1) 市場 0 (1) 布局 0 (1) 想法 0 (1) 懷抱 0 (1) 成功 1 (1) 成長 0 (1) 手機 0 (1) 技術 1 (1) 排除 1 (1) 擴大 0 (1) 攜手 0 (1) 政策 0 (1) 效應 0 (1) 敗部復活 1 (1) 既定 0 (1) 日前 1 (1) 日韓 0 (1) 智慧 0 (1) 更是 1 (1) 未來 1 (1) 東南亞 0 (1) 林宏文 0 (1) 樂金 0 (1) 每股 0 (1) 洗衣機 0 (1) 海外 0 (1) 為什麼 1 (1) 營收 0 (1) 營益率 0 (1) 獲利 0 (1) 現在 0 (1) 疲弱 0 (1) 發展 1 (1) 白色 0 (1) 睿俠 1 (1) 知名 0 (1) 破局 1 (1) 稅後盈餘 0 (1) 競爭 0 (1) 籌資辦法 1 (1) 美日台 1 (1) 老大哥 1 (1) 股權 1 (1) 背後 1 (1) 自家 1 (1) 董事長 1 (1) 蘋果 1 (1) 表明 1 (1) 覬覦 0 (1) 認為 1 (1) 談判機會 1 (1) 負面 0 (1) 財報 0 (1) 轉向 0 (1) 連線 1 (1) 郭台銘 1 (1) 銷售量 0 (1) 關係 0 (1) 階段 0 (1) 雙方 1 (1) 電視 1 (1) 露出 0 (1) 面板 1 (1) 韓國 0 (1) 鴻夏戀 1 (1) 鴻海 5 (1) 黯淡 0
文件 2
(2) LG 1 (2) 一絲曙光 1 (2) 三星 6 (2) 世界 1 (2) 事務機 1 (2) 代工 1 (2) 光芒 1 (2) 全新 1 (2) 公布 2 (2) 其他 1 (2) 冰箱 1 (2) 利多 0 (2) 利用 1 (2) 功能 1 (2) 助力 0 (2) 勁敵 1 (2) 勤於 0 (2) 原本 1 (2) 另外 1 (2) 台廠 0 (2) 合作 1 (2) 同期 1 (2) 向來 1 (2) 周璇 0 (2) 品牌 0 (2) 回應 0 (2) 國家 1 (2) 增加 1 (2) 夏普 3 (2) 奔走 0 (2) 定論 1 (2) 家電 3 (2) 專家 0 (2) 市場 2 (2) 布局 1 (2) 想法 1 (2) 懷抱 1 (2) 成功 0 (2) 成長 1 (2) 手機 1 (2) 技術 0 (2) 排除 0 (2) 擴大 1 (2) 攜手 1 (2) 政策 1 (2) 效應 1 (2) 敗部復活 0 (2) 既定 1 (2) 日前 0 (2) 日韓 1 (2) 智慧 1 (2) 更是 0 (2) 未來 2 (2) 東南亞 1 (2) 林宏文 1 (2) 樂金 2 (2) 每股 1 (2) 洗衣機 1 (2) 海外 1 (2) 為什麼 0 (2) 營收 1 (2) 營益率 1 (2) 獲利 1 (2) 現在 1 (2) 疲弱 1 (2) 發展 0 (2) 白色 2 (2) 睿俠 0 (2) 知名 1 (2) 破局 0 (2) 稅後盈餘 1 (2) 競爭 1 (2) 籌資辦法 0 (2) 美日台 0 (2) 老大哥 0 (2) 股權 0 (2) 背後 0 (2) 自家 0 (2) 董事長 0 (2) 蘋果 2 (2) 表明 0 (2) 覬覦 1 (2) 認為 0 (2) 談判機會 0 (2) 負面 1 (2) 財報 1 (2) 轉向 1 (2) 連線 0 (2) 郭台銘 0 (2) 銷售量 1 (2) 關係 1 (2) 階段 1 (2) 雙方 0 (2) 電視 0 (2) 露出 1 (2) 面板 1 (2) 韓國 1 (2) 鴻夏戀 2 (2) 鴻海 1 (2) 黯淡 1
相似度:0.3078
ċ
兩中文相似度.py
(3k)
李智,
2013年5月16日 下午11:18