自然语言处理--奇异值分解(截断)

奇异值分解是 LSA(潜在语义分析)即计算主题向量背后的算法。
SVD 是一种可以将任何矩阵分解成 3 个因子矩阵的算法,而这 3 个因子矩阵可以相乘来重建原始矩阵。这类似于为一个大整数找到恰好 3 个整数因子,但是这里的因子不是标量整数,而是具有特殊性质的二维实矩阵。通过 SVD 计算出的 3 个因子矩阵具有一些有用的数学性质,这些性质可以用于降维和 LSA。

用代码来实现SVD的矩阵分解:

from nlpia.book.examples.ch04_catdog_lsa_sorted import lsa_models, prettify_tdm
import numpy as np
import pandas as pd

# 11 篇文档、词汇表大小为 6 的语料库
bow_svd, tfidf_svd = lsa_models()
print("数据:\n", prettify_tdm(**bow_svd))
# 词项-文档矩阵
tdm = bow_svd['tdm']
print("词项-文档矩阵tdm:\n", tdm)

# 奇异值分解
U, s, Vt = np.linalg.svd(tdm)
# 左奇异向量 U:主题-词矩阵
#  矩阵中每个元素位置上的权重或得分,分别代表每个词对每个主题的重要程度
print("左奇异向量 U:\n", pd.DataFrame(U, index=tdm.index).round(2))

# 奇异值向量 S:
# 奇异值给出了在新的语义(主题)向量空间中每个维度所代表的信息量。
print(s.round(1))
S = np.zeros((len(U), len(Vt)))
# np.fill_diagonal() 填充对角线元素
np.fill_diagonal(S, s)
print("奇异值向量 S:\n", pd.DataFrame(S).round(1))

# 右奇异向量Vt:该矩阵将在文档之间提供共享语义,
# 因为它度量了文档在新的文档语义模型中使用相同主题的频率。
print("右奇异向量Vt:\n", pd.DataFrame(Vt).round(2))

# 词项-文档矩阵重构误差
# 度量LSA精确率的一种方法是看看从主题-文档矩阵重构词项-文档矩阵的精确率如何。
print(tdm.shape)
print(np.product(tdm.shape))
err = []
for numdim in range(len(s), 0, -1):
    S[numdim - 1, numdim - 1] = 0
    reconstructed_tdm = U.dot(S).dot(Vt)
    # 均方根误差(RMSE)
    err.append(np.sqrt(((reconstructed_tdm - tdm).values.flatten() ** 2).sum() / np.product(tdm.shape)))

# 截断的内容越多,误差就越大
print(np.array(err).round(2))
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值