2017-09-11 8 views
0

나는 사전 정의 된 키워드 목록에서 코퍼스의 유사한 문맥 단어를 식별하기 위해 이력서 (스톱 워드 제거)에 대한 gensim word2vec 코드를 실행 중입니다.왜 Word2Vec의 most_similar() 함수가 훈련에서 무의미한 결과를 내고 있습니까?

입력 매개 변수, 스톱 워드 제거 등 여러 반복에도 불구하고 유사한 문맥 단어가 전혀 의미가 없습니다 (거리 또는 컨텍스트 측면에서) 예 : 55,418 문장 : 상관 관계 매트릭스는 여러 번 아직 2.7 아나콘다 훈련이 다시 시작 시스템 및 코드 gensim 2.3.0의 세부 사항입니다 파이썬에서 실행되는 다음의 상관 관계

의 most_similar 결과에 나던 가을 행렬 같은 창에서 발생 문장 당 평균 단어 : 3-4 단어 (포스트 불용어 제거) 코드 :

나는 이유에 분실하고
wordvec_min_count=int() 
    size = 50 
    window=10 
    min_count=5 
    iter=50 
    sample=0.001 
    workers=multiprocessing.cpu_count() 
    sg=1 
    bigram = gensim.models.Phrases(sentences, min_count=10, threshold=5.0) 
    trigram = gensim.models.Phrases(bigram[sentences], min_count=10, threshold=5.0) 
    model=gensim.models.Word2Vec(sentences = trigram[sentences], size=size, alpha=0.005, window=window, min_count=min_count,max_vocab_size=None,sample=sample, seed=1, workers=workers, min_alpha=0.0001, sg=sg, hs=1, negative=0, cbow_mean=1,iter=iter) 

model.wv.most_similar('correlation') 
Out[20]: 
[(u'rankings', 0.5009744167327881), 
(u'salesmen', 0.4948525130748749), 
(u'hackathon', 0.47931140661239624), 
(u'sachin', 0.46358123421669006), 
(u'surveys', 0.4472047984600067), 
(u'anova', 0.44710394740104675), 
(u'bass', 0.4449636936187744), 
(u'goethe', 0.4413239061832428), 
(u'sold', 0.43735259771347046), 
(u'exceptional', 0.4313117265701294)] 

결과는 그렇게 무작위? 어쨌든 word2vec의 정확성을 확인합니까?

또한 most_similar() 함수에 대한 word2vec 대안이 있습니까? 글러브에 대해 읽었지 만 패키지를 설치할 수 없었습니다.

이 점에서 모든 정보는

답변

1

INFO 레벨의 로깅을 사용하고 있는지 진짜 훈련이 일어나고 나타내는 것을 확인 도움이 될 것입니다. 즉, 예상되는 반복 횟수보다 예상 텍스트 수에 대해 점진적으로 진행되는 것을 볼 수 있습니다.

open bug issue in Phrases을 말 할 수 있습니다. 단, 구를 홍보하려면 (trigram[sentences]과 같이) Word2Vec에 필요한 다중 반복 가능 컬렉션 객체가 아니라 단일 반복을 사용합니다.

Word2Vec은 어휘 검색을 위해 한 번 코퍼스를 통과해야하며, 다시 훈련을 위해 iter 번 반복해야합니다. sentences 또는 프레이징 래퍼가 단일 반복 만 지원하는 경우 어휘 만 발견되고 교육은 즉시 종료되며 모델은 훈련되지 않은 상태로 표시됩니다.

이 문제에서 볼 수있는 바와 같이 해결 방법은 구문 변환을 수행하고 결과를 메모리 내 목록 (해당되는 경우) 또는 디스크의 별도 텍스트 코퍼스 (결과적으로 이미 구문 - 결합). 그런 다음 진정으로 재시작 가능한 iterable을 사용하십시오 - 중복 처리를 줄일 수 있습니다.