NLP14-基于Gensim中的Doc2Vec的试探

摘要:经过加载数据,分词,运行Gensim中的Doc2Vec进行训练并作文本相似性的预测,可实验的结果不满意,有待进一步研究Doc2Vec。

关于Doc2Vec的论文:http://cs.stanford.edu/~quocle/paragraph_vector.pdf

Doc2Vec与Word2Vec来自同一大师的手笔,两者的思想也比较像。

NLP14-基于Gensim中的Doc2Vec的试探_第1张图片

语料

NLP14-基于Gensim中的Doc2Vec的试探_第2张图片

分词

NLP14-基于Gensim中的Doc2Vec的试探_第3张图片

代码


# -*- coding:utf-8 -*-
import os
import re
import time

import jieba
import jieba.analyse
from bs4 import BeautifulSoup
from gensim import models
from gensim.models.doc2vec import TaggedDocument


# 分词
def cutPhase(inFile, outFile):
    # 如果没有自己定义的词典,这行不要
    # jieba.load_userdict("dict_all.txt")
    # 加载停用词
    stoplist = {}.fromkeys([line.strip() for line in open('raw/stopword.txt', 'r', encoding='utf-8')])
    f1 = open(inFile, 'r', encoding='utf-8')
    f2 = open(outFile, 'w+', encoding='utf-8')
    line = f1.readline()
    count = 0
    while line:
        b = BeautifulSoup(line, "lxml")
        line = b.text
        # 分词
        segs = jieba.cut(line, cut_all=False)
        # 过滤停用词
        segs = [word for word in list(segs)
                if word.lstrip() is not None
                and word.lstrip() not in stoplist
                ]
        # 每个词用空格隔开
        f2.write(" ".join(segs))
        f2.write('\n')
        line = f1.readline()
        count += 1
        if count % 100 == 0:
            print(count)
    f1.close()
    f2.close()


class Doc2vecSentences(object):
    def __init__(self, fname):
        self.fname = fname
        self.index_v = 0

    def __iter__(self):
        for line in open(self.fname, encoding='utf-8'):
            self.index_v += 1
            ws = line.split()
            yield TaggedDocument(words=ws, tags=['%d_%s' % (self.index_v,line)])

def load_data(dirs, out_file_name='raw/健康数据'):
    c = 0
    with open(out_file_name, 'w+', encoding='utf-8') as f_out:
        for d in dirs:
            for root, _, files in os.walk(d):
                print(root)
                for f_name in files:
                    with open(os.path.join(root, f_name), encoding='utf-8') as f_read:
                        c += 1
                        txt = f_read.read()
                        txt = re.subn(r'\s+', ' ', txt)[0]
                        f_out.write('%s\n' % (txt))
                        if c % 1000 == 0:
                            print(c)


def train_doc2vec():
    print('train:d2v')
    d2cSententces = Doc2vecSentences(fname=u'raw/健康数据.cut')
    t = time.time()
    d2v = models.Doc2Vec(d2cSententces,size=100, min_count=1, iter=10)
    print(str(time.time() - t))
    d2v.save(u'raw/健康数据.d2v')

#
if __name__ == '__main__':
    is_train = False
    # 进行训练计算模型
    if is_train:
        # 加载数据
        load_data(dirs=['../母婴', '../养生'])
        # 分词
        cutPhase(inFile=u'raw/健康数据', outFile=u"raw/健康数据.cut")
        # train
        train_doc2vec()
    # 应用模型,相关的查询
    else:
        print('加载doc2vec')
        d2v = models.Doc2Vec.load(u'raw/健康数据.d2v')

        print('# 任先一句分好词的文档')
        doc = """
               冬季 宝宝 爱 感冒 发烧 宝宝 适宜 酒精 擦身 宝宝 感冒 吃 药 宝宝 感冒 发烧 适宜 频繁 更换 药物 专家 指出 宝宝 发烧 用药 专一 多种 药物 重复 服用 毒副作用 宝宝 感冒 吃 药 冬季 天气 多变 宝宝 抵抗力 差 患上 感冒 发烧 孩子 感冒 发烧 父母 头疼 孩子 体温 下降 家长会 选择 孩子 用药 宝宝 消化 能力 不及 成人 短时间 孩子 频繁 用药 频繁 更换 退烧药 宝宝 一种 很大 宝宝 发烧 用药 需 专一 社会 感冒 退烧药 五花八门 感冒 退烧药 成分 一种 足够 多种 药物 重复 服用 药物 毒副作用 导致 不良反应 出汗 过多 脱水 发展 成 休克 单独 一种 药物 退烧 目的 无需 重复 添置 药物 孩子 发烧时 应 选择 退烧药 宝宝 适宜 酒精 擦身 酒精 擦身 传统 物理 降温 成人 身上 快速 起效 儿童 血管 收缩 脆弱 不利于 降温 擦拭 过度 酒精中毒 单独 一种 退烧药 还应 控制 用药 剂量 特别 两岁 孩子 需谨 遵 医嘱 发热时 父母 需 宝宝 喝水 补充 孩子 体内 水分 大师 王林 因病 死亡 王林 大师 死 泰国 女网 红比 中国 女网 红 好看 一百倍 女 酒吧 坐 台 事业 线 外露 一点 害臊 身体 暴露
               """
        words = doc.split()
        print(words)
        inferred_vec = d2v.infer_vector(words)
        print(inferred_vec)
        sims = d2v.docvecs.most_similar([inferred_vec], topn=5)
        # print(sims)
        for lab, pro in sims:
            print('%f:%s' % (pro, lab))

加载doc2vec
# 任先一句分好词的文档
['冬季', '宝宝', '爱', '感冒', '发烧', '宝宝', '适宜', '酒精', '擦身', '宝宝', '感冒', '吃', '药', '宝宝', '感冒', '发烧', '适宜', '频繁', '更换', '药物', '专家', '指出', '宝宝', '发烧', '用药', '专一', '多种', '药物', '重复', '服用', '毒副作用', '宝宝', '感冒', '吃', '药', '冬季', '天气', '多变', '宝宝', '抵抗力', '差', '患上', '感冒', '发烧', '孩子', '感冒', '发烧', '父母', '头疼', '孩子', '体温', '下降', '家长会', '选择', '孩子', '用药', '宝宝', '消化', '能力', '不及', '成人', '短时间', '孩子', '频繁', '用药', '频繁', '更换', '退烧药', '宝宝', '一种', '很大', '宝宝', '发烧', '用药', '需', '专一', '社会', '感冒', '退烧药', '五花八门', '感冒', '退烧药', '成分', '一种', '足够', '多种', '药物', '重复', '服用', '药物', '毒副作用', '导致', '不良反应', '出汗', '过多', '脱水', '发展', '成', '休克', '单独', '一种', '药物', '退烧', '目的', '无需', '重复', '添置', '药物', '孩子', '发烧时', '应', '选择', '退烧药', '宝宝', '适宜', '酒精', '擦身', '酒精', '擦身', '传统', '物理', '降温', '成人', '身上', '快速', '起效', '儿童', '血管', '收缩', '脆弱', '不利于', '降温', '擦拭', '过度', '酒精中毒', '单独', '一种', '退烧药', '还应', '控制', '用药', '剂量', '特别', '两岁', '孩子', '需谨', '遵', '医嘱', '发热时', '父母', '需', '宝宝', '喝水', '补充', '孩子', '体内', '水分', '大师', '王林', '因病', '死亡', '王林', '大师', '死', '泰国', '女网', '红比', '中国', '女网', '红', '好看', '一百倍', '女', '酒吧', '坐', '台', '事业', '线', '外露', '一点', '害臊', '身体', '暴露']
[ 0.14403586  0.29930809 -0.0355306  -0.03061694  0.37129837  0.17250399
  0.04176886  0.19329318 -0.55662674  0.21004505  0.0335303  -0.47058699
  0.34020498 -0.09969757  0.23420356 -0.35033056  0.40849903 -0.37139863
  0.51210117  0.0971807  -0.12418588  0.16976778  0.09262969  0.1599029
 -0.17430234 -0.37025794  0.10961426  0.81737596 -0.50499892 -0.04177399
  0.05300665  0.33908546 -0.03283357 -0.17218372  0.91562289  0.16870928
 -0.24438307 -0.77414614 -0.09894849  0.13241473  0.54224229 -0.04469357
  0.15359627  0.11692984  0.0155513  -0.23812598  0.40657485 -0.15833333
 -0.07351155  0.39079657 -0.34710306 -0.0606405   0.44949925 -0.23621261
 -0.49556223 -0.11480623 -0.23107521 -0.21788199 -0.34930646 -0.22856431
  0.05796168 -0.08406282  0.46446046  0.18278933  0.00246208  0.09037039
 -0.05379084  0.22215126  0.49751505  0.55187011  0.00703889 -0.32733107
 -0.20578012  0.03428552 -0.24393812 -0.15330848 -0.33714667 -0.12960187
 -0.06176585  0.17362921 -0.18182018 -0.16300829 -0.12884589 -0.07647183
 -0.08611863  0.22592868 -0.37477285 -0.415593    0.07733424 -0.17882854
  0.24717268  0.17590415 -0.39103532 -0.31147829  0.33592075 -0.48707649
  0.07996057 -0.18104206 -0.08897991 -0.12591684]
0.832677:冬季 宝宝 爱 感冒 发烧 宝宝 适宜 酒精 擦身 宝宝 感冒 吃 药 宝宝 感冒 发烧 适宜 频繁 更换 药物 专家 指出 宝宝 发烧 用药 专一 多种 药物 重复 服用 毒副作用 宝宝 感冒 吃 药 冬季 天气 多变 宝宝 抵抗力 差 患上 感冒 发烧 孩子 感冒 发烧 父母 头疼 孩子 体温 下降 家长会 选择 孩子 用药 宝宝 消化 能力 不及 成人 短时间 孩子 频繁 用药 频繁 更换 退烧药 宝宝 一种 很大 宝宝 发烧 用药 需 专一 社会 感冒 退烧药 五花八门 感冒 退烧药 成分 一种 足够 多种 药物 重复 服用 药物 毒副作用 导致 不良反应 出汗 过多 脱水 发展 成 休克 单独 一种 药物 退烧 目的 无需 重复 添置 药物 孩子 发烧时 应 选择 退烧药 宝宝 适宜 酒精 擦身 酒精 擦身 传统 物理 降温 成人 身上 快速 起效 儿童 血管 收缩 脆弱 不利于 降温 擦拭 过度 酒精中毒 单独 一种 退烧药 还应 控制 用药 剂量 特别 两岁 孩子 需谨 遵 医嘱 发热时 父母 需 宝宝 喝水 补充 孩子 体内 水分 大师 王林 因病 死亡 王林 大师 死 泰国 女网 红比 中国 女网 红 好看 一百倍 女 酒吧 坐 台 事业 线 外露 一点 害臊 身体 暴露

0.670190:一岁 幼儿 口服 泡腾片 导致 窒息 死亡 切记 用法 泡腾片 常见 剂型 地方 影子 感冒 有人 维 泡腾片 冲水 喝 感冒 好得快 一点儿 一种 平平常常 药物 服用 错误 要人命 央视 纪录片 见证 年轻 家长 沉重 一课 宝宝 感冒 发烧 一家 省级 医院 挂 吊针 输液 医生 还配 两盒 药 一盒 泡腾片 母亲 泡腾片 塞到 宝宝 嘴里 水后 孩子 手脚 抖动 剧烈 咳嗽 嘴唇 青 拍 背 催吐 方法 试 过后 症状 解决 孩子 心跳 呼吸 微弱 送 进 抢救室 手术 切开 气管 医生 取出 化为 一摊 水 泡腾片 残液 不幸 孩子 最终 脑部 缺氧 过长 抢救无效 死亡 供图 视觉 中国 小小的 泡腾片 会要 孩子 命 泡腾片 携带 服用 起效 调味 泡腾片 口感 泡腾片 做成 水果 味儿 儿童 老年人 吞服 固体 制剂 困难 患者 胃肠道 刺激 剂型 提供 便利 使用不当 风险 泡腾片 属 剂型 需 服用 方法 含有 泡腾 崩解 剂 有机酸 碳酸钠 碳酸氢钠 混合物 遇水后 二者 发生 化学反应 二氧化碳 放入 口中 气体 急剧 充斥 气道 窒息 风险 泡腾片 干 吃 吞服 泡腾片 服用 方法 泡腾片 放进 水中 药片 溶解 服用 服用 维生素 泡腾片 流行 维生素 泡腾片 当成 日常 身体 营养 补充剂 随身 必备 缓解 疲劳 饮品 不宜 长期 服用 长期 口服 剂量 维 人体 带来 副作用 恶心 呕吐 腹泻 腹痛 皮疹 症状 增加 肾结石 深 静脉 血栓 患病 风险

.......

doc2Vec运行很不稳定,偶尔才会出现一个比较靠谱的结果,这个是实验了多次,选择了一次比较好的。

其它的结果都是不理想的,估计训练的语料有些少,可能语料大的情况会好,还得进一步研究。。。

结论

实验的结果不满意,有待进一步研究Doc2Vec.

附其它结果:
前的那个数据表示生成的向量维数,下面冒号分开的为相似度与文档ID。可以看到文档Id一直在变,且比较严重的,那个文档ID就像是随机的一样。

############(10)

0.841776:774
0.819779:119
0.813335:155
0.792744:238
0.787076:419
4.08899998664856

############(15)

0.630875:84
0.603427:208
0.585996:555
0.576140:709
0.563933:221
4.082000017166138

############(20)

0.574478:629
0.557522:119
0.549371:544
0.530792:151
0.523275:555
4.115000009536743

############(25)

0.660835:555
0.559189:84
0.538333:135
0.530949:243
0.519981:754
4.292999982833862

############(30)

0.546003:555
0.489719:90
0.485619:709
0.461765:125
0.455313:629
4.322000026702881

############(35)

0.480113:856
0.476886:125
0.452170:107
0.441913:754
0.439340:221
4.3420000076293945

############(40)

0.498452:125 :九国女性的长寿秘诀
0.419703:119
0.414568:221
0.407361:856
0.406624:754
4.2209999561309814

############(45)

0.475685:125
0.426905:856
0.418503:31
0.404914:678
0.397925:629
4.571000099182129

############(50)

0.420316:500
0.390783:31
0.383370:125
0.361808:754
0.351713:856
4.6499998569488525

############(55)

0.447094:31 :向沙皇提供情报
0.415676:856 :参与社会活动可延缓衰老
0.382662:500 :儿童上火眼屎多怎么办
0.345452:125 :九国女性的长寿秘诀
0.342147:66
4.48799991607666

############(60)

0.428105:754
0.380184:66
0.339999:725
0.334028:221
0.321555:856
4.51200008392334

############(65)

0.355120:221
0.350141:547
0.347463:66
0.332847:856
0.329083:119
4.67900013923645

############(70)

0.377662:781:吃6-12个月婴儿配方奶粉时还需要添加辅食吗
0.361310:567
0.335239:186
0.319368:754
0.316728:856
4.645999908447266

############(75)

0.359803:754:全球儿童安全组织
0.339270:133:多少人败在不会说话上
0.316868:66:为什么吕后会乱政
0.307378:186
0.303841:119
4.811000108718872

############(80)

0.343261:650
0.338948:868
0.338099:221
0.333146:754
0.327205:133
4.559000015258789

############(85)

0.338940:754
0.297079:81
0.283068:848
0.281003:221
0.280117:386
4.863999843597412

############(90)

0.334823:221: 高温天气将女婴打包成快递 脐带还未清理干净
0.314499:754
0.303249:224
0.302594:186:怀孕了,坐卧站走有讲究
0.296915:618
4.863000154495239

############(95)

0.315726:754
0.301746:776
0.292143:221 怀孕了,坐卧站走有讲究
0.291334:133
0.260729:119
4.99399995803833

【作者:happyprince, http://blog.csdn.net/ld326/article/details/78640463】

你可能感兴趣的:(python,数据挖掘,NLP)