문제

텍스트에 대한 주제/태그를 찾기 위해 PHP에서 잠재 시맨틱 분석 (LSA)을 구현하고 싶습니다.

여기 내가해야 할 일이 있습니다. 이 올바른지? PHP에서 어떻게 코딩 할 수 있습니까? 선택해야 할 단어를 어떻게 결정합니까?

외부 라이브러리를 사용하고 싶지 않습니다. 나는 이미 단일 가치 분해 (SVD)에 대한 구현을하고 있습니다..

  1. 주어진 텍스트에서 모든 단어를 추출하십시오.
  2. 단어/구와 예를 들어 TF – IDF. 가중치가 너무 복잡한 경우 발생 수를 취하십시오.
  3. 매트릭스 구축 : 열은 데이터베이스의 일부 문서입니다 (더 좋을수록 행은 모두 고유 한 단어, 값은 발생 숫자 또는 무게입니다.
  4. 단수 값 분해 (SVD)를 수행하십시오.
  5. 매트릭스 (SVD)의 값을 사용하여 차원 감소 (어떻게?)를 수행하십시오.

나는 당신이 나를 도울 수 있기를 바랍니다. 미리 감사드립니다!

도움이 되었습니까?

해결책

LSA 링크 :

다음은 완전한 알고리즘입니다. SVD가 있다면 대부분의 길입니다. 위의 논문은 나보다 더 잘 설명합니다.

가정 :

  • SVD 기능은 단수 값과 단일 벡터를 내림차순으로 제공합니다. 그렇지 않다면, 당신은 더 많은 곡예를해야합니다.

: 코퍼스 매트릭스, w (단어)의 d (문서) (W 행, d 열). 이들은 원시 카운트, TFIDF 등이 될 수 있습니다. Stopword는 제거 될 수도 있고 제거되지 않을 수 있으며, 스템이 발생할 수 있습니다 (Landauer는 스톱워드를 유지하고 줄기를 줄이지 말고 TFIDF에 예).

U,Sigma,V = singular_value_decomposition(M)

U:  w x w
Sigma:  min(w,d) length vector, or w * d matrix with diagonal filled in the first min(w,d) spots with the singular values
V:  d x d matrix

Thus U * Sigma * V = M  
#  you might have to do some transposes depending on how your SVD code 
#  returns U and V.  verify this so that you don't go crazy :)

그런 다음 감소성 .... 실제 LSA 용지는 단일 값이 단일 값의 총 50% 이상이되도록 충분한 벡터를 유지하는 것입니다.

더 신속하게 ... (의사 코드)

Let s1 = sum(Sigma).  
total = 0
for ii in range(len(Sigma)):
    val = Sigma[ii]
    total += val
    if total > .5 * s1:
        return ii

이것은 이전의 Min (d, w) 인 새로운 기준의 순위를 반환 할 것이며 이제 {ii}와 근사합니다.

(여기, ' -> 프라임, 전환하지 않음)

우리는 크기 WX II, II X II 및 II X D를 가진 새로운 행렬을 만듭니다 : u ', sigma', v '.

이것이 LSA 알고리즘의 본질입니다.

이 결과 매트릭스 u ' * sigma' * v '는'개선 된 '코사인 유사성 검색에 사용할 수 있거나 예를 들어 각 문서의 상위 3 개 단어를 선택할 수 있습니다. 이것이 간단한 TF-IDF 이상의 것을할지 여부는 일부 논쟁의 문제입니다.

나에게 LSA는 폴리 세미로 인해 실제 데이터 세트에서 제대로 수행하지 못하고 너무 많은 주제를 가진 데이터 세트를 수행합니다. 수학적 / 확률 적 기초는 불분명합니다 (단어 수에 맞지 않는 정상적인 (가우스) 분포를 가정합니다).

당신의 마일리지는 확실히 다를 것입니다.

LSA를 사용하여 태깅 (하나의 방법!)

  1. SVD와 축소 휴리스틱을 사용하여 U 'Sigma'v '차원 적으로 감소 된 행렬을 구성하십시오.

  2. 손으로 U '매트릭스를 살펴보고 각 "주제"를 설명하는 용어를 생각해냅니다. 예를 들어, 그 벡터의 가장 큰 부분이 "브롱스, 양키스, 맨해튼"이라면 "뉴욕시"가 좋은 용어 일 수 있습니다. 이것들을 연관 배열 또는 목록에 보관하십시오. 이 단계는 벡터 수가 유한하므로 합리적이어야합니다.

  3. 문서에 대한 벡터 (v1)가 있다고 가정하면 v1 * t (u ')는 해당 문서에 가장 강력한'주제 '를 제공합니다. 3 단계를 선택한 다음 이전 단계에서 계산 된대로 "주제"를 제공하십시오.

다른 팁

이 답변은 포스터의 질문에 직접적인 것이 아니라 뉴스 항목을 자동 태그하는 방법에 대한 메타 질문에 대한 질문에 직접적으로 나옵니다. OP는 엔티티 인식이라는 이름을 언급하지만, 나는 그들이 자동 태깅 라인을 따라 더 의미가 있다고 생각합니다. 그들이 정말로 ner를 의미한다면,이 응답은 호그 워시입니다 :)

다양한 소스가있는 이러한 제약 (600 개 항목 / 일, 100-200 자 / 항목)을 감안할 때 다음은 몇 가지 태그 옵션입니다.

  1. 손으로. 분석가는 하루에 600 명을 쉽게 할 수 있었을 것입니다. 아마존의 기계식 터크 또는 사용자가 그렇게하는 것과 같은 것도 가능할 수 있습니다. "손으로 태그 된"수는 50 또는 100에 불과하더라도 아래의자가 생성 된 방법이 당신을 얻는 모든 것을 비교할 수있는 좋은 기초가 될 것입니다.

  2. LSA, 주제 모델 (잠재적 인 Dirichlet 할당) 등의 차원 감소는 ... 실제 데이터 세트에 대해 LSA와 함께 운이 좋지 않았으며 통계적 근거에 만족하지 않았습니다. lda 나는 훨씬 나아졌고 놀라운 메일 링리스트 그것은 주제를 텍스트에 할당하는 방법에 대한 최선의 생각을 가지고 있습니다.

  3. 간단한 휴리스틱 ... 실제 뉴스 항목이 있다면 뉴스 항목의 구조를 이용하십시오. 첫 번째 문장에 초점을 맞추고 모든 일반적인 단어 (중지 단어)를 버리고 첫 두 문장에서 가장 좋은 3 명을 선택하십시오. 또는 도대체 첫 번째 문장에서 모든 명사를 가져 가서 어디로 가는지 확인하십시오. 텍스트가 영어로되어 있다면, 전체 Shebang에 대한 연설 분석의 일부를 수행하고 그것이 당신을 얻는 것을보십시오. 뉴스 보고서와 같이 구조화 된 항목을 사용하면 LSA 및 기타 주문 독립 방법 (TF-IDF)이 많은 정보를 얻습니다.

행운을 빕니다!

(이 답변이 마음에 들면 질문을 다시 시작하여 그에 맞도록 개조 할 수 있습니다)

마지막 단계까지 모든 것이 옳게 보입니다. SVD에 대한 일반적인 표기법은 세 행렬 a = USV*를 반환한다는 것입니다. S는 기본적으로 원래 데이터의 각 차원 캡처 양을 측정하는 대각선 매트릭스 (대각선의 모든 0을 의미 함)입니다. 숫자 ( "단일 값")가 줄어들고 얼마나 많은 차원이 유용한 지에 대한 하차를 찾을 수 있습니다. 그렇지 않으면, 몇 차원의 차원에 대해 임의의 숫자 n을 선택하고 싶을 것입니다.

여기서 나는 약간 퍼지가된다. 감소 된 차원 공간에서 용어 (단어)의 좌표는 u 또는 v에 있습니다. 입력 행렬의 행 또는 열에 있는지 여부에 따라 생각합니다. 손으로, 나는 단어의 좌표가 U의 행이라고 생각합니다. 즉, u의 첫 번째 행은 입력 행렬의 첫 번째 행, 즉 첫 번째 단어에 해당합니다. 그런 다음 해당 행의 첫 번째 N 열을 줄인 공간에서 단어의 좌표로 가져갑니다.

HTH

업데이트:

이 과정은 지금까지 태그를 선택하는 방법을 정확히 알려주지 않습니다. LSI를 사용하여 태그를 선택하는 사람에 대해 들어 본 적이 없습니다 (기계 학습 알고리즘은 의사 결정 트리와 같은 작업에 더 적합 할 수 있음). LSI는 두 단어가 비슷한지를 알려줍니다. 그것은 태그를 할당하는 것과 먼 길입니다.

두 가지 작업이 있습니다. a) 사용할 태그 세트는 무엇입니까? b) 최고의 3 개의 태그를 선택하는 방법?. LSI가 어떻게 대답하는 데 도움이 될지에 대한 느낌이 많지 않습니다 (a). 손으로 태그 세트를 선택할 수 있습니다. 그러나 LSI를 사용하는 경우 태그는 문서에서 발생하는 단어 일 것입니다. 그런 다음 (b)의 경우 문서에있는 단어에 가장 가까운 태그를 선택하려고합니다. 이를 구현하는 몇 가지 방법을 실험 할 수 있습니다. 가장 가까운 세 개의 태그를 선택하십시오 어느 문서에서 문서의 단어는 태그의 좌표 (u의 행)와 Word의 좌표 (U의 행) 사이의 코사인 유사성 (위키 백과 참조)에 의해 근접함을 측정합니다.

PHP 에서이 모든 작업을 수행하는 위험에 대한 추가 스레드가 있습니다. 링크 텍스트.

구체적 으로이 논문에 대한 링크가 있습니다. 잠재적 의미 맵핑, 텍스트에 대한 결과 "주제"를 얻는 방법을 설명합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top