python词嵌入

一、词嵌入的概念

自然语言处理的突破在2023年震撼世界,chatgpt3出来,之后chatgpt4、Gemini、Claude3等出来,问答越来越智能,非常厉害,其中有个基础性的概念,计算机要如何理解语言,基础工作就在于将词向量化,关键的概念便是词嵌入(word embeddings),之前我觉得这个词读的非常绕口,想为什么不直接叫词向量?其实形成词向量的方法有很多,包括词袋模型(Bag-of-Words model)也是一种方法,而词嵌入很厉害,可以让算法自动的理解一些类似的词,也就是自监督,通过词嵌入的概念就可以方便的构建NLP应用了!当然现在也有人在思考如何改进词嵌入的理解深度。

构建词嵌入的步骤有两步:

1、词嵌入第一步是给所有词构建one-hot向量,形成一个巨大的稀疏矩阵,每个词对应到某一个位置为1的向量。

2、通过深度学习来产生词嵌入,比如skip-grams学习词嵌入矩阵,词嵌入矩阵的格式有点像下面这样,当然每个维度表示什么含义属于自监督的事情,也就是说人是不知道的,一般设置成100~300维,词嵌入实际上属于“辅助产品”。以skip-grams算法为例,核心思想是构建一个监督学习问题:根据已有一个目标词,在多少个词内(自己定)找到另一个词,做成一个合理搭配。本身这个问题也很难解,但转成一个求概率问题之后,定义它的损失函数,经过反向传播算法它便是可以计算的了。

但是上面这个算法的计算复杂度是很高的,一旦数据量增大,计算会变得非常慢。因此就有分级(hierarchical)的softmax分类器负采样(Negative Sampling)分级的思路就是算法中常用的分而治之的思路,这种思路诞生了二分法、动态规划等算法,其实就是在softmax中不用先直接分到某个类,先确定区间,是前50%的分类还是后50%的分类负采样的逻辑也简单,除了给正确词之外,也给不正确词,两者做搭配,从而减少运算量

二、代码示例

正常项目都需要经过数据处理,比如去除html标签、特殊字符,先将数据放入到clean_text中:

# bs4 nltk gensim
import os
import re
import numpy as np
import pandas as pd
from bs4 import BeautifulSoup
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix
from sklearn.linear_model import LogisticRegression
import nltk
from nltk.corpus import stopwords


df['clean_review'] = df.review.apply(clean_text)

定义文本清理函数,包括取出html文本中数据等,re.sub表示替换函数、将非a-z、A-Z的字符替换成空格,之后剔除停用词:

def clean_text(text):
    text = BeautifulSoup(text, 'html.parser').get_text()
    text = re.sub(r'[^a-zA-Z]', ' ', text)
    words = text.lower().split()
    words = [w for w in words if w not in eng_stopwords]
    return ' '.join(words)

处理分词,tokenizer是分词器,最后得到单独句子的集合:

review_part = df['clean_review']
# 加载分词器
tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')

def split_sentences(review):
    # 将长文本转换成句子的list
    raw_sentences = tokenizer.tokenize(review.strip())
    sentences = [clean_text(s) for s in raw_sentences if s]
    return sentences
sentences = sum(review_part.apply(split_sentences), [])

然后进一步将将句子中的词提出放置到sentences_list中:

sentences_list = []
for line in sentences:
    sentences_list.append(nltk.word_tokenize(line))

准备训练word2vec,相关参数说明如下:

  • sentences:可以是一个list

  • sg: 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。

  • size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。

  • window:表示当前词与预测词在一个句子中的最大距离是多少

  • alpha: 是学习速率

  • seed:用于随机数发生器。与初始化词向量有关。

  • min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5

  • max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。

  • workers参数控制训练的并行数。

  • hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(defau·t),则negative sampling会被使用。

  • negative: 如果>0,则会采用negativesamp·ing,用于设置多少个noise words

  • iter: 迭代次数,默认为5

设置参数:

# 设定词向量训练的参数
num_features = 300    # Word vector dimensionality
min_word_count = 40   # Minimum word count
num_workers = 4       # Number of threads to run in parallel
context = 10          # Context window size
model_name = '{}features_{}minwords_{}context.model'.format(num_features, min_word_count, context)

进行训练:

from gensim.models.word2vec import Word2Vec
model = Word2Vec(sentences_list, workers=num_workers, \
            vector_size=num_features, min_count = min_word_count, \
            window = context)

# If you don't plan to train the model any further, calling 
# init_sims will make the model much more memory-efficient.
model.init_sims(replace=True)

# It can be helpful to create a meaningful model name and 
# save the model for later use. You can load it later using Word2Vec.load()
model.save(os.path.join('..', 'models', model_name))

测试下模型情况:

model.most_similar("boy")

输出结果:

[('girl', 0.7018299698829651),
 ('astro', 0.6647905707359314),
 ('teenage', 0.6317306160926819),
 ('frat', 0.60948246717453),
 ('dad', 0.6011481285095215),
 ('yr', 0.6010577082633972),
 ('teenager', 0.5974895358085632),
 ('brat', 0.5941195487976074),
 ('joshua', 0.5832049250602722),
 ('father', 0.5825375914573669)]

很神奇是不是!数据量大了之后会有更好的效果,词嵌入可以直接从文本中读出关系来!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IOS苹果通话记录在线生成网站源代码,直接上传就可使用

一键生成,PHP的上传到网站根目录打开域名访问即可 源码免费下载地址专业知识分享社区-专业知识笔记免费分享 (chaobiji.cn)

个人开发者如何制作实用的微信预约小程序?

随着移动互联网的普及,微信小程序已经成为一种非常流行的应用方式。在本文中,我们将介绍如何通过乔拓云平台制作一个微信预约小程序,从入门到精通,让你轻松完成这个过程。 一、注册登录乔拓云平台 首先,你需要在乔拓云…

为什么说鸿蒙开发就业面广?人才遭“爆抢”的背后说明什么?

鸿蒙开发,作为华为推出的全新操作系统,自其诞生以来就备受关注。而鸿蒙开发就业面广,人才遭“爆抢”的现象,更是引发了业界的广泛讨论。那么,这一现象背后究竟隐藏着怎样的原因和深意呢? 首先,鸿…

Vue.js 进阶技巧:keep-alive 缓存组件解析

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Java数组常用操作

创建数组 int[] a {1,2,3};int[] a new int[]{1,2,3};int[] a new int[3];ArrayList<Integer> arr new ArrayList<>(); 添加元素 arr.add(99); //将99加入到数组末尾arr.add(3,99); //将99加入到指定索引3处访问元素 int c1 c[1]; int arr1 arr.get(1); …

链表习题-力扣oj (附加思路版)

LCR 140. 训练计划 IIhttps://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/ 给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号&#xff0c;请查找并返回倒数第 cnt 个训练项目编号。 思路&#xff1a;双指针&#xff0c;快指针先走cnt…

Java中的优先队列PriorityQueue如何排序

目录 一、基本数据类型的排序 &#xff08;1&#xff09;升序 &#xff08;2&#xff09;降序 二、自定义类型如何排序 &#xff08;1&#xff09;升序 &#xff08;2&#xff09;降序 既然大家想要了解优先队列的排序&#xff0c;那么说明已经知道什么事优先队列了&…

ROS 2基础概念#6:服务(Service)| ROS 2学习笔记

服务&#xff08;Service&#xff09;是 ROS 2 计算图中节点通信的另一种方法。 服务基于调用和响应模型&#xff0c;而不是主题的发布者-订阅者模型。 虽然主题允许节点订阅数据流并获取持续更新&#xff0c;但服务仅在客户端专门调用时才提供数据。 ROS 2服务的基本概念 ROS…

浮点数的储存

浮点数的储存 一.浮点数的三段式&#xff08;S,E,M&#xff09;1.如何放入2.如何取出 二.为什么浮点数不能直接比较三.解释第一个问题 我们都知道整形在内存中是按照补码的形式储存的&#xff0c;但是浮点数的储存却和整数的截然不同&#xff0c;浮点数没有所谓是原反补并且浮点…

实现类似 Word 协同编辑--Canvas-Editor

前言 对于word的协同编辑&#xff0c;已经构思很久了&#xff0c;但是没有找到合适的插件。今天推荐基于canvas/svg 的富文本编辑器 canvas-editor&#xff0c;能实现类似word的基础功能&#xff0c;如果后续有更好的&#xff0c;也会及时更新。 Canvas-Editor效果图: 官方文…

重学SpringBoot3-WebMvcAutoConfiguration类

重学SpringBoot3-WebMvcAutoConfiguration类 是什么什么用生效条件作用 自定义配置的三种方式自定义配置举例1. 自定义 DispatcherServlet 配置2. 静态资源配置3. 自定义MVC配置4. 消息转换器5. 异常处理 是什么 org.springframework.boot.autoconfigure.web.servlet.WebMvcAut…

【QT6】打开项目 .pro 一堆报错 但是程序可以运行 打开别人的QT项目后,全是报错

报错环境 我通过在网上拷贝的项目&#xff0c; 然后打开pro文件 build项目 你会发现各种报错 无缘无故的报错 明明环境已经没问题了 解决方案 首先是提示no valid settings file could be found&#xff0c;这个错误很好解决&#xff0c;删除项目目录下的.user文件&#xff…

线性代数笔记14--投影

1. 一维空间投影 p X A e B − p B − X A A ⊤ e 0 A ⊤ ( B − X A ) 0 X A ⊤ A A ⊤ B X A ⊤ B A ⊤ A p X A A A ⊤ B A ⊤ A pXA\\ eB-pB-XA\\ A^{\top}e0\\ A^{\top}(B-XA)0\\ XA^{\top}AA^{\top}B\\ X\frac{A^{\top}B}{A^{\top}A}\\ pXAA\frac{A^{\top}B}{A^…

域名交易系统源码 无需授权即可正常使用,带后台,附带系统搭建教程

搭建教程 数据库配置文件 config/config.php 后台 http://域名/ymadmin 用户&#xff1a;admin 密码&#xff1a;aa.798yyds.top PHP选择5.6 伪静态&#xff1a; 伪静态默认是Apache 伪静态转换&#xff1a;http://tool.bolgk.eu.org/htaccess2nginx/ 其他打不开请根据伪静态设…

Android屏幕共享-硬编码硬解码

Android屏幕共享-硬编码硬解码 说起Android之间的屏幕共享&#xff0c;第一次接触会比较陌生&#xff0c;不过大家多少有了解过ffmpeg&#xff0c;看上去是不是很熟悉&#xff1f;ffmpeg是一套处理音视频的开源程序&#xff0c;但对于C了解较少的同学&#xff0c;编译起来很复杂…

鸿蒙系统:揭秘前端开发的新机遇

众所周知&#xff0c;华为开发者大会2023&#xff0c;宣布不再兼容安卓&#xff0c;同时宣布了“鸿飞计划”&#xff0c;欲与iOS、安卓在市场三分天下&#xff0c;这对中国国产操作系统而言&#xff0c;具有划时代的意义。 鸿蒙应用开发的兴起&发展 鸿蒙操作系统是华为自…

旅游陪同翻译,英译中需要具备什么能力!

随着中国旅游业的蓬勃发展&#xff0c;越来越多的外国游客选择踏足这片充满魅力的土地。然而&#xff0c;语言障碍常常成为他们探索中国文化的绊脚石。在这时&#xff0c;旅游陪同翻译应运而生&#xff0c;为游客提供了便捷的语言沟通服务&#xff0c;让他们的旅程更加顺畅和愉…

NFT Insider #122:OpenSea与科切拉音乐节合作推出NFT系列,Flowty联合创始人购入勒布朗・詹姆斯NFT

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members (https://twitter.com/WHALEMembers)、BeepCrypto (https://twitter.com/beep_crypto) 联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&a…

借着ChatGPT的人机交互聊聊长连接

ChatGPT这两年可谓风靡全球&#xff0c;尤其是最近Sora视频模型的横空出世以及claude 3模型所具备的浅意识&#xff0c;更是像打开了新世界的大门。本文就从ChatGPT的网页聊天开始聊起&#xff08;有蹭热度之嫌&#xff0c;哈哈&#xff09;&#xff0c;聊聊长连接的发展历程和…

13 OpenCv自定义线性滤波

文章目录 卷积算子示例 卷积 卷积是图像处理中一个操作&#xff0c;是kernel在图像的每个像素上的操作。Kernel本质上一个固定大小的矩阵数组&#xff0c;其中心点称为锚点(anchor point) 把kernel放到像素数组之上&#xff0c;求锚点周围覆盖的像素乘积之和&#xff08;包括锚…