HomeLập trìnhPythonCách trích xuất...

Cách trích xuất từ ​​khóa từ văn bản bằng TF-IDF và Python’s Scikit-Learn


bởi Kavita Ganesan

Trở lại năm 2006, khi tôi phải sử dụng TF-IDF để trích xuất từ ​​khóa trong Java, cuối cùng tôi đã viết tất cả mã từ đầu. Vào thời điểm đó, cả Khoa học dữ liệu và GitHub đều không phải là một thứ gì đó và các thư viện chỉ có giới hạn.

Thế giới ngày nay đã khác nhiều. Bạn có một số thư viện và kho lưu trữ mã nguồn mở trên Github cung cấp triển khai TF-IDF phù hợp. Nếu bạn không cần nhiều quyền kiểm soát đối với cách tính toán TF-IDF, tôi thực sự khuyên bạn nên sử dụng lại các thư viện từ các gói đã biết, chẳng hạn như MLLib của Spark hoặc scikit-learning của Python.

Các một vấn đề mà tôi nhận thấy với các thư viện này là chúng được dùng làm bước chuẩn bị cho các tác vụ khác như phân cụm, lập mô hình chủ đề và phân loại văn bản. TF-IDF thực sự có thể được sử dụng để trích xuất các từ khóa quan trọng từ tài liệu để hiểu được đặc điểm của tài liệu. Ví dụ: nếu bạn đang xử lý các bài viết trên Wikipedia, bạn có thể sử dụng tf-idf để trích xuất các từ duy nhất cho một bài viết nhất định. Những từ khóa này có thể được sử dụng như một bản tóm tắt rất đơn giản của tài liệu và để phân tích văn bản khi chúng ta xem xét các từ khóa này một cách tổng hợp.

trong bài viết này, Tôi sẽ chỉ cho bạn cách sử dụng scikit-learning để trích xuất từ ​​khóa từ tài liệu bằng TF-IDF. Chúng tôi sẽ đặc biệt làm điều này trên tập dữ liệu tràn ngăn xếp. Nếu bạn muốn truy cập vào Máy tính xách tay Jupyter đầy đủvui lòng truy cập repo của tôi.

Lưu ý quan trọng: Tôi cho rằng những người theo dõi hướng dẫn này đã quen thuộc với khái niệm TF-IDF. Nếu chưa, hãy tự làm quen với khái niệm này trước khi đọc tiếp. Có một vài video trực tuyến đưa ra lời giải thích trực quan về nó là gì. Để có một lời giải thích học thuật hơn, tôi muốn giới thiệu lời giải thích của cố vấn tiến sĩ của tôi.

tập dữ liệu

Trong ví dụ này, chúng tôi sẽ sử dụng tập dữ liệu Stack Overflow hơi ồn ào và mô phỏng những gì bạn có thể xử lý trong cuộc sống thực. Bạn có thể tìm thấy tập dữ liệu này trong repo hướng dẫn của tôi.

Đọc thêm  Chạy Python Script – Cách thực thi các lệnh Python Shell trong Terminal

Lưu ý rằng có hai tập tin. Tệp lớn hơn, stackoverflow-data-idf.json với 20.000 bài đăng, được sử dụng để tính toán Tần suất tài liệu nghịch đảo (IDF). Tệp nhỏ hơn, stackoverflow-test.json với 500 bài viết, sẽ được sử dụng làm bộ kiểm tra để chúng tôi trích xuất từ ​​khóa. Bộ dữ liệu này dựa trên kết xuất Tràn ngăn xếp có sẵn công khai từ Truy vấn lớn của Google.

Hãy xem qua tập dữ liệu của chúng tôi. Đoạn mã dưới đây đọc một chuỗi json trên mỗi dòng từ data/stackoverflow-data-idf.json vào khung dữ liệu gấu trúc và in ra lược đồ của nó và tổng số bài đăng.

Đây, lines=True đơn giản có nghĩa là chúng tôi đang coi mỗi dòng trong tệp văn bản là một chuỗi json riêng biệt.

WHKg5Ngu5mwuBeI4y5UIcysbPM2XDdqMimnL
Đọc tệp json và in ra lược đồ và tổng số bài đăng trên Stack Overflow.
YAXt6ZDQtvw4R5gWJrtC0UhEqxfmEswodALs
Lược đồ và tổng số bài viết.

Lưu ý rằng bộ dữ liệu Stack Overflow này chứa 19 trường bao gồm tiêu đề bài đăng, nội dung, thẻ, ngày tháng và siêu dữ liệu khác mà chúng tôi không cần cho hướng dẫn này. Đối với hướng dẫn này, chúng tôi chủ yếu quan tâm đến phần thân và tiêu đề. Đây sẽ trở thành nguồn văn bản của chúng tôi để khai thác từ khóa.

Bây giờ chúng ta sẽ tạo một trường kết hợp cả hai bodytitle vì vậy chúng tôi có hai trong một lĩnh vực. Chúng tôi cũng sẽ in mục nhập văn bản thứ hai trong trường mới của chúng tôi chỉ để xem văn bản trông như thế nào.

QTx3-ZVcC-v2478agne5hwk7UIwH-OvmeigO

Uh oh, cái này có vẻ không dễ đọc lắm! Chà, đó là vì tất cả việc dọn dẹp đã diễn ra trong pre_process(..). Bạn có thể làm nhiều thứ hơn trong pre_process(..), chẳng hạn như loại bỏ tất cả các phần mã và chuẩn hóa các từ về gốc của nó. Để đơn giản, chúng tôi sẽ chỉ thực hiện một số tiền xử lý nhẹ.

Tạo từ vựng và số lượng từ cho IDF

Bây giờ chúng ta cần tạo từ vựng và bắt đầu quá trình đếm. Chúng ta có thể sử dụng CountVectorizer để tạo từ vựng từ tất cả văn bản trong df_idf['text'] theo sau là số lượng từ trong từ vựng:

Vz6XrDGC4Zu6h1JK9xcgu4jTJOn7kpyl-wtB

Kết quả của hai dòng cuối cùng từ đoạn mã trên là một đại diện ma trận thưa thớt của số đếm. Mỗi cột đại diện cho một từ trong từ vựng. Mỗi hàng đại diện cho tài liệu trong tập dữ liệu của chúng tôi, trong đó các giá trị là số lượng từ.

Đọc thêm  chỉ số chuỗi phải là số nguyên – Cách khắc phục trong Python

Ghi chú rằng, với biểu diễn này, số lượng của một số từ có thể bằng 0 nếu từ đó không xuất hiện trong tài liệu tương ứng.

Ở đây chúng tôi đang chuyển hai tham số cho CountVectorizer, max_dfstop_words. Đầu tiên là bỏ qua tất cả các từ đã xuất hiện trong 85% tài liệu, vì những từ đó có thể không quan trọng. Cái sau là danh sách từ dừng tùy chỉnh. Bạn cũng có thể sử dụng các từ dừng có nguồn gốc từ sklearn bằng cách đặt stop_words="english". Bạn có thể tìm thấy danh sách từ dừng được sử dụng cho hướng dẫn này tại đây.

Hình dạng kết quả của word_count_vector là (20000,124901) vì chúng tôi có 20.000 tài liệu trong tập dữ liệu của mình (các hàng) và kích thước từ vựng là 124.901.

Trong một số ứng dụng khai thác văn bản, chẳng hạn như phân cụm và phân loại văn bản, chúng tôi thường giới hạn kích thước của từ vựng. Thật dễ dàng để làm điều này bằng cách thiết lập max_features=vocab_size khi khởi tạo CountVectorizer. Đối với hướng dẫn này, hãy giới hạn kích thước từ vựng của chúng tôi ở mức 10.000:

pLhHU6UYk86G5P5KUoJ87sc6cYIKnTmDPiuB

Bây giờ, hãy xem 10 từ trong vốn từ vựng của chúng ta:

SMqynykFACPWIGAlcDN0PQV2vaBw9dAwfA3a
['serializing', 'private', 'struct', 'public', 'class', 'contains', 'properties', 'string', 'serialize', 'attempt']

Thật tuyệt, những thứ này chủ yếu liên quan đến lập trình.

TfidfTransformer để tính toán IDF

Bây giờ là lúc để tính toán các giá trị IDF.

Trong đoạn mã dưới đây, về cơ bản, chúng tôi đang lấy ma trận thưa thớt từ CountVectorizer (word_count_vector) để tạo IDF khi bạn gọi fit(...) :

NpfT2hZD8VVfv2wR0hnGrLRfoOjLi0vtX75f

Điểm cực kỳ quan trọng: IDF phải luôn dựa trên một kho ngữ liệu lớn và phải đại diện cho các văn bản bạn sẽ sử dụng để trích xuất từ ​​khóa. Tôi đã xem một số bài báo trên Web tính toán IDF bằng cách sử dụng một số tài liệu. Bạn sẽ đánh bại toàn bộ mục đích trọng số của IDF nếu nó không dựa trên một tập hợp lớn như:

  1. vốn từ vựng của bạn trở nên quá ít, và
  2. bạn có khả năng hạn chế để quan sát hành vi của các từ mà bạn biết.

Tính toán TF-IDF và trích xuất từ ​​khóa

Khi chúng tôi đã tính toán IDF của mình, chúng tôi sẵn sàng tính toán TF-IDF và sau đó trích xuất các từ khóa hàng đầu từ các vectơ TF-IDF.

Trong ví dụ này, chúng tôi sẽ trích xuất các từ khóa hàng đầu cho các câu hỏi trong data/stackoverflow-test.json. Tệp dữ liệu này có 500 câu hỏi với các trường giống với trường của data/stackoverflow-data-idf.json như chúng ta đã thấy ở trên. Chúng tôi sẽ bắt đầu bằng cách đọc tệp thử nghiệm của mình, trích xuất các trường cần thiết – tiêu đề và nội dung – và đưa các văn bản vào danh sách.

Đọc thêm  Cách tạo, đọc, cập nhật và tìm kiếm thông qua các tệp Excel bằng Python
KnapC5ZcFkMU4dGz3VttCj0gZBPvIVs9nQoO

Bước tiếp theo là tính toán giá trị tf-idf cho một tài liệu nhất định trong bộ thử nghiệm của chúng tôi bằng cách gọi tfidf_transformer.transform(...). Điều này tạo ra một vectơ điểm tf-idf.

Tiếp theo, chúng tôi sắp xếp các từ trong vectơ theo giảm dần thứ tự của các giá trị tf-idf và sau đó lặp lại để trích xuất các từ khóa top-n. Trong ví dụ bên dưới, chúng tôi đang trích xuất các từ khóa cho tài liệu đầu tiên trong bộ thử nghiệm của chúng tôi.

88UsQ05S1GAomTM7V03RNGR3MUm9z5l6n-Jx
gfoZfIRRVeyBXoAMNnmgP44BKtEjeVCPTalf

Các sort_coo(...) về cơ bản sắp xếp các giá trị trong vectơ trong khi vẫn giữ nguyên chỉ mục cột. Khi bạn có chỉ mục cột thì thật dễ dàng tra cứu giá trị từ tương ứng như bạn thấy trong extract_topn_from_vector(...) nơi chúng tôi làm feature_vals.append(feature_names[idx]).

Một số kết quả!

Trong phần này, bạn sẽ thấy câu hỏi tràn ngăn xếp, sau đó là các từ khóa được trích xuất tương ứng.

Câu hỏi về tích hợp Plugin Eclipse

fLsoeShixrFFLm-y5IVDzJgPjZzWTO9f360B
Các từ khóa được trích xuất thực tế.

Từ các từ khóa ở trên, các từ khóa hàng đầu thực sự có ý nghĩa, nó nói về eclipse, maven, integrate, wartomcattất cả đều là duy nhất cho câu hỏi cụ thể này.

Có một vài từ khóa có thể đã bị loại bỏ chẳng hạn như possibility và có lẽ thậm chí project. Bạn có thể làm điều này bằng cách thêm các từ phổ biến hơn vào danh sách dừng của mình. Bạn thậm chí có thể tạo tập hợp danh sách dừng của riêng mình, rất cụ thể cho miền của bạn.

Bây giờ hãy xem một ví dụ khác.

Câu hỏi về nhập SQL

uTTNMaq3bVfhUEU2q1Ua4VX83KBpbDzWbBtv
Từ khóa được trích xuất thực tế

Ngay cả với tất cả các thẻ html, nhờ quá trình xử lý trước, chúng tôi có thể trích xuất một số từ khóa khá hay ở đây. Lời cuối appropriately sẽ đủ điều kiện như một từ dừng. Bạn có thể tiếp tục chạy các ví dụ khác nhau để lấy ý tưởng về cách tinh chỉnh kết quả.

Thì đấy! Bây giờ bạn có thể trích xuất các từ khóa quan trọng từ bất kỳ loại văn bản nào!

Tài nguyên

Theo dõi blog của tôi để tìm hiểu thêm về Khai thác văn bản, NLP và Học máy từ góc độ ứng dụng.

Bài viết này ban đầu được xuất bản tại kavita-ganesan.com.



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status