随笔记录——gensim word2vector使用

一、对比各种文本embedding方式:

  • onehot: 逻辑简单,易实现,但是过于稀疏,无法表达权重
  • 词袋模型:逻辑简单,易实现,增加了词频表达,但仍过于稀疏
  • TF-IDF: 是一种用来计算每个单词重要性的关键词抽取的方法,通过计算词频和逆文本频率,在考虑效率的同时也得到了比较满意的效果。但是文本的维度仍然很高、且不能准确表示文本语义
  • word2vec: 维度可控,这是一种基于统计方法来获得词向量的方法,他是 2013 年由谷歌的 Mikolov 提出了一套新的词嵌入方法。这种算法有2种训练模式:1)通过上下文来预测当前词 2)通过当前词来预测上下文
  • bert:使用神经网络做词嵌入, 相对来说效果最好。

二、对比各种文本embedding方式:

实现例子:这里是处理文本翻译数据集,这里使用word2vec进行词嵌入

# -*- codeing = utf-8 -*-
# @Time: 2018/10/9 10:48

import pandas as pd
from gensim.models import word2vec
from gensim import models
import re

seg_file_path_en = '../data/trans/en_seg.txt'
seg_file_path_fr = '../data/trans/fr_seg.txt'
model_path_en = '../data/trans/model_en.bin'
model_path_fr = '../data/trans/model_fr.bin'

# 读取停用词
def readfile(filename):
    datalist = []
    with open(filename, 'r',encoding='utf-8') as f:
        for line in f.readlines():
            linestr = line.strip()
            datalist.append(linestr)
    dataset= set(datalist)
    return dataset# 读取语料,将语料转化为set集合

stopwordset = set()
stopwordset = readfile('../data/trans/stopwords.txt')

# word2vec
def seg_line(line):
    # 去除特殊符号
    p = re.compile('《》?“”‘’![\\]^_`{|}~]')
    line = re.sub(p, '', line)
    # 去除停用词
    words = line.split(' ')
    line_done = ''
    for word in words:
        if word not in stopwordset and len(word.strip()) > 0:
            line_done = line_done + word + ' '
    return line_done
# part=0 英文, part=1 法文
def seg(input_file, output_file, part=0):
    output = open(output_file, 'w')
    for index, line in enumerate(open(input_file, 'r')):
        part_line = line.split('\t')[part]
        linestr = part_line.strip()
        line_done = seg_line(linestr)
        output.write(line_done + '\r\n')
        if index % 10000 == 0:
            print("已完成前 %d 行的分词" % index)

def gen_seg_file():
    # 英文
    seg('../data/trans/fra.txt', seg_file_path_en, 0)
    # 法文
    seg('../data/trans/fra.txt', seg_file_path_fr, 1)


def train_file(outputfilename, modelpath):
    sentences = word2vec.Text8Corpus(outputfilename)
    model = word2vec.Word2Vec(sentences, min_count=1, vector_size=256)  # size = 向量维度, min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5, window:即词向量上下文最大距离,默认为5
    # Save our model.
    model.save(modelpath)

def train():
    train_file(seg_file_path_en, model_path_en)
    train_file(seg_file_path_fr, model_path_fr)


def predict(modelpath):
    model = models.Word2Vec.load(modelpath)
    while True:
        try:
            query = input()
            q_list = query.split()

            if len(q_list) == 1:
                print("相似詞前 10 排序")
                # 这里和之前版本有些不同,之前是model.most_similar()
                res = model.wv.most_similar(q_list[0],topn = 10)
                for item in res:
                    print(item[0]+","+str(item[1]))

            elif len(q_list) == 2:
                print("計算 Cosine 相似度")
                res = model.wv.similarity(q_list[0],q_list[1])
                print(res)
            else:
                 break
            print("----------------------------")
        except Exception as e:
            print(repr(e))

# gen_seg_file()
# train()
predict(model_path_en)

你可能感兴趣的:(pytorch,个人学习笔记——初版,word2vec,python,机器学习)