医学词向量训练---词向量训练和可视化

医学词向量训练—词向量训练和可视化

词向量训练

在这里插入图片描述

python代码
import jieba
import os
import json
import codecs
import multiprocessing
from gensim.models import Word2Vec, KeyedVectors
from gensim.models.word2vec import LineSentence
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import random
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']


class medicalWord2vec:
    """
    医学词向量
    """

    def __init__(self):
        self.stopwords_path = '../../词向量/word/stop.txt'  # 停用词路径
        self.new_cut_words_path = "../../词向量/word/jieba.txt"  # 原先分词词库路径
        self.origin_cut_words_path = "../../词向量/word/my_words.txt"  # 新分词词库路径
        self.data_path = '../../词向量/data/content/'  # 语料json路径
        self.corpus_path = "../../词向量/word/content.txt"  # 保存的代训练语料路径
        self.word_vector_path = "../../词向量/word/word2vec.vector"  # 词向量路径
        self.word_vector_dimension = 400  # 词向量维度
        self.test_words = ['新冠', '全身疼痛', '感冒', '病毒感染', '肚子疼', '咳嗽', "头疼", "头痛"]  # 测试词向量词语

    def seg_sentence(self, sentence):
        """
        对语料分词,结巴去除听用词分词
        :param sentence: 句子
        :return: 分词后list
        """
        sentence_seg = jieba.cut(sentence.strip())
        stopwords = [line.strip() for line in open(self.stopwords_path, 'r', encoding='utf-8').readlines()]
        return [word for word in sentence_seg if word not in stopwords and word != "\t"]

    def get_cut_word(self):
        """
        基于39net问答丰富分词词库
        """
        print("------开始更新分词词库------")
        f_data = [line.replace("\n", "") for line in open(self.origin_cut_words_path, encoding="utf8")]
        f = open(self.new_cut_words_path, "w", encoding="utf8")
        result = []
        for file_one in os.listdir(self.data_path):
            for file_two in os.listdir(self.data_path + file_one + "/"):
                with open(self.data_path + file_one + "/" + file_two, encoding='utf8') as data_json:
                    data_json = json.load(data_json)
                    result.extend([element['label'] for element in data_json['key_word'] if len(element['label']) > 1])
            print(file_one + "-----------已完成")
        result = list(set(result + f_data))
        for element in result:
            f.write(element + "\n")
        f.close()
        print("------分词词库更新完成------")

    def get_corpus(self):
        """
        对语料进行分词
        """
        print("------开始语料分词------")
        target = codecs.open(self.corpus_path, 'w', encoding="utf8")
        jieba.load_userdict(self.new_cut_words_path)
        for file_one in os.listdir(self.data_path):
            for file_two in os.listdir(self.data_path + file_one + "/"):
                with open(self.data_path + file_one + "/" + file_two, encoding='utf8') as data_json:
                    data_json = json.load(data_json)['content']
                    line_seg = " ".join(self.seg_sentence(data_json))
                    target.writelines(line_seg)
            print(file_one + "-----------已完成")
        target.close()
        print("------语料分词结束------")

    def train_word2vec(self):
        """
        基于word2vec训练词向量

        """
        print("------开始词向量训练------")
        model = Word2Vec(LineSentence(self.corpus_path), size=self.word_vector_dimension, window=5, min_count=5,
                         workers=multiprocessing.cpu_count())
        model.wv.save_word2vec_format(self.word_vector_path, binary=True)
        print("------词向量训练结束------")

    def test_word2vec(self):
        """
        测试词向量
        """
        word2vec_model = KeyedVectors.load_word2vec_format(self.word_vector_path, binary=True)
        test_words = self.test_words
        for i in range(len(test_words)):
            res = word2vec_model.most_similar(test_words[i])
            print("测试词语:-----", test_words[i])
            print("相似词:-----", res)

    def visualization(self):
        """
        可视化词向量
        """
        word2vec_model = KeyedVectors.load_word2vec_format(self.word_vector_path, binary=True)
        words = list(word2vec_model.wv.vocab)
        random.shuffle(words)
        print("词向量总数:----------", len(words))
        vector = word2vec_model[words]
        random_word2vec = TSNE(n_components=2, init='pca', verbose=1).fit_transform(vector)
        plt.figure(figsize=(14, 10))
        plt.scatter(random_word2vec[:300, 0], random_word2vec[:300, 1])
        for i in range(300):
            x = random_word2vec[i][0]
            y = random_word2vec[i][1]
            plt.text(x, y, words[i])
        plt.title('医学词向量可视化', size=16)
        plt.savefig('../../词向量/word/TSNE.jpg', dpi=200)
        plt.show()
结果
训练结果

在这里插入图片描述

词向量可视化

在这里插入图片描述

本课程隶属于自然语言处理(NLP)实战系列。自然语言处理(NLP)是数据科学里的一个分支,它的主要覆盖的内容是:以一种智能与高效的方式,对文本数据进行系统化分析、理解与信息提取的过程。通过使用NLP以及它的组件,我们可以管理非常大块的文本数据,或者执行大量的自动化任务,并且解决各式各样的问题,如自动摘要,机器翻译,命名实体识别,关系提取,情感分析,语音识别,以及主题分割等等。一般情况下一个初级NLP工程师的工资从15万-35万不等,所以掌握NLP技术,对于人工智能学习者来讲是非常关键的一个环节。【超实用课程内容】 课程从自然语言处理的基本概念与基本任务出发,对目前主流的自然语言处理应用进行全面细致的讲解,包括文本分类,文本摘要提取,文本相似度,文本情感分析,文本特征提取等,同时算法方面包括经典算法与深度学习算法的结合,例如LSTM,BiLSTM等,并结合京东电商评论分类、豆瓣电影摘要提取、今日头条舆情挖掘、饿了么情感分析等过个案例,帮助大家熟悉自然语言处理工程师在工作中会接触到的常见应用的实施的基本实施流程,从0-1入门变成自然语言处理研发工程师。 【课程如何观看?】 PC端:https://edu.csdn.net/course/detail/25649 移动端:CSDN 学院APP(注意不是CSDN APP哦)本课程为录播课,课程2年有效观看时长,大家可以抓紧时间学习后一起讨论哦~【学员专享增值服务】 源码开放课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化下载方式:电脑登录https://edu.csdn.net/course/detail/25649,点击右下方课程资料、代码、课件等打包下载通过第二课时下载材料
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西门废物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值