4

this 답변으로, 나는 훈련 된 tf-idf 벡터 라이저와 새 문서 사이의 코사인 유사성을 찾고 비슷한 문서를 반환하려고합니다.Python - tf-idf는 새로운 문서 유사성을 예측합니다.

아래 코드는 내 기차 데이터가 거대한이기 때문에

>>> from sklearn.metrics.pairwise import linear_kernel 
>>> cosine_similarities = linear_kernel(tfidf[0:1], tfidf).flatten() 
>>> cosine_similarities 
array([ 1.  , 0.04405952, 0.11016969, ..., 0.04433602, 
    0.04457106, 0.03293218]) 

, 전체 훈련 벡터화 통해 반복하는 것은 나쁜 생각처럼 소리 최초의 벡터의 코사인 유사성이 아니라 새 쿼리를 찾습니다. 아래 코드와 같이 새 문서의 벡터를 추론하고 관련 문서를 찾는 방법은 무엇입니까? 거대한 데이터 세트에 대한

>>> related_docs_indices = cosine_similarities.argsort()[:-5:-1] 
>>> related_docs_indices 
array([ 0, 958, 10576, 3277]) 
>>> cosine_similarities[related_docs_indices] 
array([ 1.  , 0.54967926, 0.32902194, 0.2825788 ]) 
+0

더 나은 솔루션이있을 수 있지만 선형 검색은 반드시 나쁜 아이디어는 아니며 정확하게 구현하면 빠를 수 있습니다. 데이터 세트의 크기는 얼마나됩니까? 어떤 쿼리 시간 수준이 받아 들여질 수 있습니까? – elyase

답변

0

는 개념으로 텍스트 클러스터링라는 솔루션이있다. 검색 엔진에서이 기술을 사용합니다.

첫 번째 단계에서는 문서를 일부 그룹 (예 : 50 클러스터)에 클러스터링 한 다음 각 클러스터에 대표 문서 (일부 클러스터에 대한 유용한 정보가 포함 된 단어 포함)가 있습니다.
두 번째 단계에서는 새 문서와 사용자 데이터 집합 간의 코사인 유사성을 계산하기 위해 모든 대표 (50 개의 숫자)를 반복하고 가장 가까운 대표를 찾습니다 (예 : 2 대표)
마지막 단계에서 선택한 대표의 모든 문서를 반복 할 수 있습니다 가장 가까운 코사인 유사성을 찾습니다.

이 기술을 사용하면 루프 수를 줄이고 성능을 향상시킬 수 있습니다. 이 책의 일부 장에서 더 tecnincs을 읽을 수 있습니다 http://nlp.stanford.edu/IR-book/html/htmledition/irbook.html

+0

올바른 결과를 보장하지 않는 ** 경험적 ** 일뿐입니다 ("실제"한 번의 검색으로 주어진 결과에서 임의로 벗어날 수 있음) – lejlot

1

당신은 gensim에서 살펴 보셔야합니다. 먼저 새 문서에 대한 벡터를 얻을 예측시

from gensim import corpora, models, similarities 

dictionary = corpora.Dictionary(line.lower().split() for line in open('corpus.txt')) 
corpus = [dictionary.doc2bow(line.lower().split()) for line in open('corpus.txt')] 

tfidf = models.TfidfModel(corpus) 
index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=12) 

:

doc = "Human computer interaction" 
vec_bow = dictionary.doc2bow(doc.lower().split()) 
vec_tfidf = tfidf[vec_bow] 

가 그런 유사성을 얻을 수는 (가장 유사한으로 분류) : 예 시작하는 코드는 다음과 같습니다

sims = index[vec_tfidf] # perform a similarity query against the corpus 
print(list(enumerate(sims))) # print (document_number, document_similarity) 2-tuples 

원하는대로 선형 스캔을 수행하지만보다 최적화 된 구현이 가능합니다. 속도가 충분하지 않다면 근사 유사성 검색을 볼 수 있습니다 (Annoy, Falconn, NMSLIB).

+1

답장을 보내 주셔서 감사합니다. 모양과 포스트 백 –

2

이 문제는 부분적 불리언 모델 함께합니다 (TF-IDF & 코사인 유사도 임) 벡터 공간 모델 조합에 의해 해결 될 수있다. 이것들은 정보 이론의 개념이며 그들은 꽤 좋은 검색 엔진 인 ElasticSearch에서 (그리고 잘 설명 된) 사용되었습니다.

아이디어는 간단합니다. 문서를 거꾸로 된 인덱스로 저장합니다. 언급 한 페이지 (문서)에 대한 참조를 보유하고있는 책 끝에있는 단어와 비교할 수 있습니다.

모든 문서의 tf-idf 벡터를 계산하는 대신 공통된 단어 중 적어도 하나 (또는 ​​임계 값 지정)가있는 문서.이 작업은 쿼리 된 문서의 단어를 반복하고 반전 된 인덱스를 사용하여이 단어가 포함 된 문서를 찾은 다음 해당 단어의 유사성을 계산하여 간단하게 수행 할 수 있습니다.

관련 문제