从新闻中的地名共现看中国各地的联系强度(二) — 共现地名相似度计算

相似度度量(Similarity),即计算个体间的相似程度,相似度度量的值越小,说明个体间相似度越小,相似度的值越大说明个体差异越大。本实验采用了成熟的向量空间余弦相似度方法计算相似度。

物以类聚,人以群分

上周小毅从定性的角度简单分析了中国省份之间的联系(从新闻中的地名共现看中国各地的联系强度)。正这篇博文小毅将从定量的角度为大家揭开地名区域之间内在联系的面纱。

本次实验继续使用爬取的12月新浪新闻数据3015篇,其中包含省级和城市级地名的文章有2489篇,实际抽取到省级地名有4744个(每篇文档中统一地名只算一次),省级共现对(tuple)数量9124组。

假定一:地名共现次数越多,那么两个地名之间的联系越强

根据上面的假定一,我们可以把省级地名共现元组(tuple)转换为,一个34*34的权重矩阵,用于表示省级地名联系紧密程度。其中,矩阵的每项值为对应两地名的共现次数(详见图1)。其中斜对角线,暂时均为0,右上角和左下角对称。

alt 图1 省级地名联系紧密程度的权重矩阵

然后将矩阵的每个元素除以所在行(或者列)的元素之和,是的元素之间的相似度在[0, 1]之间。并且,由于同一个地名之间肯定是完全相似的,因此将主对角线上的元素赋值1。这样经过处理的地名联系紧密权重矩阵完成,如图2所示。

alt 图2 经过处理的省级地名联系紧密程度的权重矩阵局部细节

这样就成功构建每一列为指定省份与其他省份联系强度的权重向量。随之而来的一个重要问题就是,如何通过权重矩阵计算出任意两个省份之间的联系强度呢?尽管通过归一化了省份地名的共现频数,但是通过这种简单的方法,感觉对于结果的置信度角度较低。那如何更好地计算两个向量的相似性呢?这里我将为大家介绍一种计算相似度的利器余弦相似度(或者叫做余弦距离)

余弦相似度(Cosine Similarity)

余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近0,就表明两个向量完全不相似(空间中完全相反的方向);夹角余弦值越接近1,就表明两个向量完全相似(空间中向量的方向完全一致)。

注:非常抱歉,由于我的疏忽笔误,之前把上面余弦值与相似度的关系写反了,现在已纠正,希望各位大虾们拍砖~

alt

公式

对于二维空间,根据向量点积公式,可得到:

alt

设向量 A=(A1,A2,...,An), B=(B1,B2,...,Bn),推广到多维: alt

参考代码[1]

def cos_dist(a, b):  
    if len(a) != len(b):
        return None
    part_up = 0.0
    a_sq = 0.0
    b_sq = 0.0
    for a1, b1 in zip(a,b):
        part_up += a1*b1
        a_sq += a1**2
        b_sq += b1**2
    part_down = math.sqrt(a_sq*b_sq)
    if part_down == 0.0:
        return None
    else:
        return part_up / part_down

实验

利用上述方法计算得到北京、上海、广东和香港的相似度情况,如下表1所示:

表1 北京,上海,广东和香港与其他省份的相似度值

北京市 上海市 广东省 香港特区
北京市1.0000000.2790420.1844610.221286
天津市0.2904030.1421140.0998800.102845
河北省0.2812830.1173780.0951810.072446
山西省0.1966780.0946840.0949110.066354
内蒙古自治区0.1336600.0843560.0763700.041769
辽宁省0.1290930.1036460.0941240.062877
吉林省0.1140080.1101210.0951910.047101
黑龙江省0.1313240.0988650.0990020.060736
上海市0.2790421.0000000.1347110.184085
江苏省0.1465700.1257700.1246160.080718
浙江省0.1554580.1483840.1143500.090932
安徽省0.1489590.1074950.1144630.080206
福建省0.1567920.1088740.1360230.111139
江西省0.1179940.0955680.1095350.071582
山东省0.1979140.1157290.0994340.064081
河南省0.2279100.1120650.1189650.089421
湖北省0.1515720.1184920.1200860.058801
湖南省0.1387000.0957370.1516080.087505
广东省0.1844610.1347111.0000000.174107
广西自治区0.1184610.0780690.1551110.062930
海南省0.1326210.1000720.1241590.064681
重庆市0.1420580.1093610.1087990.066249
四川省0.1295230.1083520.1217140.080136
贵州省0.1169080.0722180.1171010.051425
云南省0.1208330.0776950.1109470.071805
西藏自治区0.1225560.0967440.0614940.087098
陕西省0.1572850.0925380.0957650.039408
甘肃省0.0952340.0851820.0846980.043829
青海省0.0995260.0797950.0905250.051090
宁夏自治区0.1021570.0911730.0852310.034171
新疆自治区0.1591860.0836720.0835630.060667
台湾省0.1970470.1647270.1075060.225533
香港特区0.2212860.1840850.1741071.000000
澳门特区0.2105270.0903950.1123850.283886

接下来,我们通过上图工具,可视化看看效果,详见图3~6。其中,可以发现北京的分布特点体现出是明显满足地理学第一定律的(地理相似定律)。其中发现了两个非常有意思的区域,新疆、台湾从距离上离北京比较远,但是与北京的相似度特别高,我相信聪明的读者应该知道为什么啦~

图3 北京与其他省份相似度分布图

与上海关联相密切的则是东南沿海各个区域,体现出了东南沿海经济区这一重要的经济分布特点。

图4 上海与其他省份相似度分布图

广东则与北京类似,主要是和周围的省份联系的更加紧密一些。

图5 广东与其他省份相似度分布图

香港的相似度分布虽然也有一定的和相近的省份相似度大,但是整体呈现更多的是随机分布特点。

图6 香港与其他省份相似度分布图

总结

本文通过在前一篇博文的基础上,利用余弦相似度定量的计算了两个地名之间的相似度,从文本语料的角度探究了地名之间内在的联系强度。正如开头所说的人以类聚,物以群分,有人相似度,我们如何实现了地理对象的聚类呢?持续关注GeoHey博客,下一篇小毅将会告诉你答案。

参考:

[1] http://www.coder4.com/about

欢迎从GeoHey获取地理和位置相关的数据、知识、服务

访问网站 http://geohey.com

联系我们 contact@geohey.com

长按关注公众号

小毅

Just be myself !

北京