问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

让计算机理解人类语言:词向量的构建与应用

创作时间:
作者:
@小白创作中心

让计算机理解人类语言:词向量的构建与应用

引用
1
来源
1.
http://www.360doc.com/content/25/0128/08/36367108_1145473921.shtml

词向量是自然语言处理(NLP)中的重要概念,它通过将词语表示为多维向量来捕捉词语的语义信息。本文将介绍词向量的基本概念、构建方法和应用案例,帮助读者深入理解这一技术的核心原理。

词向量的基本概念

词向量是用于表示词语在语义空间中位置的向量。通过将词语转换为向量,我们可以在数学上处理词语的相似性和关系。词向量的核心思想是“可以通过它周围的词语了解一个单词”('You shall know a word by the company it keeps'),也就是说一个词的意义可以通过它在文本中与其他词的共现关系来捕捉。

数学模型

下面我介绍的构建词向量的过程主要是基于词语间的共现关系,分为以下几个步骤:

  1. 语料库准备:首先需要一个大规模的文本语料库,用于统计词语的共现关系。
  2. 上下文窗口:选择一个合适的上下文窗口大小(通常为5到10个词),用于确定哪些词语是目标词的上下文词。
  3. 共现矩阵:构建一个共现矩阵,矩阵的每一行代表一个目标词,每一列代表一个上下文词,矩阵中的值表示目标词与上下文词在文本中共现的频率。
  4. 降维处理:使用降维算法(如SVD、PCA等)将高维的共现矩阵转换为低维的词向量表示。

假设我们有一个包含个词语的词汇表,我们可以构建一个的共现矩阵,其中表示词语和在上下文窗口中的共现频率。然后我们通过降维算法将共现矩阵转换为词向量矩阵,其中每一行表示词语的向量表示。常用的降维算法包括奇异值分解(SVD)和主成分分析(PCA)等。

案例分析

我们通过一个具体的例子来说明构建词向量的过程。

  1. 语料库准备:假设我们的语料库是以下简短的文本:

    I love machine learning.
    Machine learning is fun.
    I love coding.
    

    我们的词汇表包含以下词语:

    I
    ,
    love
    ,
    machine
    ,
    learning
    ,
    is
    ,
    fun
    ,
    coding
    
  2. 上下文窗口:选择上下文窗口大小为2,即考虑目标词前后各2个词。

  3. 共现矩阵:统计词语在上下文窗口中的共现频率,得到以下共现矩阵:

  4. 降维处理:使用奇异值分解(SVD)对共现矩阵进行降维处理。SVD将矩阵分解为三个矩阵的乘积:,其中和是正交矩阵,是对角矩阵。通过截取前个奇异值,可以得到低维词向量矩阵。

如果设定降维后的维度为2,我们可以得到以下词向量:

为了验证我们构建的词向量的有效性,我们可以计算词语之间的余弦相似度。余弦相似度用于衡量两个向量之间的相似性,计算公式为:

其中,表示向量和的点积,和分别表示向量和的模。

我们计算以下词语对之间的余弦相似度:

  1. love 和 coding
  2. machine 和 learning
  3. is 和 fun
import numpy as np

# 定义降维后的词向量矩阵
word_vectors = np.array([
    [1.51499668, -1.4173672],
    [1.87698946, 1.68604424],
    [1.66865789, 0.19649234],
    [1.49526816, -0.93713897],
    [1.08538304, 0.17374271],
    [0.72099204, 0.30320536],
    [0.52440038, -0.66966223]
])

# 词汇表
words = ['I', 'love', 'machine', 'learning', 'is', 'fun', 'coding']

# 计算余弦相似度的函数
def cosine_similarity(vec1, vec2):
    dot_product = np.dot(vec1, vec2)
    norm_vec1 = np.linalg.norm(vec1)
    norm_vec2 = np.linalg.norm(vec2)
    return dot_product / (norm_vec1 * norm_vec2)

# 计算特定词语对之间的余弦相似度
pairs = [('love', 'coding'), ('machine', 'learning'), ('is', 'fun')]
for pair in pairs:
    idx1 = words.index(pair[0])
    idx2 = words.index(pair[1])
    similarity = cosine_similarity(word_vectors[idx1], word_vectors[idx2])
    print(f"'{pair[0]}' 和 '{pair[1]}' 之间的余弦相似度: {similarity:.4f}")

运行结果:
'love' 和 'coding' 之间的余弦相似度: -0.0675
'machine' 和 'learning' 之间的余弦相似度: 0.7794
'is' 和 'fun' 之间的余弦相似度: 0.9715

从结果可以看出,machine和learning以及is和fun的相似度较高,而love和coding的相似度相对较低。当然因为我们现在的文本(语料库)比较小,这里的相似关系或许不那么明显。我们可以进行大语料库的试验。

来看看与我们对这些词语在语义上的预期是否是一致的,进而验证我们构建的词向量能否在一定程度上捕捉到了词语之间的语义关系。

如果大家想要了解更多关于词向量的内容,可以进一步学习以下概念和方法:了解基于神经网络的Word2Vec模型和斯坦福大学提出的GloVe模型,这两者都是经典的词向量构建方法。还有Facebook AI研究团队开发的FastText模型,它通过子词生成向量表示。Google的BERT模型和Transformer架构,这些是现代NLP的重要进展。

学习如何使用t-SNE或PCA对词向量进行降维和可视化。研究上下文嵌入(如ELMo、BERT、GPT),它们根据上下文动态生成词语的向量表示。这些方法和工具可以帮助大家更全面地理解和应用词向量技术。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号