Öncelikle, sayım özelliklerini çıkarmak ve TF-IDF normalizasyonu ve satır bazında öklid normalizasyonu uygulamak istiyorsanız, bunu tek bir işlemle yapabilirsiniz TfidfVectorizer
:
>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> from sklearn.datasets import fetch_20newsgroups
>>> twenty = fetch_20newsgroups()
>>> tfidf = TfidfVectorizer().fit_transform(twenty.data)
>>> tfidf
<11314x130088 sparse matrix of type '<type 'numpy.float64'>'
with 1787553 stored elements in Compressed Sparse Row format>
Şimdi, bir belgenin kosinüs mesafelerini (örneğin, veri kümesindeki ilk) ve diğerlerinin tümünü bulmak için, ilk vektörün nokta çarpımlarını diğerlerinin tümü ile hesaplamanız yeterlidir, çünkü tfidf vektörleri zaten satıra göre normalize edilmiştir.
Chris Clark tarafından yorumlarda ve burada açıklandığı gibi Cosine Similarity vektörlerin büyüklüğünü hesaba katmaz. Satır normalleştirilmiş 1 büyüklüğündedir ve bu nedenle Doğrusal Kernel benzerlik değerlerini hesaplamak için yeterlidir.
Scipy sparse matrix API'si biraz tuhaftır (yoğun N-boyutlu uyuşuk diziler kadar esnek değildir). İlk vektörü elde etmek için tek satırlı bir alt matris elde etmek üzere matrisi satır şeklinde dilimlemeniz gerekir:
>>> tfidf[0:1]
<1x130088 sparse matrix of type '<type 'numpy.float64'>'
with 89 stored elements in Compressed Sparse Row format>
scikit-learn, vektör koleksiyonlarının hem yoğun hem de seyrek temsilleri için çalışan çiftli ölçümler (makine öğreniminde diğer adıyla çekirdekler) sağlar. Bu durumda, doğrusal çekirdek olarak da bilinen bir iç çarpıma ihtiyacımız var:
>>> 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])
Bu nedenle, ilgili ilk 5 belgeyi bulmak için argsort
ve bazı negatif dizi dilimlemeyi kullanabiliriz (ilgili belgelerin çoğu en yüksek kosinüs benzerlik değerlerine sahiptir, dolayısıyla sıralanan indeks dizisinin sonunda):
>>> 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 ])
İlk sonuç bir akıl sağlığı kontrolüdür: sorgu belgesini, aşağıdaki metne sahip kosinüs benzerlik puanı 1 olan en benzer belge olarak buluruz:
>>> print twenty.data[0]
From: lerxst@wam.umd.edu (where's my thing)
Subject: WHAT car is this!?
Nntp-Posting-Host: rac3.wam.umd.edu
Organization: University of Maryland, College Park
Lines: 15
I was wondering if anyone out there could enlighten me on this car I saw
the other day. It was a 2-door sports car, looked to be from the late 60s/
early 70s. It was called a Bricklin. The doors were really small. In addition,
the front bumper was separate from the rest of the body. This is
all I know. If anyone can tellme a model name, engine specs, years
of production, where this car is made, history, or whatever info you
have on this funky looking car, please e-mail.
Thanks,
- IL
---- brought to you by your neighborhood Lerxst ----
En benzer ikinci belge, orijinal mesajı alıntılayan bir cevaptır, bu nedenle birçok ortak kelime vardır:
>>> print twenty.data[958]
From: rseymour@reed.edu (Robert Seymour)
Subject: Re: WHAT car is this!?
Article-I.D.: reed.1993Apr21.032905.29286
Reply-To: rseymour@reed.edu
Organization: Reed College, Portland, OR
Lines: 26
In article <1993Apr20.174246.14375@wam.umd.edu> lerxst@wam.umd.edu (where's my
thing) writes:
>
> I was wondering if anyone out there could enlighten me on this car I saw
> the other day. It was a 2-door sports car, looked to be from the late 60s/
> early 70s. It was called a Bricklin. The doors were really small. In
addition,
> the front bumper was separate from the rest of the body. This is
> all I know. If anyone can tellme a model name, engine specs, years
> of production, where this car is made, history, or whatever info you
> have on this funky looking car, please e-mail.
Bricklins were manufactured in the 70s with engines from Ford. They are rather
odd looking with the encased front bumper. There aren't a lot of them around,
but Hemmings (Motor News) ususally has ten or so listed. Basically, they are a
performance Ford with new styling slapped on top.
> ---- brought to you by your neighborhood Lerxst ----
Rush fan?
--
Robert Seymour rseymour@reed.edu
Physics and Philosophy, Reed College (NeXTmail accepted)
Artificial Life Project Reed College
Reed Solar Energy Project (SolTrain) Portland, OR