6

次のコードを使用して、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.]])

数学がどのように機能するか:

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

正しくないように見える数学で、何が機能しますか: (ここから)

dtMatrixToQueryAgainst = dot(s, vt)
queryVector  = dot(transpose(u), queryVector)
similarityToFirst = cosineDistance(queryVector, dtMatrixToQueryAgainsst[:,0]) 
# gives 1, which is correct

LSA の計算について私が見つけることができるすべてが最初のものを正しいと示しているのに、なぜルートは機能し、最初のものは機能しないのですか? 明らかな何かが欠けているような気がします...

4

1 に答える 1

8

コードにはいくつかの矛盾があり、混乱の前にエラーが発生します。これにより、何を試したのか、なぜ混乱したのかを正確に理解することが難しくなります (貼り付けたコードを実行しなかったか、以前に例外をスローしたことは明らかです)。

そうは言っても、私があなたの意図に正しく従えば、最初のアプローチはほぼ正しいです。次のコードを検討してください。

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]

あなたはそれを見てlowDimensionalQuery平等vt[:,0]です。vt低次元のサブスペースでのドキュメントの表現と考えてください。最初にクエリをその部分空間にマップして を取得lowDimensionalQueryし、それを の対応する列と比較しますvtlowRankDocumentTermMatrixあなたの間違いは、変換されたクエリを、元​​の空間にあるからのドキュメント ベクトルと比較しようとしたことです。変換されたクエリには「再構築された」ドキュメントよりも要素が少ないため、Python は不満を漏らしました。

于 2012-05-01T01:11:38.710 に答える