Word2Vec + Jieba 分词实现视频标签距离计算

来源:互联网 发布:ubuntu 无法安装 编辑:程序博客网 时间:2024/06/03 19:04

Word2Vec + Jieba 分词实现视频标签距离计算

看[Word2vec][1]有一点时间了,不是很理解里面的算法所以决定先亲手实践试试看。

  • 分词实现
  • Word2vec学习实现

分词实现

首先将文章保存成了txt的格式,用python读取txt,并最终将分词结果存入txt文件中。其中还做了一次编码转换。

#coding:utf8import jieba# 文字转码 保留片段conv_input_file_name = 'a.txt'conv_output_file_name = 'b.txt'def ucodeConvert(conv_input_file_name,conv_output_file_name):    fin = open(conv_input_file_name, 'r')    fout = open(conv_output_file_name, 'w')    line = fin.readline()    while line:        try:            newline = line.decode('GB2312').encode('utf-8')        except UnicodeError:            print 'Unicode Convert Error'            break        else:            print >> fout,newline            line = fin.readline()        finally:            fin.close()            fout.close()    print 'Convertion end'#分词 seg_input_file_name = 'input_doc.txt'seg_output_file_name = 'segment_result.txt'def wordSegment (seg_input_file_name, seg_output_file_name):    fin = open(seg_input_file_name,'r')    fout = open(seg_output_file_name, 'w')    line = fin.readline()    while  line:        newline = jieba.cut(line,cut_all=False)        str_out =( ' '.join(newline).encode('utf-8')        .replace(',',' ').replace('!',' ').replace('?',' ').replace('。',' ')        .replace('(',' ').replace(')',' ').replace('《',' ').replace('》',' ')        .replace('“',' ').replace('”',' ').replace(';',' ').replace(':',' ')        .replace('~',' ').replace('-',' ').replace('——',' ').replace('+',' ')        .replace('=',' ').replace('*',' ').replace('&',' ').replace('%',' ')        .replace('、',' ').replace('、',' ').replace('.',' ').replace('_',' ').replace('\n',' '))        print str_out        print >> fout,str_out        line = fin.readline()    fin.close()    fout.close()#  MainucodeConvert(conv_input_file_name,conv_output_file_name)wordSegment(seg_input_file_name,seg_output_file_name)

这样便处理好了分词。
尚需改进的地方: 单字的删除,重复词词频的查询,自定义词典。

Word2vec

接下来用Word2vec将所有的分词滚一遍,看看能出现什么样的结果(这里我们只注重近义词,反义词;或者说逻辑上有关联的词,和逻辑上无关联的词)

首先是建立模型:

# create modeldef createModel(model_file_name,sentences):    model = w2v.Word2Vec(sentences, size=50, window=5, min_count=1, workers=4)    model.save(model_file_name)

其中参数的意义和设置建议参考: [gensim函数库的Word2Vec的参数说明]

接下来计算词之间的距离:

# calculate distance between two wordsdef matchDistance(x,list_name,model):    temp1 = x    distances=[]    for y in list_name:        temp2 = y           temp1 = unicodeConvert(temp1)        temp2 = unicodeConvert(temp2)        distances.append(model.similarity(temp1,temp2))         result_distance.append(distances)

这里在utf8转码问题上卡了很久,建议参考 [玩转Python让人讨厌的编码问题]

在此之外还应注意两点:

1.在将字符串转为list时,换行符会被加在元素尾部,输出时需要将‘’\n‘’去掉再进行输出。
解决办法:
1. 直接去除末尾项

 f = open(tag_file_name,'r')    tagger = []     # convert file to list    for line in f.readlines():        tagger.append(line.decode('utf-8')[:-1])

2. 在读取utf8文件时,分为with BOM 和 without BOM两种,在with BOM的情况下,字符串会多一个\ufeff前缀。这时要去掉前缀才能顺利转码。
解决办法:
1. 解码去除BOM

def unicodeConvert(x):    try:        model.similar_by_word(x)    except:        x = x.encode('utf-8').decode('utf-8-sig')    else:        pass    return x
  1. 直接去除‘\ufeff’(受jieba源码启发)
def checkBOM(x):try:    x = x.lstrip('\ufeff')except UnicodeDecodeError:raise ValueError('dictionary filr %s must be utf-8' % filename)return x

如果有其他问题可以随时沟通:

联系方式 QQ 3381541672
原创粉丝点击