Jmj*_*jmh 6 python nlp numpy scipy latent-semantic-indexing
我正在尝试使用以下代码关注Python中关于潜在语义索引的维基百科文章:
documentTermMatrix = array([[ 0., 1., 0., 1., 1., 0., 1.],
[ 0., 1., 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 1., 1.],
[ 0., 0., 0., 1., 0., 0., 0.],
[ 0., 1., 1., 0., 0., 0., 0.],
[ 1., 0., 0., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 1., 1., 0.],
[ 0., 0., 1., 1., 0., 0., 0.],
[ 1., 0., 0., 1., 0., 0., 0.]])
u,s,vt = linalg.svd(documentTermMatrix, full_matrices=False)
sigma = diag(s)
## remove extra dimensions...
numberOfDimensions = 4
for i in range(4, len(sigma) -1):
sigma[i][i] = 0
queryVector = array([[ 0.], # same as first column in documentTermMatrix
[ 0.],
[ 0.],
[ 0.],
[ 0.],
[ 1.],
[ 0.],
[ 0.],
[ 1.]])
Run Code Online (Sandbox Code Playgroud)
数学怎么说应该有效:
dtMatrixToQueryAgainst = dot(u, dot(s,vt))
queryVector = dot(inv(s), dot(transpose(u), queryVector))
similarityToFirst = cosineDistance(queryVector, dtMatrixToQueryAgainst[:,0]
# gives 'matrices are not aligned' error. should be 1 because they're the same
Run Code Online (Sandbox Code Playgroud)
什么工作,数学看起来不正确:(从这里)
dtMatrixToQueryAgainst = dot(s, vt)
queryVector = dot(transpose(u), queryVector)
similarityToFirst = cosineDistance(queryVector, dtMatrixToQueryAgainsst[:,0])
# gives 1, which is correct
Run Code Online (Sandbox Code Playgroud)
为什么路由工作,而第一个没有,当我能找到关于LSA数学的所有东西显示第一个是正确的?我觉得我错过了一些明显的东西......
您的代码中存在一些不一致的地方,这些不一致会导致您在混淆之前出现错误.这使得很难准确理解你尝试了什么以及为什么你感到困惑(显然你没有运行代码,因为它被粘贴,或者它会先抛出异常).
也就是说,如果我正确地遵循你的意图,你的第一种方法几乎是正确的.请考虑以下代码:
documentTermMatrix = array([[ 0., 1., 0., 1., 1., 0., 1.],
[ 0., 1., 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 1., 1.],
[ 0., 0., 0., 1., 0., 0., 0.],
[ 0., 1., 1., 0., 0., 0., 0.],
[ 1., 0., 0., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 1., 1., 0.],
[ 0., 0., 1., 1., 0., 0., 0.],
[ 1., 0., 0., 1., 0., 0., 0.]])
numDimensions = 4
u, s, vt = linalg.svd(documentTermMatrix, full_matrices=False)
u = u[:, :numDimensions]
sigma = diag(s)[:numDimensions, :numDimensions]
vt = vt[:numDimensions, :]
lowRankDocumentTermMatrix = dot(u, dot(sigma, vt))
queryVector = documentTermMatrix[:, 0]
lowDimensionalQuery = dot(inv(sigma), dot(u.T, queryVector))
lowDimensionalQuery
vt[:,0]
Run Code Online (Sandbox Code Playgroud)
你应该看到lowDimensionalQuery
并且vt[:,0]
是平等的.可以将其vt
视为低维子空间中文档的表示.首先,我们将查询映射到要获取的子空间lowDimensionalQuery
,然后将其与相应的列进行比较vt
.你的错误是试图将转换后的查询lowRankDocumentTermMatrix
与原始空间中的文档向量进行比较.由于转换后的查询所包含的元素少于"重建"文档,因此Python抱怨道.
归档时间: |
|
查看次数: |
1453 次 |
最近记录: |