2012-04-25 3 views
6

파이썬 차이에 잠재 의미 분석 :나는 다음과 같은 코드를 사용하여 파이썬에서 <a href="http://en.wikipedia.org/wiki/Latent_semantic_analysis" rel="nofollow">Wikipedia Article on latent semantic indexing</a>을 따르려고

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 

을, 잘못된 보이는 수학에 : (here에서)

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

왜 만들자을한다 그리고 LSA의 수학에 대해 알아낼 수있는 모든 것이 올바른 것으로 첫 번째를 보여줄 때? 나는 명백한 무엇인가를 놓치고있는 것처럼 느낀다 ...

+0

'## 외형 치수 제거 ...'에는 어떤 것이 포함됩니까? – Avaris

+0

'u, s, vt = linalg.svd (a, full_matrices = False)'에서 순위 감소 표시 – Jmjmh

+0

을 편집 한 결과,'a'는 어디에서 왔습니까 ??? – Oerd

답변

7

당신의 혼란의 지점 전에 오류를 일으키는 코드에는 몇 개의 불일치가있다. 이것은 당신이 시도한 것과 왜 혼란스러워하는지 정확히 이해하기 어렵게합니다. (코드를 붙여 넣을 때 코드를 실행하지 않았거나 이전에 예외를 던졌을 것입니다.)

귀하의 의도를 정확히 따르면, 첫 번째 접근 방법이 거의 정확합니다. 다음 코드를 고려하십시오

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] 

당신은 lowDimensionalQueryvt[:,0]가 동일한 것을 볼 수 있습니다. 저 차원 부분 공간에서 문서 표현으로 vt을 생각하십시오. 먼저 쿼리를 해당 부분 영역에 매핑하여 lowDimensionalQuery을 얻은 다음 해당 열과 vt을 비교합니다. 귀하의 실수는 변형 된 쿼리를 원본 공간에있는 lowRankDocumentTermMatrix의 문서 벡터와 비교하려고 시도한 것입니다. 변환 된 쿼리는 "재구성 된"문서보다 적은 요소를 가지고 있기 때문에 파이썬은 불평했다.

+1

감사합니다. 환상적인 대답 – Jmjmh

관련 문제