做数据挖掘作业用到词向量,拿这个做个例子:

1、分词

import jieba

with open('jueji.txt', encoding='utf-8') as fp:
    lines = fp.readlines()
    jieba.add_word('麒零')
    for line in lines:
         seg_list = jieba.cut(line)
         with open('jueji_out.txt', 'a', encoding='utf-8') as ff:
              ff.write(' '.join(seg_list)) # 词汇用空格分开
从网上下一个爵迹.txt然后就可以开始了。jieba的字典中没有'麒零'这个词,默认的分词结果会把他和前/后一个字连起来…所以使用add_word(word, freq=None, tag=None)在程序中动态修改词典

结果展示:

南方 只是 开始 不易 察觉 地 降温 , 凌晨 的 时候 窗棂 上 会 看见 霜花 , 但是 在 这里 — — 大陆 接近 极北 的 尽头 , 已经 是 一望无际 的 苍茫 肃杀 。 大块 大块 浮动 在 海面 上 的 冰山 彼此 不时 地 撞击 着 , 在 天地间 发出 巨大 的 锐利 轰鸣声 , 坍塌 的 冰块 砸 进 大海 , 掀起 白色 的 浪涛 。 辽阔 的 黑色 冻土 在 接连 几天 的 大雪 之后 , 变成 了 一片 茫茫 的 雪原 。 这 已经 是 深北 之 地 了 , 连绵不断 的 冰川 仿佛 怪兽 的 利齿 般 将 天地 的 尽头 紧紧 咬 在 一起 , 地平线 消失 在 刺眼 的 白色 冰面 之下 。

2、模型训练

from gensim.models import word2vec

sentences = word2vec.Text8Corpus('jueji_out.txt') # 加载语料

model = word2vec.Word2Vec(sentences) # 训练模型
model.save('jueji.model') # 保存模型,之后打印阶段可以注释掉该行和上一行
model = word2vec.Word2Vec.load('jueji.model') # 加载模型
3、打印结果
for e in model.wv.most_similar(positive=['麒零'], topn=10):
	print(e[0], e[1])
和'麒零'最相似的10个词:

银尘 0.9959095120429993 看 0.9842573404312134 了 0.9823709726333618 。 0.9747525453567505 抱歉 0.9689645767211914 漆拉望 0.9674007892608643 说完 0.966944694519043 看着 0.966761589050293 回地 0.9658923745155334 哎 0.9619323015213013

print(model.wv.similarity('麒零', '银尘'))

计算'麒零'和'银尘'这两个词的相似度:

0.9959094


print(model['麒零'])

输出'麒零'这个词向量,是一个一行100维的向量

[ 0.26481858 0.15234216 -0.3840297 -0.2042361 -0.06220098 0.04188246
 -0.66040015 0.44777456 0.531216 0.45691636 0.0550052 -0.69729084
 -0.22845572 0.47113973 -0.5303837 -0.45453674 0.5070296 -0.06303952
 0.31998253 -0.5031252  0.4189738  0.07159474 -0.19918226 -0.14445662
 0.3662445 -0.5232391 -0.45905274 0.11144456 -0.10949319 0.11986741
 0.06463482 0.25333133 -0.12797745 -0.9087182 -0.9490329  0.38584322
 0.17346244 0.24128036 -0.2922086 -0.61662203 0.09252726 -0.24353217
 0.37847757 0.4794919  0.37694818 -0.35219407 -0.8497689 -0.15116379
 -0.72777176 0.01539514 -0.2824035 -0.87565887 -0.3142328  0.2567049
 -0.29067957 0.01241229 -0.02293511 0.7834653  0.14431445 0.19572365
 -0.519398  -0.2315847 -0.08635604 0.51336807 0.01239578 0.46363848
 0.67076975 -0.4489825 -0.7259378 -0.5962111 -0.26125282 -0.6023005
 0.04432714 0.20658703 0.1376716 -0.5357572  0.08638419 -0.40312135
 0.01080403 -0.62655824 -0.5928631  0.3664876  0.0663145  0.06274834
 -0.38822135 -0.05520369 -0.2040366 -0.28943646 -0.5433778 -0.35676333
 -0.41888207 -0.08044773 -0.6589411  0.02679822 0.11474723 -0.95138925
 -0.67208344 -0.17512295 -0.29611424 0.5500234 ]

P.S. 好吧。。。看到'银尘'和'。'都有很高的相似度处女座不能忍了,得把停用词(Stop Words)给去了,重写分词模块

import jieba

# 创建停⽤词list
def stopwordslist(filepath):
    stopwords = [line.strip() for line in open(
        filepath, 'r', encoding='utf-8').readlines()]
    return stopwords  # readlines()读取所有行并返回list

# 对句⼦进⾏分词
def seg_sentence(sentence):
    jieba.add_word('麒零')
    sentence_seged = jieba.cut(sentence.strip())  # strip()方法默认用于移除字符串头尾的空格
    stopwords = stopwordslist('stop_words.utf8')  # 加载停⽤词
    outstr = ''
    for word in sentence_seged:
        if word not in stopwords:
            if word != '\t':
                outstr += word
                outstr += ' '
    return outstr


# 调⽤函数对⽂档进⾏处理
inputs = open('jueji.txt', 'rb')
outputs = open('jueji_o_s.txt', 'w')
for line in inputs:
    line_seg = seg_sentence(line)
    outputs.write(line_seg+'\n')
outputs.close()
inputs.close()

结果好看多了!

南方 不易 察觉 降温 凌晨 窗棂 会 看见 霜花 大陆 接近 极北 尽头 已经 一望无际 苍茫 肃杀 大块 大块 浮动 海面 冰山 不时 撞击 天地间 发出 巨大 锐利 轰鸣声 坍塌 冰块 砸 进 大海 掀起 白色 浪涛 辽阔 黑色 冻土 接连 几天 大雪 之后 变成 一片 茫茫 雪原 已经 深北 连绵不断 冰川 仿佛 怪兽 利齿 般 天地 尽头 紧紧 咬 一起 地平线 消失 刺眼 白色 冰面 之下 

银尘 0.999964714050293
看着 0.9999558925628662
说 0.9999518394470215
一个 0.9999447464942932
突然 0.9999420642852783
走 0.9999415874481201
里 0.9999402165412903
面前 0.9999377131462097
鹿觉 0.999934196472168
漆拉 0.9999340772628784

 

参考:
https://zhuanlan.zhihu.com/p/28943718