当前位置: 首页 > java >正文

NLP基础1_word-embedding

基于github项目:https://github.com/shibing624/nlp-tutorial/tree/main

自然语言处理任务

1) 简单任务

  • 拼写检查 Spell Checking

  • 关键词检索 Keyword Search

  • 同义词查找 Finding Synonyms

2) 中级任务

  • 解析来自网站、文档等的信息

3) 复杂任务

  • 机器翻译 Machine Translation

  • 语义分析 Semantic Analysis

  • 指代消解 Coreference

  • 问答系统 Question Answering

文本表示

传统离散表示

在自然语言处理(Natural Language Processing,NLP)领域,文本表示是处理流程的第一步,主要是将文本转换为计算机可以运算的数字。

文本表示方法的技术演进:

符号表示法(Symbolic)

示例:词典编码「自然语言处理」→ {"自":1, "然":2, "语":3, "言":4, "处":5, "理":6}

from sklearn.feature_extraction.text import CountVectorizer
corpus = ["自然语言处理 是 人工智能 的 重要 分支"]
vectorizer = CountVectorizer(token_pattern=r'\b\w+\b')
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names_out())  # ['人工智能', '分支', '处理', '自然语言处理', '重要']

词袋模型(Bag-of-Words, BoW)

原理:忽略词序,统计每个词在文档中的出现次数

from sklearn.feature_extraction.text import CountVectorizer
corpus = ["I love NLP.", "NLP is amazing!"]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(X.toarray())  # 输出:[[1 1 1 0] [0 1 0 1]] 
print(vectorizer.vocabulary_)  # {'love': 2, 'nlp': 1, 'is': 3, 'amazing': 0}

例子1:

句1:Jane wants to go to Shenzhen 句2:Bob wants to go to Shanghai

使用两个例句来构造词袋: [Jane, wants, to, go, Shenzhen, Bob, Shanghai]

两个例句就可以用以下两个向量表示,对应的下标与映射数组的下标相匹配,其值为该词语出现的次数

句1:[1,1,2,1,1,0,0] 句2:[0,1,2,1,0,1,1]

TF-IDF(词频-逆文档频率)

原理:降低常见词权重,提升重要词权重
TF-IDF = TF(t, d) × IDF(t)

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ["The cat sat on the mat.", "Dog on mat."]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
print(X.toarray())  # 非对称矩阵

优劣对比

方法优点缺点
BoW简单高效,易于实现忽略词序、语义信息,维度灾难
TF-IDF减少常见词干扰仍无法捕捉语义关系

 分布式表示(词嵌入)

核心思想:用稠密向量表示词语,捕获语义关联

Word2Vec

原理:通过上下文预测目标词(Skip-Gram)或反之(CBOW)

from gensim.models import Word2Vec
sentences = [["nlp", "is", "cool"], ["deep", "learning", "too"]]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1)
print(model.wv["nlp"])  # 输出100维向量

向量示例"king" - "man" + "woman" ≈ "queen"

GloVe(Global Vectors)

原理:基于全局词共现矩阵的加权最小二乘训练

from gensim.scripts.glove2word2vec import glove2word2vec
from gensim.models import KeyedVectors
glove2word2vec("glove.txt", "word2vec_format.txt")
model = KeyedVectors.load_word2vec_format("word2vec_format.txt")

优劣对比

方法优点缺点
Word2Vec高效捕获局部语义未利用全局统计信息
GloVe结合全局共现统计训练速度较慢

 上下文感知表示

核心突破:根据上下文动态调整词向量

ELMo(Embeddings from Language Models)

原理:双向LSTM生成上下文相关向量

from allennlp.modules.elmo import Elmo, batch_to_ids
options_file = "https://allennlp.s3.amazonaws.com/models/elmo/2x4096_512_2048cnn_2xhighway/elmo_2x4096_512_2048cnn_2xhighway_options.json"
weight_file = "https://allennlp.s3.amazonaws.com/models/elmo/2x4096_512_2048cnn_2xhighway/elmo_2x4096_512_2048cnn_2xhighway_weights.hdf5"
elmo = Elmo(options_file, weight_file, 1)
character_ids = batch_to_ids(["hello world"])
embeddings = elmo(character_ids)['elmo_representations'][0]

BERT(Bidirectional Encoder Representations)

原理:Transformer编码器 + Masked LM训练

from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
inputs = tokenizer("Hello NLP!", return_tensors="pt")
outputs = model(**inputs)
last_hidden_states = outputs.last_hidden_state  # [1, seq_len, 768]

向量示例
同一词在不同上下文的BERT表示:

  • "bank" in "river bank" → [0.2, -0.7, ..., 0.4]

  • "bank" in "bank account" → [0.8, 0.1, ..., -0.3]

方法类型典型代表语义捕获上下文敏感训练成本应用场景
传统离散表示BoW, TF-IDF极低简单文本分类
静态词嵌入Word2Vec中等(静态)中等关键词扩展、推荐
上下文动态嵌入BERT✔️极高语义理解、问答系统
http://www.xdnf.cn/news/14612.html

相关文章:

  • 利用大型语言模型增强边缘云 AI 系统安全性
  • AI智能化高效办公:WPS AI全场景深度应用指南
  • qt常用控件--03
  • 重点解析(软件工程)
  • 从零学习linux(2)——管理
  • 2025年检测相机十大品牌测评:工业级精度与场景化解决方案解析
  • DeepSeek今天喝什么随机奶茶推荐器
  • Docker知识点汇总——AI教你学Docker
  • 企业主动风险管理破局供应链“黑天鹅”,善用期货
  • Origin绘制三Y轴柱状图、点线图、柱状点线图
  • Spark基于Bloom Filter算法的Runtime Filter Join优化机制
  • STM32 串口通信②:蓝牙模块HC-05控制单片机
  • 以玄幻小说方式打开深度学习词嵌入算法!! 使用Skip-gram来完成 Word2Vec 词嵌入(Embedding)
  • Maven 多模块项目调试与问题排查总结
  • Elasticsearch 索引文档的流程
  • 酒店住宿自助入住系统——店铺自动运营—仙盟创梦IDE
  • 【达梦数据库】忘记SYSDBA密码处理方法-已适配
  • Python导论、数据类型、运算、I/O
  • 华大北斗TAU951M-P200单频定位模块 多系统冗余保障永不掉线 物流/车载导航首选
  • MySQL学习(1)——基础库操作
  • 开关电源:BUCK和BOOST
  • 逆向某物 App 登录接口:还原 newSign 算法全流程
  • 《情感反诈模拟器》2025学习版
  • 装配体镜像阵列与爆炸视图-装配体设计技能(2)
  • 算法-动态规划-钢条切割问题
  • 数智管理学(二十四)
  • C# Quartz.net 定时任务
  • Java Spring框架的核心原理详解
  • JDK 动态代理: 它的工作原理是什么?它有什么限制?
  • Linux系统基本操作指令