自然语言处理(一):基于统计的方法表示单词

文章目录

    • [1. 共现矩阵](#1. 共现矩阵)
    • [2. 点互信息](#2. 点互信息)
    • [3. 降维(奇异值分解)](#3. 降维(奇异值分解))

1. 共现矩阵

将一句话的上下文大小窗口设置为1,用向量来表示单词频数,如:


将每个单词的频数向量求出,得到如下表格,即共现矩阵

我们可以用余弦相似度 (cosine similarity)来计算单词向量的相似性:
similarity ⁡ ( x , y ) = x ⋅ y ∥ x ∥ ∥ y ∥ = x 1 y 1 + ⋯ + x n y n x 1 2 + ⋯ + x n 2 y 1 2 + ⋯ + y n 2 \operatorname{similarity}(\boldsymbol{x}, \boldsymbol{y})=\frac{\boldsymbol{x} \cdot \boldsymbol{y}}{\|\boldsymbol{x}\|\|\boldsymbol{y}\|}=\frac{x_{1} y_{1}+\cdots+x_{n} y_{n}}{\sqrt{x_{1}^{2}+\cdots+x_{n}^{2}} \sqrt{y_{1}^{2}+\cdots+y_{n}^{2}}} similarity(x,y)=∥x∥∥y∥x⋅y=x12+⋯+xn2 y12+⋯+yn2 x1y1+⋯+xnyn

有时会出现分母为0的情况,在具体代码实现的时候,我们可以加上一个微小值,如1e-8

python 复制代码
def cos_similarity(x, y, eps=1e-8):
	nx = x / (np.sqrt(np.sum(x ** 2)) + eps)
	ny = y / (np.sqrt(np.sum(y ** 2)) + eps)
 	return np.dot(nx, ny)

2. 点互信息

在语料库中可能会看到很多"...the car..."这样的短语。实际上,与 the相比,drive和 car 的相关性更强。为了避免这种情况,可以引入PMI

PMI ⁡ ( x , y ) = log ⁡ 2 P ( x , y ) P ( x ) P ( y ) = log ⁡ 2 C ( x , y ) N C ( x ) N C ( y ) N = log ⁡ 2 C ( x , y ) ⋅ N C ( x ) C ( y ) \operatorname{PMI}(x, y)=\log _{2} \frac{P(x, y)}{P(x) P(y)}=\log _{2} \frac{\frac{\boldsymbol{C}(x, y)}{N}}{\frac{\boldsymbol{C}(x)}{N} \frac{\boldsymbol{C}(y)}{N}}=\log _{2} \frac{\boldsymbol{C}(x, y) \cdot N}{\boldsymbol{C}(x) \boldsymbol{C}(y)} PMI(x,y)=log2P(x)P(y)P(x,y)=log2NC(x)NC(y)NC(x,y)=log2C(x)C(y)C(x,y)⋅N

P(x) 表示 x 发生的概率,P(y) 表示 y 发生的概率,P(x, y) 表示 x

和 y 同时发生的概率。PMI 的值越高,表明相关性越强。

这里假设语料库的单词数量(N)为 10 000,the 出现 100 次,car 出现 20 次,drive 出现 10 次,the 和 car 共现 10 次,car 和 drive 共现 5 次。

P M I ( " t h e " , " c a r " ) = l o g 2 10 ⋅ 10000 1000 ⋅ 20 ≈ 2.32 PMI("the","car")=log_2\frac{10\cdot 10000}{1000 \cdot 20}\approx 2.32 PMI("the","car")=log21000⋅2010⋅10000≈2.32
P M I ( " c a r " , " d r i v e " ) = l o g 2 5 ⋅ 10000 20 ⋅ 10 ≈ 7.79 PMI("car","drive")=log_2\frac{5\cdot 10000}{20 \cdot 10}\approx 7.79 PMI("car","drive")=log220⋅105⋅10000≈7.79

得出的PMI值,后者比前者要高,这是我们所需要的结果

3. 降维(奇异值分解)

奇异值分解(Singular Value Decomposition,SVD)。SVD 将任意矩阵分解为 3 个矩阵的乘积,如下式所示:

X = U S V T X=USV^T X=USVT

上面的例子只考虑了一句话中少量单词的共现矩阵,如果我们使用一个真正的语料库,那么这个矩阵将变得十分庞大,这是一个很大的稀疏矩阵,我们需要对其进行降维,这里用到奇异值分解。

在numpy中可以用

python 复制代码
U, S, V = np.linalg.svg()


我们只需要取矩阵U的前两个元素即可将其降维到二维向量。

相关推荐
互联网江湖7 分钟前
蚂蚁阿福引爆AI健康赛道,美年健康锚定AI健康智能体核心生态位
大数据·人工智能
青稞社区.11 分钟前
小米大模型 Plus 团队提出BTL-UI:基于直觉-思考-关联的GUI Agent推理
人工智能·ui
小鸡吃米…32 分钟前
Python的人工智能-机器学习
人工智能·python·机器学习
金融RPA机器人丨实在智能36 分钟前
2025汇总:7类Agent智能体,定义AI赋能商业的新未来
大数据·人工智能·agent·实在agent
一代明君Kevin学长37 分钟前
Transformer为什么使用多个注意力头?
人工智能·深度学习·transformer
盛世宏博北京40 分钟前
学校图书馆自动化恒温恒湿控制系统技术方案
网络·数据库·人工智能
神州问学44 分钟前
每周技术加速器:UltraRAG:突破传统RAG架构的创新与实践
人工智能
GitCode官方1 小时前
YOLO11 与 Wan2.2‑I2V‑A14B 正式上线 AtomGit AI:开启视觉感知与动态生成新纪元!
人工智能·计算机视觉·目标跟踪·开源·atomgit
deephub1 小时前
机器学习时间特征处理:循环编码(Cyclical Encoding)与其在预测模型中的应用
人工智能·python·机器学习·特征工程·时间序列
Gofarlic_oms11 小时前
集中式 vs 分布式许可:跨地域企业的管控架构选择
大数据·运维·人工智能·分布式·架构·数据挖掘·需求分析