基于 word2vec 模型的文本分类任务


前言

基于 word2vec 模型的文本分类任务:文本共包含七个类别,每个类别包含200个文本。
在这里插入图片描述


一、安装并导入工具包

本实验主要使用到的工具包有 gensim 包, jieba 包, numpy 包和re 包。
安装 gensim 模块命令如下,其他模块类似:
在这里插入图片描述

二、获取词表

依次遍历每个分类文件夹下的文本文件,读取每个文本,先使用 re.sub 函数去除文本中的空格、缩进和换行,再使用 jieba 进行中文分词。

TextRank 是一种用于文本排序的算法,其思想来源于网页排序算法 PageRank,它主要运用了矩阵迭代的代数知识来对每个文本词语进行分析,最后得出数值越高则越重要。实验中使用 jieba.analyse.textrank 得到了每个文本中的动词和名词。(topK 为返回几个权重最大的关键词,默认值为 20,设置为None时表示全部获取)

每篇文本获取到的词全部保存到列表 all_word_list 中
代码如下(示例):

root_path = "data"
class_list = os.listdir(root_path)
all_word_list = []
for c in class_list:
    class_path =root_path + "/" + c
    file_list = os.listdir(class_path)
    for name in file_list:
        file_path = class_path+"/" +name
        with open(file_path, "r", encoding="utf-8") as f:
            txt = f.read()
            txt = re.sub("[    \t\n]*", "", txt)
            word_list = jieba.analyse.textrank(txt, topK = None, withWeight = False, allowPOS=('ns', 'n', 'vn', 'v'))
            all_word_list.extend(word_list)
result = " ".join(all_word_list)

将得到的 all_word_list 词表写入文件 result.txt 文件中,每个词用空格分隔,储存后方便直接取用。

with open("result.txt", "w", encoding="utf-8") as f:
    f.write(result)
f.close()

三、训练模型

使用已经生成的词表训练我们的 word2vec 模型并保存,通常维度设为 200,最小词频设置为 1。

从保存的文件result.txt 中取出词表,作为训练模型的语料,设置模型维度为 200,最小词频设置为 1。调用 word2vec.Word2Vec 开始训练。

将训练好的模型保存到文件 “my_model.model”中,方便直接取用。
将数据集词表保存到文件 “all_word_list”中,方便直接取用。
代码如下(示例):

sentences = word2vec.Text8Corpus("result.txt")#加载语料
model = word2vec.Word2Vec(sentences, size = 250, min_count=1) #训练模型,维度设置为200,最小词频设置为1;
model.save("my_model.model")
with open("all_word_list.pkl", "wb") as f:
    pickle.dump(all_word_list, f)
f.close()

四、统计词频

我们选取每个类别 70% 的文件作为训练集,统计词频(同样只获取名词和动词),剩余 30% 的文件作为测试集。

依次遍历每个分类文件夹下文件, nFile 为每个分类文件夹包含的文件总数, rate 为训练时取样的比例,在本实验中 rate = 0.7,即取 70% 的数据用于训练。
读取每个文本,先使用 re.sub 函数去除文本中的空格、缩进和换行,再使用 jieba 进行中文分词。

TextRank 是一种用于文本排序的算法,其思想来源于网页排序算法 PageRank,它主要运用了矩阵迭代的代数知识来对每个文本词语进行分析,最后得出数值越高则越重要。实验中使用 jieba.analyse.textrank 得到了每个文本中权重最高的20个 动词和名词。(不对数目进行设置的话,其默认值为 20)

对于每篇文本得到的 20 个词,将其保存到字典 all_words 中,索引为词名,key 为词的数目。每个分类下得到的词频表保存到一起,再放入总的词频表 class_all_words 中,以其分类名作为索引。

def train_f():
    class_all_words = {
   }
    print("对训练集词频统计")
    for c in tqdm(class_list):
        all_words = {
   }
        class_path =root_path + "/" + c
        file_list = os.listdir(class_path)
        #取70%的文件作为训练集,并对训练集进行词频统计
        for name in file_list[:int(nFile * rate)]:
            file_path = class_path + "/" + name
            with open(file_path, "r", encoding="utf-8") as f:
                txt = f.read()
                txt =re.sub("[    \t\n]*", "", txt)
                word_list = jieba.analyse.textrank(txt, withWeight=False, allowPOS=('ns', 'n' , 'vn', 'v'))
                for word in word_list:
                    if len(word) != 1:
                        if word in all_words.keys():
                            all_words[word] += 1
                        else:
                            all_words[word]= 1
        class_all_words[c] = all_words
    with open('all_words_practice.pkl', 'wb') as f:
        pickle.dump(class_all_words, f)
    f.close()
    return class_all_words

将得到的总的词表使用 pickle 模块写入文件 all_words_practice.pkl 中,下次计算时时直接取用即可,无需重新构建词表。

四、获取特征向量

对于每个类别前 k 个高频作为关键词,通过训练好的 word2vec 模型获取关键词的向量求平均即为对应类别的特征向量。

求每个类的平均向量时,我们先按照词的数量进行倒叙排列,再依次将类中的词的映射加到 total 中。注意这里有一个参数 key_num, 代表着取关键词的数目,如果一个类别中的关键词少于 key_num, 则应直接求和所有词的向量映射。

'''
获取每个类的平均向量
'''
def average_class_vector(keyword_num):
    average_class_dic = {
   }
    
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宫水二叶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值