ソーシャルネットワークに基づく情緒化分析III


ソーシャルネットワークに基づく情緒化分析III
Byシロクマ花畑(http://blog.csdn.net/whiterbear)転載には出典を明記する必要があります.ありがとうございます.
前に微博データのキャプチャ,簡単な処理を行い,この編では学校微博の類似度分析を行った.
マイクロ博類似度分析
ここでは任意の2つの学校間の微博用語の類似度を計算しようとした.
構想:まず学校の微博に対して分詞を行い、各学校の高周波用語辞典を遍歴して取得し、用語ベースベクトルを構築し、このベースベクトルを用いて各学校の用語ベクトルを構築し、最後にTF-IDFアルゴリズムと余弦関数を用いて2つの学校の微博間の類似度を計算する.
注意:TF-IDFアルゴリズムとコサイン関数は、私が前に記録したブログを参照することができます.コサイン関数の計算にはnumpyモジュールを用いた.
学校用語辞典を取得する
学校別に、各学校の微博はまず分詞を行い、各学校の用語辞典worddictを取得し、worddictをpickle方式でローカルに保存する.
疑似コードは次のとおりです.
word_results =          
#            ,   worddict   
for r in word_results:
    for w in r[0].split():
        if worddict.has_key(w) == False:
            worddict[w] = 1
        else:
            worddict[w] += 1
#      pickle         
save_to_pickle_file(worddict)

学校の高周波用語辞典を取得する
前の学校用語辞典を用いて,遍歴し,出現回数が10回以上のフレーズを抽出し,その学校の高周波用語辞典として保存し,pickle方式で保存した.
疑似コードは次のとおりです.
#      
highworddict = {}
for word in worddict:
    if worddict[word] > 10:
        highworddict[word] = worddict[word]
#      pickle         
save_to_pickle_file(highworddict)

ベースベクトルの構築
与えられた2つの学校の高周波用語辞書を1つのベースベクトルに組み合わせた.ベースベクトルを構築する意味は,このように2つの学校のすべての高周波用語がベースベクトルに特定の対応する位置を有し,後で対応する学校の用語ベクトルを構築するのに便利である.
疑似コードは次のとおりです.
#      
baseworddict = {}
#                   
for word in highworddict1:
    if baseworddict.has_key(word) == False:
        baseworddict[word] = 1
#                   
for word in highworddict2:
    if baseworddict.has_key(word) == False:
        baseworddict[word] = 1
#      
basewordlist = []
#  dict   list    ,                  
for bd in baseworddict:
    basewordlist.append(bd)

学校用語ベクトルの構築
ベースベクトルなどの長さのlistを2つ構築し,学校高周波辞書に現れるすべての語に対応する数値を与え,学校高周波辞書に現れないすべての語に1を与える.
疑似コードは次のとおりです.
#       
school1_list = []
school2_list = []
#                    
for i in basewordlist:
    #                                 ,      ,     1
    if highworddict1.has_key(i) == True:
        school1_list.append(highworddict1[i])
    else:
        school1_list.append(1)

for i in basewordlist:
    if highworddict2.has_key(i) == True:
        school2_list.append(highworddict2[i])
    else:
        school2_list.append(1)

TF-IF値の計算
前の学校用語ベクトルを用いて語周波数値を計算し,idfドキュメントと組み合わせてtf*idf値を計算する.
疑似コードは次のとおりです.
#           
sum_school_1,sum_school_2 = sum(school1_list),sum(school2_list)
#         tf    
for i, value in enumerate(school1_list):
    school1_list[i] =  school1_list[i]*1.0/sum_school_1 * 1
for i, value in enumerate(school2_list):
    school2_list[i] =  school2_list[i]*1.0/sum_school_2 * 1
#   idf  ,       idf   
idfdict = get_idf_dict()
#      idf  
for i, value in enumerate(basewordlist):
    if idfdict.has_key(value.encode('utf-8')) == True:
        basewordlist[i] = idfdict[value.encode('utf-8')]
    else:
        basewordlist[i] = 3
#         tf*idf  
for i, value in enumerate(school1_list):
    school1_list[i] =  school1_list[i] * basewordlist[i]
for i, value in enumerate(school2_list):
    school2_list[i] =  school2_list[i] * basewordlist[i]

コサイン値の計算
最後にnumpyモジュールを使用して、学校の常用語tf-idfリスト間の余弦値を計算します.
疑似コードは次のとおりです.
#    numpy  
array_1,array_2 = np.array(school1_list),np.array(school2_list)
#          
len_1, len_2 = np.sqrt(array_1.dot(array_1)), np.sqrt(array_2.dot(array_2))
#      cos 
cos_angle = array_1.dot(array_2)/(len_1*len_2)
#        
angle = np.arccos(cos_angle)

結果
各学校の高周波(出現回数が10回より大きい)用語の数は3千〜4千程度であり,任意の2つの学校間の高周波語の差は500程度である.
任意の2つの学校の微博高周波用語の類似度の結果は:
学校の名称
大工
清華
北大
南大
華政
大工
33.35
34.21
28.25
32.37
清華
33.35
24.77
24.46
32.86
北大
34.21
24.77
26.16
33.50
南大
28.25
24.46
26.16
27.36
華政
32.37
32.86
33.50
27.36
上の表から分かるように、5つの学校の微博用語の類似度は大きくなく、いずれの学校の用語の類似度も30度前後である.一方,コサイン角度の値は[0,90]であり,0度は完全に同じ,90度は完全に無関係であり,30度は比較的類似していると考えられる.
まとめ
ここでのベースベクトル構築は,2つの学校間の高周波用語を用いて構築され,10組の比較を行い,10組のベースベクトルを構築したが,このようにベースベクトルを構築する方式は適切ではなく,すべての用語を含む1つのフレーズをベースベクトルとし,これに基づいて微博類似度の比較を行うべきであると考えられる.もちろん、ここでTF-IDFの使用はひょうたんに描かれているだけで、このようにして得られた結果が2つの学校の用語の類似度を代表しているかどうかは分からない.
次は、マイクロブログの類似度分析です.