Phân loại tài liệu bằng cách sử dụng mạng thần kinh tích chập


11

Tôi đang cố gắng sử dụng CNN (mạng nơ ron tích chập) để phân loại tài liệu. CNN cho văn bản ngắn / câu đã được nghiên cứu trong nhiều bài báo. Tuy nhiên, dường như không có bài báo nào sử dụng CNN cho văn bản hoặc tài liệu dài.
Vấn đề của tôi là có quá nhiều tính năng từ một tài liệu. Trong tập dữ liệu của tôi, mỗi tài liệu có hơn 1000 mã thông báo / từ. Để cung cấp từng ví dụ cho CNN, tôi chuyển đổi từng tài liệu thành ma trận bằng cách sử dụng word2vec hoặc găng tay dẫn đến một ma trận lớn. Đối với mỗi ma trận, chiều cao là chiều dài của tài liệu và chiều rộng là kích thước của vectơ nhúng từ. Tập dữ liệu của tôi có hơn 9000 ví dụ và phải mất rất nhiều thời gian để đào tạo mạng (cả tuần), điều này gây khó khăn cho việc tinh chỉnh các tham số.
Một phương pháp trích xuất tính năng khác là sử dụng một vectơ nóng cho mỗi từ, nhưng điều này sẽ tạo ra ma trận rất thưa thớt. Và tất nhiên, phương pháp này thậm chí còn mất nhiều thời gian để đào tạo hơn phương pháp trước đó.
Vì vậy, có một phương pháp tốt hơn để trích xuất các tính năng mà không tạo ra ma trận đầu vào lớn?
Và làm thế nào chúng ta nên xử lý chiều dài thay đổi của tài liệu? Hiện tại, tôi thêm các chuỗi đặc biệt để làm cho tài liệu có cùng độ dài, nhưng tôi không nghĩ đó là một giải pháp tốt.


2
Liệu sử dụng vector TfIdf có vẻ phù hợp? Có lẽ kết hợp với word2vec để chỉ để lại x từ hàng đầu cho mỗi tài liệu?
Diego

Chà, tôi không biết Tfldf là gì. Tôi sẽ kiểm tra xem nó có hoạt động không. Cảm ơn bạn
lenhhoxung

ví dụ như scikit-learn.org/urdy/modules/ ở đây
Diego

Tôi chỉ kiểm tra nó và tôi nghĩ nó không giúp tôi. Về cơ bản, lớp trình trợ giúp đó tạo ra một ma trận cho một tập hợp các tài liệu. Mỗi vectơ hàng (nhị phân hoặc wordcount) trong ma trận tương ứng với một tài liệu, nhưng đối với CNN, chúng ta cần một ma trận cho mỗi tài liệu.
lenhhoxung

Vấn đề là chỉ để lại x từ không tầm thường cho mỗi tài liệu được xếp hạng bởi TfIdf của họ. Sau đó sử dụng mã hóa ban đầu của bạn để xây dựng ma trận tài liệu. Không chắc chắn nếu ý tưởng tiếp cận hai bước này đi qua.
Diego

Câu trả lời:


8

Bạn có thể giảm độ dài của dữ liệu đầu vào bằng cách biểu diễn các tài liệu của bạn dưới dạng một loạt các vectơ câu thay vì một chuỗi các vectơ từ dài hơn. Doc2vec là một cách để làm điều này (mỗi câu sẽ là một "tài liệu").

Nếu bạn không muốn sử dụng Doc2vec, một cách để tạo các vectơ câu sẽ là trung bình các vectơ từ cho mỗi câu, cung cấp cho bạn một vectơ có cùng độ rộng cho mỗi câu. Điều này có thể không chính xác như một số phương pháp có sẵn thông qua Doc2Vec nhưng tôi đã sử dụng nó với thành công đáng kể cho mô hình chủ đề.

Dù bằng cách nào, một khi bạn có các vectơ câu của mình, hãy sắp xếp chúng theo thứ tự cho từng tài liệu giống như bạn đã làm cho các vectơ từ của bạn và chạy qua mô hình của bạn. Vì độ dài chuỗi cho mỗi tài liệu ngắn hơn, mô hình của bạn sẽ đào tạo nhanh hơn so với vectơ từ.

Nhân tiện, phương pháp này có thể hoạt động khi tăng hoặc giảm để đáp ứng nhu cầu chính xác và tốc độ của bạn. (ví dụ: nếu CNN của bạn vẫn chạy quá chậm với vectơ câu, bạn có thể tạo vectơ đoạn thay thế).

Một cách để xử lý các tài liệu có độ dài khác nhau là thông qua phần đệm. Trình tự tài liệu của bạn nên có độ dài bằng với tài liệu dài nhất của bạn. Vì vậy, nếu tài liệu dài nhất của bạn là 400 câu thì tất cả các chuỗi tài liệu sẽ có độ dài 400 vectơ. Các tài liệu ngắn hơn chiều dài tối đa sẽ được đệm bằng các vectơ chứa đầy số không.


Ý tưởng thú vị. Tôi sẽ thử nó :)
lenhhoxung

Tôi có thể hỏi một câu được không? Làm cách nào tôi có thể xử lý các tài liệu có độ dài khác nhau đáng kể (5 câu / doc, 500 câu / doc) ngay cả khi tôi biểu diễn chúng trong các vectơ câu? Đệm ở đây có vẻ kỳ lạ ...
stackunderflow

1
Trong xử lý lời nói, một số người sắp xếp các chuỗi dựa trên độ dài của nó để chuỗi có độ dài tương tự sẽ nằm trong cùng một đợt. Điều này có thể làm việc cho chuỗi văn bản.
suthee

4

Bạn có thể sử dụng nhúng khu vực. Thay vì chuyển đổi "mã thông báo" riêng lẻ thành vectơ, bạn có thể sử dụng chiến lược để chuyển đổi các vùng văn bản thành vectơ. Cách tiếp cận này được sử dụng ở đây: https://arxiv.org/abs/1504.01255

Nếu bạn không bị giới hạn ở CNN, bạn có thể sử dụng mô hình chú ý phân cấp như mô hình này: https://www.cs.cmu.edu/~diyiy/docs/naacl16.pdf nơi bạn có một đường dẫn loại này: word vectors (combined into) sentence vectors (combined into) final document vector

Lưu ý rằng, với phương pháp này, bạn vẫn sẽ phải chuyển đổi tất cả các vectơ từ thành nhúng, nhưng không phải tất cả cùng một lúc.

Để xử lý các tài liệu có độ dài khác nhau, đệm / cắt là giải pháp duy nhất cho đến nay.

Cuối cùng, để tăng tốc độ, bạn có thể cố gắng giảm kích thước của văn bản bằng cách chỉ bao gồm các phần quan trọng (có thể chỉ phần đầu của tài liệu là đủ để có độ chính xác phân loại tốt)


1
Cảm ơn cho liên kết tham khảo của bạn. Các khu vực nhúng là thú vị. Liên quan đến tài liệu có kích thước thay đổi, như được đề cập trong bài viết này arxiv.org/abs/1412.1058 (cùng tác giả), chúng ta có thể sử dụng nhiều đơn vị gộp thay vì đệm / cắt.
lenhhoxung
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.