Trước hết, nếu bạn muốn trích xuất các tính năng đếm và áp dụng chuẩn hóa TF-IDF và chuẩn hóa euclid theo hàng, bạn có thể thực hiện điều đó trong một thao tác với 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>
Bây giờ để tìm khoảng cách cosin của một tài liệu (ví dụ: tài liệu đầu tiên trong tập dữ liệu) và tất cả các tài liệu khác, bạn chỉ cần tính các tích số chấm của vectơ đầu tiên với tất cả các tài liệu khác vì vectơ tfidf đã được chuẩn hóa theo hàng.
Như được giải thích bởi Chris Clark trong các nhận xét và ở đây Tương tự Cosine không tính đến độ lớn của các vectơ. Hàng chuẩn hóa có độ lớn là 1 và do đó Hạt nhân tuyến tính đủ để tính toán các giá trị tương tự.
API ma trận thưa thớt scipy hơi kỳ lạ (không linh hoạt như mảng numpy N chiều dày đặc). Để có được vectơ đầu tiên, bạn cần phải chia nhỏ hàng ma trận để có được một ma trận con với một hàng duy nhất:
>>> tfidf[0:1]
<1x130088 sparse matrix of type '<type 'numpy.float64'>'
with 89 stored elements in Compressed Sparse Row format>
scikit-learning đã cung cấp các số liệu theo cặp (hay còn gọi là hạt nhân trong cách nói của máy học) hoạt động cho cả biểu diễn dày đặc và thưa thớt của tập hợp vectơ. Trong trường hợp này, chúng ta cần một sản phẩm chấm còn được gọi là hạt nhân tuyến tính:
>>> 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])
Do đó, để tìm 5 tài liệu liên quan hàng đầu, chúng ta có thể sử dụng argsort
và một số phương pháp cắt mảng phủ định (hầu hết các tài liệu liên quan có giá trị tương tự cosine cao nhất, do đó ở cuối mảng chỉ số được sắp xếp):
>>> 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 ])
Kết quả đầu tiên là kiểm tra độ tỉnh táo: chúng tôi thấy tài liệu truy vấn là tài liệu tương tự nhất với điểm tương tự cosine là 1 có văn bản sau:
>>> 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 ----
Tài liệu tương tự thứ hai là thư trả lời trích dẫn thư gốc do đó có nhiều từ phổ biến:
>>> 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