本文首发地址:
https://yishuihancheng.blog.csdn.net/article/details/98854135
欢迎大家去我的博客去看,感觉CSDN博客的阅读效果比这里的要好,包括:整体的布局、代码格式化等方面,阅读体验会好点。
这里从百度百科里面拿来关于“wordnet”的定义和介绍:
WordNet是由Princeton 大学的心理学家,语言学家和计算机工程师联合设计的一种基于认知语言学的英语词典。它不是光把单词以字母顺序排列,而且按照单词的意义组成一个“单词的网络”。它是一个覆盖范围宽广的英语词汇语义网。名词,动词,形容词和副词各自被组织成一个同义词的网络,每个同义词集合都代表一个基本的语义概念,并且这些集合之间也由各种关系连接。WordNet包含描述概念含义,一义多词,一词多义,类别归属,近义,反义等问题,访问以下网页,可使用wordnet的基本功能http://wordnetweb.princeton.edu/perl/webwnwwordnet官网在这里:https://wordnet.princeton.edu/
鉴于wordnet本身的性质,我们想到了可以借助于同一词典网络的形式来计算词语之间的相似度,具体的实现很简单,核心的思想就是:同义词汇数据。具体的代码实现如下:
#!usr/bin/env python#encoding:utf-8from __future__ import division'''__Author__:沂水寒城功能: 基于 WordNet 的词语相似度计算分析''' import sysimport numpy as npimport pandas as pdfrom scipy import statsfrom nltk.corpus import wordnet as wnfrom sklearn.preprocessing import MinMaxScaler, Imputer reload(sys)sys.setdefaultencoding('utf-8') def loadData(data='data.csv'): ''' 加载数据集 ''' data=pd.read_csv(data) word_list=np.array(data.iloc[1:,[0,1]]) self_sim_res=np.array(data.iloc[1:,[2]]) return word_list,self_sim_resdef calWordSimilarity(word_list,self_sim_res,res_path='wordnetResult.csv'): ''' 计算词语相似度 ''' self_sim_matrix=np.zeros( (len(self_sim_res),1)) for i,word_pair in enumerate(word_list): word1,word2=word_pair count=0 synsets1=wn.synsets(word1) synsets2=wn.synsets(word2) print 'synsets1: ',synsets1 print 'synsets2: ',synsets2 for synset1 in synsets1: for synset2 in synsets2: score=synset1.path_similarity(synset2) if score is not None: self_sim_matrix[i,0]+=score count+=1 else: pass self_sim_matrix[i,0]=self_sim_matrix[i,0]*1.0/count imputer=Imputer(missing_values='NaN', strategy='mean', axis=0) imputer_list=imputer.fit_transform(self_sim_matrix) scaler=MinMaxScaler(feature_range=(0.0,10.0)) imputer_list_scale=scaler.fit_transform(imputer_list) (coefidence,p_value)=stats.spearmanr(self_sim_res,imputer_list_scale) print 'coefidence: ',coefidence print 'p_value: ',p_value submitData=np.hstack((word_list,self_sim_res,imputer_list_scale)) (pd.DataFrame(submitData)).to_csv(res_path,index=False, header=["Word1