第3章:中文本文向量化——代码详解

news2025/8/10 3:16:17

1.单条语句的向量化

根据不同的向量化,对“中华女子学院:本科层次仅1专业招男生”这句话进行向量化

1.1 One-hot方法

# one-hot代码
import jieba
import os
import numpy as np

stopwords = open('./data/哈工大停用词表.txt').read().split("\n")

words = '中华女子学院:本科层次仅1专业招男生'
word = jieba.lcut(words)
# print(word)
word = [w for w in word if w not in stopwords]  #去除停用词

one_hots = {}
lenth = len(word)
for index,word in enumerate(word):
    one_hot = [0]*lenth  #构造一个全为0的列表或者是一个一维矩阵
    one_hot[index] = 1
    one_hots[word] =one_hot 
print(one_hots)

1.2 TF和TF-IDF向量法

方法1:先使用CountVectorizer完成文本的TF表示,之后再使用TfidfTransformer完成文本的TF-IDF表示

# TF-IDF方法制作一句话的向量
import jieba
import os
import numpy as np

stopwords = open('./data/哈工大停用词表.txt').read().split("\n")
words = '中华女子学院:本科层次仅1专业招男生'
word = jieba.lcut(words)
word = [w for w in word if w not in stopwords]  #去除停用词

dic_data =[ " ".join(word)]
print(dic_data)
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
# 矩阵中包含一个元素a[i][j],它表示j词在i类文本下的词频。它通过fit_transform函数计算各个词语出现的次数
count = vectorizer.fit_transform(dic_data)
# print(count)
from sklearn.feature_extraction.text import TfidfTransformer
transformer = TfidfTransformer() #类调用
tfidf = transformer.fit_transform(count) #将词频统计成TF-IDF值
#查看数据结构 tfidf[i][j]表示i类文本中的tf-idf权重
print(tfidf.toarray())

方法2:直接使用TfidfVectorizer完成文本的向量化

import jieba
import os
import numpy as np

stopwords = open('./data/哈工大停用词表.txt').read().split("\n")
words = '中华女子学院:本科层次仅1专业招男生'
word = jieba.lcut(words)
word = [w for w in word if w not in stopwords]  #去除停用词

dic_data =[ " ".join(word)]
print(dic_data)

from sklearn.feature_extraction.text import TfidfVectorizer
counttdidf = TfidfVectorizer()
count_tfidf = counttdidf.fit_transform(dic_data)
# print(count_tfidf)
train_weight = count_tfidf.toarray() #篇章()向量化 1800*dic
print(count_tfidf.toarray())

1.3 Word2Vec向量法

  • 环境安装:pip install gensim
  • 使用gensim进行Word2Vec进行向量化的数据格式为:[[‘中华’, ‘女子’, ‘学院’, ‘本科’, ‘层次’, ‘仅’, ‘1’, ‘专业’, ‘招’, ‘男生’], [‘两天’, ‘价’, ‘网站’, ‘背后’, ‘重重’, ‘迷雾’, ‘做个’, ‘网站’, ‘究竟’, ‘钱’], [‘东’, ‘5’, ‘环’, ‘海棠’, ‘公社’, ‘230’, ‘290’, ‘平’, ‘2’, ‘居’, ‘准现房’, ‘98’, ‘折’, ‘优惠’]]
from gensim.models import Word2Vec

stopwords = open('./data/哈工大停用词表.txt').read().split("\n")
words = '中华女子学院:本科层次仅1专业招男生'
word = jieba.lcut(words)
# print(word)
word = [[w for w in word if w not in stopwords]]  #去除停用词
# print(word)
#训练模型
model = Word2Vec(word, vector_size=5,min_count=1,epochs=7) #vector_size:向量表示的数量;min_count:最小统计的词;epochs:迭代次数,使得w1和w2更新的次数
#保存模型
model.save('model.bin')
# load model
new_model = Word2Vec.load('model.bin')
print(new_model.wv['学院'])
print("和学院相关性最高的前5个词:",model.wv.most_similar('学院',topn=5))

1.4 BERT向量法

  • 环境配置
    1.python -V
    2.conda create -n pytorch python==3.7
    3.conda activate pytorch
    4.打开pytorch官网:https://pytorch.org/
    5.验证:
    import torch
    torch.version
    torch.cuda.is_available()
    6.pip install transformers
使用transformers进行向量化的数据格式为:['北京欢迎你','智能科学与技术']
"""
from transformers import BertTokenizer,BertModel
# 初始化分词器
tokenizer = BertTokenizer.from_pretrained('./bert_base_chinese')
#加载预训练模型
model = BertModel.from_pretrained('./bert_base_chinese')

batch_token1 = tokenizer(['北京欢迎你','智能科学与技术'],padding=True,return_tensors='pt') #padding=True:根据最长的句子进行填充;return_tensors='pt':表示使用pytorch版本
print(batch_token1)

encoded = model(batch_token1['input_ids']) #有id转向量化过程
print(encoded) #last_hidden_state:词向量;pooler_output:分类的输出结果
encoded_text = encoded[0] #仅仅获得词向量
print('词向量:',encoded_text)
print("输出词向量的形状:",encoded_text.shape) #torch.Size([2, 9, 768]) 2个句子*9个词id*768

2.多条语句的向量化

在这里插入图片描述
语料说明:将3个文本保存在data.txt文档中,同时将data.txt文档存放在“练习data”这个文件夹当中。同时我们的代码是和该文件夹在同一目录中。

2.1 One-hot方法

# one-hot代码

import jieba
import os
import numpy as np

stopwords = open('./data/哈工大停用词表.txt').read().split("\n")

dic = []
with open('./练习data/data.txt','r',encoding='utf-8') as f:
    lines = f.read().split('\n')
    for line in lines:
        words = jieba.lcut(line)
        # for w in words:
        #     if w not in stopwords:
        #         dic.append(w)
        dic.append([w for w in words if w not in stopwords])
# print(dic)        
def mak_dic(seg_dic):
    dics = []
    for lines in seg_dic:
        for words in lines:
            if words not in dics:
                dics.append(words)
    print(len(dics))
         
    one_hots = {}
    lenth = len(dics)
    for index,word in enumerate(dics):
        print(word)
        one_hot = [0]*lenth  #构造一个全为0的列表或者是一个一维矩阵
        one_hot[index] = 1
        print(one_hot)
        one_hots[word] =one_hot
        
    return one_hots
result = mak_dic(dic)

2.2 TF-IDF方法

使用skearn进行TF-IDF进行向量化的数据格式为:['北京 欢迎 北京','你们 喜欢 北京','北京 天安门']
# TF-IDF方法
stopwords = open('./data/哈工大停用词表.txt').read().split("\n")

dic = []
dic_data = []
with open('./练习data/data.txt','r',encoding='utf-8') as f:
    lines = f.read().split('\n')
    for line in lines:
        words = jieba.lcut(line)
        # for w in words:
        #     if w not in stopwords:
        #         dic.append(w)
        dic.append([w for w in words if w not in stopwords])
        dic_datas = " ".join(words)
        dic_data.append(dic_datas)


from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
# 矩阵中包含一个元素a[i][j],它表示j词在i类文本下的词频。它通过fit_transform函数计算各个词语出现的次数
count = vectorizer.fit_transform(dic_data)
# print(count)
from sklearn.feature_extraction.text import TfidfTransformer
transformer = TfidfTransformer() #类调用
tfidf = transformer.fit_transform(count) #将词频统计成TF-IDF值
#查看数据结构 tfidf[i][j]表示i类文本中的tf-idf权重
print(tfidf.toarray())

2.3 Word2Vec向量法

"""
# 环境配置:pip install gensim
使用gensim进行Word2Vec进行向量化的数据格式为:
[['中华', '女子', '学院', '本科', '层次', '仅', '1', '专业', '招', '男生'], ['两天', '价', '网站', '背后', '重重', '迷雾', '做个', '网站', '究竟', '钱'], ['东', '5', '环', '海棠', '公社', '230', '290', '平', '2', '居', '准现房', '98', '折', '优惠']]
"""
from gensim.models import Word2Vec
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

stopwords = open('./data/哈工大停用词表.txt').read().split("\n")

dic = []
dic_data = []
with open('./练习data/data.txt','r',encoding='utf-8') as f:
    lines = f.read().split('\n')
    for line in lines:
        words = jieba.lcut(line)
        # for w in words:
        #     if w not in stopwords:
        #         dic.append(w)
        dic.append([w for w in words if w not in stopwords])
        dic_datas = " ".join(words)
        dic_data.append(dic_datas)
#x训练模型
model = Word2Vec(dic, vector_size=5,min_count=1,epochs=7)
#保存模型
model.save('./model.bin')
# load model
new_model = Word2Vec.load('model.bin')
print(model.wv['学院'])
print("和学院相关性最高的前5个词:",model.wv.most_similar('学院',topn=5))

## 判断词之间的相似度
print(model.wv.similarity('本科','本科'))  #1.0
## 判断词之间的相似度
print(model.wv.similarity('男生','女子'))  #-0.15

#PCA降维为2维空间
rawWordVec =[]
word2ind = {}
for i,w in enumerate(model.wv.index_to_key): #序号、词语
    word2ind[w] = i
    rawWordVec.append(model.wv[w])
rawWordVec = np.array(rawWordVec)
X_reduced  = PCA(n_components=2).fit_transform(rawWordVec)

print(X_reduced)



#绘制星空表
# 绘制星空图
# 绘制所有单词向量的二维空间投影
fig = plt.figure(figsize = (5, 5))
ax = fig.gca()
ax.set_facecolor('white')
ax.plot(X_reduced[:, 0], X_reduced[:, 1], '.', markersize = 5, alpha = 0.3, color = 'black') #黑色表示所有的词语

# 绘制几个特殊单词的向量
words = ['学院','女子']

# 设置中文字体 否则乱码 
import matplotlib
zhfont1 = matplotlib.font_manager.FontProperties(fname='./华文仿宋.ttf', size=16)
for w in words:
    if w in word2ind:
        ind = word2ind[w]
        xy = X_reduced[ind]
        plt.plot(xy[0], xy[1], '.', alpha =1, color = 'orange',markersize=10)
        plt.text(xy[0], xy[1], w, fontproperties = zhfont1, alpha = 1, color = 'red')

2.4 BERT向量法

"""
# 环境配置
1.python -V
2.conda create -n pytorch python==3.7
3.conda activate pytorch
4.打开pytorch官网:https://pytorch.org/
5.验证:
    import torch
    torch.__version__
    torch.cuda.is_available()
6.pip install transformers

使用transformers进行向量化的数据格式为:['北京欢迎你','智能科学与技术']

"""

dic = []
with open('./练习data/data.txt','r',encoding='utf-8') as f:
    lines = f.read().split('\n')
    for line in lines:
        dic.append(line)

from transformers import BertTokenizer,BertModel
from transformers import logging

logging.set_verbosity_error()

model = BertModel.from_pretrained('./bert_base_chinese')

batch_token1 = tokenizer(dic,padding=True,return_tensors='pt') #padding=True:根据最长的句子进行填充;return_tensors='pt':表示使用pytorch版本

encoded = model(batch_token1['input_ids']) #有id转向量化过程
# print(encoded) #last_hidden_state:词向量;pooler_output:分类的输出结果
encoded_text = encoded[0] #仅仅获得词向量
print(encoded_text.shape) #torch.Size([2, 9, 768]) 2个句子*9个词id*768

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

物联网安全年报暴露情况分析

暴露情况分析 在去年研究的基础上,我们今年对 UPnP 协议的暴露情况进行持续关注。如无特殊说明,本章中的 统计数据基于全球单轮次的测绘(2019 年 10 月)。本节我们将对 SSDP 与 SOAP服务的暴露情况进行 分析,4.4.2 节…

图床项目架构与设计

分布式文件服务系统架构与设计 该项目利用FastDFS分布式文件系统以及集群等技术提供统一的接口对外提供文件存储和访问服务,使用户能够通过网络访问服务端的文件资源,满足海量数据存储的需求 架构 项目采用B/S模型,服务端与浏览器进行交互&a…

论文阅读-Detecting and Recovering Sequential DeepFake Manipulation(SeqFakeFormer)

一、论文信息 论文名称:Detecting and Recovering Sequential DeepFake Manipulation(篡改序列检测还原) 论文链接: https://arxiv.org/pdf/2207.02204.pdf 项目主页: https://rshaojimmy.github.io/Projects/SeqDeepFake GitHub: https:…

Linux 最近学习总结

Linux 最近学习总结一.基础命令一.基础命令 基础命令就像是锤子、螺丝刀、锯等木匠常用到的工具,也是我们每天都会用到的命令 1.ls 列出当前所在目录的内容 2.ls 文件夹名 列出其他文件夹内容 3.ls ~ 其中~代表home目录 4.ls ~/Desktop/Java电子书/*.pdf 使用…

Eigen Segmentation fault (core dumped)

不会GDB吃大亏问题描述:解法:写在前面的话:我是PCL新手。也是Cmake新手。Eigen有点折腾人。 问题描述: 在调用PCL库实现一些有趣的功能,考虑到考虑到兼容不同平台,现状如下: VS2015&#xff1…

JavaScript基本语法详解

目录 一、JavaScript数据类型 二、算术运算符 1:分支结构 (1)if语句 (2)if...else语句 (3)if..else if语句 2:循环结构 (1)for循环 (2&a…

ipv6地址概述——了解ipv6地址

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。个人爱好: 编程,打篮球,计算机知识个人名言:海不辞水,故能成其大;山不辞石…

[ Linux ] 进程间通信之共享内存

在上篇博文我们了解了通过管道完成进程间通信,我们了解匿名管道和命名管道,并且通过编码模拟实现使用了匿名管道和命名管道。我们知道要让进程间完成通信必须让这两个进程首先看到同一份资源,因此给予这个前提,本篇博文我们了解另…

【Linux】自动化构建工具-make/Makefile第一个小程序

大家好我是沐曦希💕 文章目录一.项目自动化构建工具-make/Makefile1.背景2. 举例3. 原理4. 总结5. 项目清理6. 习题习题一习题二二.第一个小程序-进度条1.行缓冲区2.倒计时3.进度条一.项目自动化构建工具-make/Makefile 1.背景 会不会写makefile&#x…

使用 elasticdump 跨版本迁移 ES 数据

1、elasticdump 用途介绍 elasticdump 是一个在 Github 开源的 Elasticsearch 的数据迁移工具,项目 Github 地址:[传送门](Github 地址:https://github.com/elasticsearch-dump/elasticsearch-dump) elasticdump 支持跨版本导出和导入数据&am…

【java进阶07:常用类】String类、包装类、日期类Date、数字类、随机数、枚举类型

String类 String类型的字符串存储原理 /*关于java JDK中内置的一个类:java.util.String1、String表示字符串类型,属于引用数据类型,不属于基本数据类型。2、在java中随便使用双引号括起来的都是String对象,例如:"…

零基础上手unity VR开发【配置PC端项目的实时调试】

📌个人主页:个人主页 ​🧀 推荐专栏:Unity VR 开发成神之路 --【着重解决VR项目开发难,国内资料匮乏的问题。从零入门,一步一个脚印,带你搞定VR开发! 😻😻】 &#x1f4d…

聊一聊如何截获 C# 程序产生的日志

一:背景 1.讲故事 前段时间分析了一个dump,一顿操作之后,我希望用外力来阻止程序内部对某一个com组件的调用,对,就是想借助外力实现,如果用 windbg 的话,可以说非常轻松,但现实情况…

当下互联网行业趋势,你顶得住吗?

持续三年的疫情导致经济形式大不如前,特别是互联网行业,不少员工面临着失业的压力,在如此恶劣的大环境下,计算机行业的我们应该如何生存?有一个很好的办法就是 —— 考证!!!如今越来…

多线程与并发 - 常见的几种锁的实现方式

1、悲观锁 正如其名,它是指对数据修改时持保守态度,认为其他人也会修改数据。因此在操作数据时,会把数据锁住,直到操作完成。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。如果加锁的时间过…

深度学习入门(6)误差反向传播基础---计算图与链式法则

在我的第三篇博文《深度学习入门(3)神经网络参数梯度的计算方式》中详细介绍了通过微分方式计算神经网络权重参数的梯度。但是数值微分的方式计算梯度效率较低。后续博文会介绍另外一种更加高效的梯度计算方式---误差的反向传播。 这篇文章介绍的是误差…

CorelDRAW2023最新版矢量设计软件

CorelDRAW2023最新版是我比较用的比较好的一款软件,因为其作为一款优秀的矢量设计软件,兼具功能和性能,它是由Corel公司出品的矢量设计工具,被广泛应用于排版印刷、矢量图形编辑、网页设计等行业。CDR软件的优势在于:易…

ROS2 机器人操作系统入门和安装以及如何使用 .NET 进行开发

本文是 ROS2 入门的第一课,简单介绍了 ROS 系统,并演示了 ROS2 系统在 Ubuntu 22.04 中的安装(使用 gitee 和清华源)以及其中错误的解决。最后对其优势进行总结,为什么选择 ROS。最后介绍简单 Demo 和如何使用 .NET 接…

ThingsBoard源码解析-规则引擎

描述 规则引擎是Thingsboard的核心部分,基于Actor编程模型,类似事件驱动; 每个actor都有自己的消息队列(mailBox)保存接收到的消息 actor可以创建actor actor可以将消息转发给其他actor 分析 Actor模型实现 系统…

戴尔科技集团通过多云数据保护和安全创新增强网络弹性

中国北京——2022年11月18日 Dell PowerProtect Data Manager软件更新和新一代备份一体机可帮助客户提高运维安全和网络弹性 戴尔多云数据保护解决方案利用内置的安全运维功能加速采用零信任原则 2022年全球数据保护指数(GDPI)调查结果公布 戴尔科技集团(NYSE:Dell)扩大其在数据…