NLP(11)--词向量

news/2024/5/18 23:12:06

前言

仅记录学习过程,有问题欢迎讨论

one-hot 编码 i love u [1,2,3]

词向量训练目标:
如果两个词在文本出现,它的前后出现的词相似,则这两个词语义相似

cbow(基于窗口预测词)缺点
:输出层是vocab_size 会很大
收敛速度会很慢

skipGram --用中间词预测两侧词

哈夫曼树:
用词频来构造树,词频最大,在树的层级越小
对词向量输出层级过大的优化

Glove 词向量:
按照词来编写关于前后语义关系的矩阵—共现矩阵

词向量存在的问题:
1)词向量是“静态”的。每个词使用固定向量,没有考虑前后文

2)一词多义的情况。西瓜 - 苹果 - 华为

3)影响效果的因素非常多
维度选择、随机初始化、skip-gram/cbow/glove、分词质量、词频截断、未登录词、窗口大小、迭代轮数、停止条件、语料质量等

4)没有好的直接评价指标。常需要用下游任务来评价

句向量:
对于所有的词加和求平均 得到文本向量 计算其相似性和聚类
Kmeans
KMeans一些使用技巧:
先设定较多的聚类类别
聚类结束后计算类内平均距离
排序后,舍弃类内平均距离较长的类别

总结:
1.质变:将离散的字符转化为连续的数值

2.通过向量的相似度代表语义的相似度

3.词向量的训练基于很多不完全正确的假设,但是据此训练的词向量是有意义的

4.使用无标注的文本的一种好方法

代码

Demo1:使用gensim
pip install gensim
寻找词之间的相似性

"""
实现一个 TFIDF
"""
import gensim
import jiebadef gensim_train(corpus, dim):model = gensim.models.Word2Vec(corpus,  # 用于训练的语料数据vector_size=dim,  # 是指特征向量的维度,默认为100。window=5,  # 一个句子中当前单词和被预测单词的最大距离。min_count=1,  # 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5。sg=1)model.save("word2vec.w2v")return modeldef main():sentences = []with open("D:\\NLP\\test\\week5\\corpus.txt",encoding="utf8") as f:for line in f:sentences.append(jieba.lcut(line))model = gensim_train(sentences, 100)return modelif __name__ == '__main__':# model = main()# 加载模型model = gensim.models.Word2Vec.load("word2vec.w2v")# print(model.wv.most_similar(positive=["男人", "母亲"], negative=["女人"]))while True:  #找相似string = input("input:")try:print(model.wv.most_similar(string))except KeyError:print("输入词不存在")

kmeans Demo
找出平均距离最大的类内中心点,然后去除该中心点

#!/usr/bin/env python3  
# coding: utf-8# 基于训练好的词向量模型进行聚类
# 聚类采用Kmeans算法
import math
from collections import defaultdictimport gensim
import jieba
import numpy as np
# 基于训练好的词向量模型进行聚类
# 聚类采用Kmeans算法
from gensim.models import Word2Vec
from gensim.models import Word2Vec
from sklearn.cluster import KMeans# 输入模型文件路径
# 加载训练好的模型
def load_word2vec_model(path):model = Word2Vec.load(path)return modeldef load_sentence(path):sentences = set()with open(path, encoding="utf8") as f:for line in f:sentence = line.strip()sentences.add(" ".join(jieba.cut(sentence)))print("获取句子数量:", len(sentences))return sentences# 将文本向量化
def sentences_to_vectors(sentences, model):vectors = []for sentence in sentences:words = sentence.split()  # sentence是分好词的,空格分开vector = np.zeros(model.vector_size)# 所有词的向量相加求平均,作为句子向量for word in words:try:vector += model.wv[word]except KeyError:# 部分词在训练中未出现,用全0向量代替vector += np.zeros(model.vector_size)vectors.append(vector / len(words))return np.array(vectors)# vec1 = 类别
# vec2 = 该类下的数据
def calculate_distant(vec1, vec2):return np.sqrt(sum(np.power(vec1 - vec2, 2)))def main():model = gensim.models.Word2Vec.load("D:\\NLP\\test\\dayPractice\\word2vec.w2v")  # 加载词向量模型sentences = load_sentence("titles.txt")  # 加载所有标题vectors = sentences_to_vectors(sentences, model)  # 将所有标题向量化n_clusters = int(math.sqrt(len(sentences)))  # 指定聚类数量print("指定聚类数量:", n_clusters)kmeans = KMeans(n_clusters)  # 定义一个kmeans计算类kmeans.fit(vectors)  # 进行聚类计算sentence_label_dict = defaultdict(list)# for list1 in kmeans.cluster_centers_:#     print(list1)center_list = defaultdict(list)sentence_index_label_dict = defaultdict(list)index = 0# 取出kmeans的聚点,丢弃掉类内平均距离最长的那个聚点for sentence, label in zip(sentences, kmeans.labels_):  # 取出句子和标签sentence_label_dict[label].append(sentence)  # 同标签的放到一起(分好 一簇的)sentence_index_label_dict[label].append(index) # 同标签的放到一起(记录的是句子的index)index += 1# 记录该组的中心点向量值for index, center in enumerate(kmeans.cluster_centers_):# 记录该组的中心点向量值center_list[index].append(center)distant_list = defaultdict(list)for label, index_list in sentence_index_label_dict.items():# 计算本组所有点到中心点的距离和temp_i = []for i in index_list:temp_i.append(calculate_distant(center_list.get(label), vectors[i]))# 记录当前组的组内平均距离distant_list[label].append(np.mean(temp_i))# 丢弃距离最大的那组drop_label = max(distant_list)del sentence_label_dict[drop_label]for label, sentences in sentence_label_dict.items():print("cluster %s :" % label)for i in range(min(10, len(sentences))):  # 随便打印几个,太多了看不过来print(sentences[i].replace(" ", ""))print("---------")if __name__ == "__main__":main()

http://www.mrgr.cn/p/14543808

相关文章

代谢组数据分析七:从质谱样本制备到MaxQuant搜库

前言 LC-MS/MS Liquid Chromatography-Mass Spectrometry(LC-MS/MS ,液相色谱-质谱串联)可用于残留化合物检测、有机小分子检测、鉴定和定量污染物以及在医药和食品领域添加剂检测和生物小分子等检测。 LC-MS/MS一般包含五个步骤&#xff…

BUUCTF——web题目练习

[极客大挑战 2019]LoveSQL 输入1 123 输入1 123 输入2 123 这里可以看出注入位置为password的后面,开始手动注入 闭合方式为1 [极客大挑战 2019]Secret File 查看页面源代码,发现里面有一个跳转页面的连接,点击进去,查看这个…

2024年13个最佳Scrum工具评测

本文将介绍2024年13个高级Scrum敏捷开发管理工具。Scrum 管理工具有:PingCode、Jira、Trello、Zoho Sprints、Active Collab、ProProfs Project、Scrumwise、ClickUp、Monday.com、QuickScrum、Yodiz、ScrumDo、nTask在过去几年中,Scrum方法论已成为敏捷项目管理的主要框架之…

鸿蒙开发前四章

鸿蒙开发前四章 第二章:开发环境搭建 首先要创建project,然后用Empty Activity模版,可以选visual(支持低代码可视化的开发)一个项目可以有多个module,new module选择同上,还可以导入module。第三章:开发一个harmonyOs应用 (1)创建一个新项目(用java写) 那么sdk版本…

根据Docker部署nginx并且实现https

一、根据Docker部署nginx并且实现https 1.1、Docker中启用HTTPS有几个重要的原因 安全性:HTTPS通过加密数据传输,可以确保数据在传输过程中不被窃听或篡改。这对于保护敏感信息(如用户凭据、支付信息等)的传输至关重要。 数据完…

全新突破:「Paraverse平行云」实现3D/XR企业级应用全面接入Apple Vision Pro

在前不久举行的GTC开发者大会上,英伟达引领行业风向,宣布其Omniverse平台能够助力企业将3D/XR应用流畅传输至Apple Vision Pro混合现实头显。在英伟达与苹果这两大科技巨头的合作下,此举标志着3D/XR技术迈向新纪元的关键一步。「Paraverse平行云」实时云…

Window(Qt/Vs)软件添加版本信息

Window(Qt/Vs)软件添加版本信息 文章目录 Window(Qt/Vs)软件添加版本信息VS添加版本信息添加资源文件添加版本定义头自动更新版本添加批处理脚本设置生成事件 Qt添加版本信息添加资源文件文件信息修改自动更新版本 CMake添加版本信…

06. C语言指针

【指针】 C语言使用数据名调用数据,数据名相当于C语言的直接寻址,直接寻址只能调用固定数据,而指针是间接寻址,指针存储了另一个数据的地址,使用指针调用数据时首先取指针存储的内存地址,之后使用此地址调用数据,使用间接寻址有如下几点优势:1.统一数据的调用方式,因为…

程序员天天 CURD,怎么才能成长,职业发展的思考(2)

接着上一篇:程序员天天 CURD,怎么才能成长,职业发展思考 上一篇写到了用年限来谈程序员的发展,在 4 - 6 年这个时间段需要做的一些事情,接着写这个时间段的。 第 4、5 年时候,你可能会做一些关于基层管理工作。这个时期会遇到一些困难。 这个时期,既要编写代码,又要做基…

电脑技巧:推荐一款非常好用的媒体播放器PotPlayer

目录 一、 软件简介 二、功能介绍 2.1 格式兼容性强 2.2 高清播放与硬件加速 2.3 自定义皮肤与界面布局 2.4 多音轨切换与音效增强 2.5 字幕支持与编辑 2.6 视频截图与录像 2.7 网络流媒体播放 三、软件特色 四、使用技巧 五、总结 一、 软件简介 PotPlayer播放器 …

git 服务端

1.安装gityum install -y git 2.查看版本git --version 3.创建用户useradd gitpasswd git 4.初始化仓库git init --bare /home/git/dataCollect.git 5.将拥有者改为gitgit init --bare /home/git/dataCollect.git

如何基于surging跨网关跨语言进行缓存降级

概述surging是一款开源的微服务引擎,包含了rpc服务治理,中间件,以及多种外部协议来解决各个行业的业务问题,在日益发展的今天,业务的需求也更加复杂,单一语言也未必能抗下所有,所以在多语言行业解决方案优势情况下,那么就需要多语言的协同研发,而对于协同研发环境下,…

AtCoder Grand Contest 001

D. Arrays and Palindrome 如果两个字符要求相同就给它们连边,对于一个长度为 \(x\) 的回文串,\(x\) 是偶数会连 \(x/2\) 条边,奇数会连 \(x/2 - 0.5\) 条边。 \(a\) 和 \(b\) 两个序列总和为 \(2n\),要让 \(n\) 个字符相同至少连 \(n - 1\) 条边,也就是奇数个数超过 \(2\…

IoTDB 入门教程 问题篇②——RPC远程连接IoTDB服务器失败

文章目录 一、前文二、发现问题三、分析问题四、检查6667端口是否监听所有IP五、检查ECS云服务器的安全组是否允许六、检查Linux防火墙是否允许 一、前文 IoTDB入门教程——导读 二、发现问题 使用本地IP127.0.0.1可以连接IoTDB服务器使用远程IPxx.xx.xx.xx却连接不到。提示你…

Unity开发微信小游戏(2)分享

目录 1.概述 2.代码 3.示例 4.个人作品 1.概述 这里我们能做有两件事: 1)主动发起分享 2)监听右上角分享(...按钮,发朋友圈也在这里) API:官方文档 2.代码 1)主动发起分享&…

程序的机器级表示——Intel x86 汇编讲解

往期地址: 操作系统系列一 —— 操作系统概述操作系统系列二 —— 进程操作系统系列三 —— 编译与链接关系操作系统系列四 —— 栈与函数调用关系操作系统系列五 —— 目标文件详解操作系统系列六 —— 详细解释【静态链接】操作系统系列七 —— 装载操作系统系列…

分层图像金字塔变压器

文章来源:hierarchical-image-pyramid-transformers 2024 年 2 月 5 日 本文介绍了分层图像金字塔变换器 (HIPT),这是一种新颖的视觉变换器 (ViT) 架构,设计用于分析计算病理学中的十亿像素全幻灯片图像 (WSI)。 HIPT 利用 WSI 固有的层次结…

【Android学习】自定义文本框和输入监听

实现功能 以上代码可实现功能: 1 自定义文本框样式 2. 文本框触发形式转变 3. 文本框输入长度监听,达到最大长度关闭软键盘 4. password框触发检测phone框内容 1. drawable自定义形状 我创建了editor_focus.xml 和 editor_unfocus.xml,两者仅…

eNSP-浮动静态路由配置

ip route-static 192.168.1.0 24 192.168.3.2 preference 60 #设置路由 目标网络地址 和 下一跳地址 preference值越大 优先级越低 一、搭建拓扑结构 二、主机配置 pc1 pc2 三、配置路由器 1.AR1路由器配置 <Huawei>sys #进入系统视图 [Huawei]int g0/0/0 #进入接…

旅游系列之:庐山美景

旅游系列之&#xff1a;庐山美景 一、路线二、住宿二、庐山美景 一、路线 庐山北门乘坐大巴上山&#xff0c;住在上山的酒店东线大巴游览三叠泉&#xff0c;不需要乘坐缆车&#xff0c;步行上下三叠泉即可&#xff0c;线路很短 二、住宿 长江宾馆庐山分部 二、庐山美景