词汇表征(Word Representation)

来源:Coursera吴恩达深度学习课程

自然语言处理中一个很关键的概念就是词嵌入(word embeddings),这是语言表示的一种方式,可以让算法自动的理解一些类似的词。如下图,我们先开始讨论词汇表征(word representation)

目前为止我们一直都是词汇表(vocabulary)来表示词,词汇表可能是10000个单词,我们一直one-hot向量来表示词。比如man在词典里是第5391个,那么就可以表示成一个向量,只在第5391处为1,我们用O_5391代表这个量,这里的O代表one-hot。接下来,如果woman是编号9853,那么就可以用O_9853来表示,这个向量只在9853处为1,其他为0,其他的词king、queen、apple、orange都可以这样表示出来,这种表示方法的一大缺点(weakness)就是它把每个词孤立起来,这样使得算法对相关词的泛化能力不强。

举个例子,假如我们已经学习到了一个语言模型,当你看到“I want a glass of orange ___”,那么下一个词会是什么?很可能是juice。即使你的学习算法已经学到了“I want a glass of orange juice”,但如果看到“I want a glass of apple ___”,因为算法不知道apple和orange的关系很接近,就像man和woman,king和queen一样。所以算法很难从已经知道的orange juice是一个常见的东西,而明白apple juice也是很常见的东西或者说常见的句子。这是因为任何两个one-hot向量的内积都是0,如果你取两个向量,比如king和queen,然后计算它们的内积,结果就是0。如果用apple和orange来计算它们的内积,结果也是0。很难区分它们之间的差别,因为这些向量内积都是一样的,所以无法知道apple和orange要比king和orange,或者queen和orange相似地多。

换一种方式表示会更好,如下图所示:

如果我们不用one-hot表示,而是用特征化的表示(learn a featurized representation)来表示每个词,man,woman,king,queen,apple,orange或者词典里的任何一个单词,我们学习这些词的特征或者数值

对于这些词,(1)比如第一个特征是性别(Gender)。假定男性的性别为-1,女性的性别为+1,那么man的性别值可能就是-1,而woman就+1。最终根据经验king就是-0.95,queen是+0.97,apple和orange没有性别可言。

(2)另一个特征可以是这些词有多高贵(Royal),man,woman和高贵没太关系,所以它们的特征值接近0。而king和queen很高贵,取值更大一些,apple和orange跟高贵也没太大关系。

(3)那么年龄(Age)呢?man和woman一般没有年龄的意思,也许man和woman隐含着成年人的意思,但也可能是介于young和old之间,所以它们(man和woman)的值也接近0。而通常king和queen都是成年人,apple和orange跟年龄更没什么关系了。

(4)还有一个特征,这个词是否是食物(Food),man不是食物,woman不是食物,king和queen也不是,但apple和orange是食物。

当然还可以有很多的其他特征,从尺寸大小(Size),花费多少(Cost),这个东西是不是活的(Alive),是不是一个动作(Action),或者是不是名词(Noun)或者是不是动词(Verb),还是其他的等等。

在这里我们假设有300个不同的特征,这样的话你就有了这一列数字(上图蓝色竖框),有一个300维的向量来表示man这个词。用符号e_5391来表示。同样用这个300维的向量用来表示woman这个词,符号为e_9853,这些其他的例子也一样。现在,如果用这种表示方法来表示apple和orange这些词,那么apple和orange的这种表示会非常相似。这样对于已经知道orange juice的算法很大几率上也会明白apple juice这个东西,这样对于不同的单词算法会泛化的更好。

接下来的讲解中有一种学习词嵌入的方式,现在只需要理解这种高维特征的表示能够比one-hot更好的表示不同的单词。而我们最终学习的特征不会像这里一样这么好理解,新的特征表示的东西肯定会更难搞清楚。尽管如此,接下来要学的特征表示方法却能使算法高效地发现apple和orange会比king和orange,queen和orange更加相似。

如果我们能够学习到一个300维的特征向量(词嵌入),通常我们可以把这300维的数据嵌入到一个二维空间里实现可视化。常用的可视化算法是t-SNE算法来自于Laurens van der Maaten 和 Geoff Hinton的论文

如上图,如果观察这种词嵌入的表示方法,我们看到man和woman这些词聚集在一块,king和queen聚集在一块,表示人的单词也都聚集在一起。动物都聚集在一起,水果也都聚集在一起,像1、2、3、4这些数字也聚集在一起。如果把这些生物看成一个整体,他们也聚集在一起。

就整体而言,这种词嵌入算法(word embeddings algorithms)对于相近的概念,学到的特征也比较类似,在对这些概念可视化的时候,最终把它们映射为相似的特征向量。这种表示方式用的是在300维空间里的特征表示,这叫做嵌入(embedding)。之所以叫嵌入的原因是,你可以想象一个300维的空间,这里用个3维的代替。现在取每一个单词比如orange,它对应一个3维的特征向量,所以这个词就被嵌在这个300维空间里的一个点上了,apple这个词就被嵌在这个300维空间的另一个点上。为了可视化,t-SNE算法把这个空间映射到低维空间,也可以画出一个2维图像然后观察,这就是这个术语嵌入的来源

以上就是词嵌入的概念。

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

### Python 中语义相似度的专业术语和实现方法 #### 一、专业术语解释 1. **词嵌入 (Word Embedding)** 词嵌入是一种将词语映射到实数向量空间的技术,使得具有相似含义的词语在该空间中有较短的距离。常用的模型包括 Word2Vec 和 GloVe。 2. **欧几里得距离 (Euclidean Distance)** 这种距离衡量的是两个向量之间的直线距离,在多维空间中用于评估两词向量间的差异程度[^1]。 3. **余弦相似度 (Cosine Similarity)** 计算两个非零向量间夹角的余弦值来判断其方向上的相似性。当两个向量越接近平行,则它们之间的角度就越小,相应的余弦值也越大,表明这两个向量更加相似。 4. **稀疏编码 (Sparse Encoding)** 将每个单词表示成高维度下的独热码形式,虽然直观易懂,但由于缺乏上下文信息而导致难以捕捉词汇间的内在联系[^2]。 5. **停用词过滤 (Stop Words Filtering)** 对于那些频繁出现却没有实质性贡献的虚词(如“的”、“在”等),可以通过预处理阶段去除这些干扰项以提高后续任务的效果[^3]。 6. **Wasserstein 距离 / 地球移动器距离 (Earth Mover's Distance, EMD 或 WMD)** 表征不同分布之间转换所需的最小工作量,应用于文档相似度测量时能够考虑整个句子结构而非单个词汇层面的信息损失情况;而简化版本称为 Relaxed Wasserstein Metric Distance(RWMD)[^4]。 7. **正则表达式 (Regular Expression)** 正则是用来描述字符串模式的强大工具,广泛应用于文本检索等领域,尽管不是直接与语义相关联,但在自然语言处理流程中扮演着重要角色[^5]。 8. **分布式表示法 (Distributed Representation)** 不同于传统的独热编码方式,通过低维稠密向量来表征每一个词汇,并且让彼此意思相近者拥有相仿数值特征,从而更好地反映真实世界里的语言现象。 9. **上下文感知模型 (Context-Aware Model)** 如 BERT 等预训练语言模型不仅关注单独字面意义还充分考虑到具体应用场景的影响因素,进而提供更为精准的结果反馈。 #### 二、Python 实现示例 下面给出一段利用 `gensim` 库加载预先训练好的 Google News 数据集上得到的 Word2Vec 模型并计算指定一对词语间相似性的代码片段: ```python from gensim.models import KeyedVectors # 加载已有的 word2vec 模型文件 model_path = 'GoogleNews-vectors-negative300.bin' wv = KeyedVectors.load_word2vec_format(model_path, binary=True) def calculate_similarity(word_a, word_b): try: euclidean_dist = np.linalg.norm(wv[word_a]-wv[word_b]) cosine_sim = wv.similarity(word_a, word_b) print(f"{word_a} vs {word_b}: Euclidean={euclidean_dist:.4f}, Cosine={cosine_sim:.4f}") except KeyError as e: print(e) calculate_similarity('ramparts', 'Revolutions') ``` 这段程序首先导入必要的库函数,接着定义了一个辅助函数 `calculate_similarity()` 来接收待比较的目标词汇参数并对二者执行两种不同的相似度评测操作——分别是基于欧式几何学原理以及线性代数理论框架内的运算逻辑得出结论。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值