Phân loại văn bản quy mô lớn


18

Tôi đang tìm cách phân loại dữ liệu văn bản của tôi. Tôi có 300 classes, 200 tài liệu đào tạo mỗi lớp (vì vậy 60000 documents in total) và điều này có khả năng dẫn đến dữ liệu rất cao (chúng ta có thể đang tìm kiếm vượt quá 1 triệu kích thước ).

Tôi muốn thực hiện các bước sau trong đường ống dẫn (chỉ để cho bạn biết ý nghĩa của tôi về yêu cầu của tôi):

  1. Chuyển đổi từng tài liệu thành tính năng vector ( tf-idfhoặc vector space model)
  2. Feature selection( Mutual Informationtốt nhất là dựa trên, hoặc bất kỳ tiêu chuẩn nào khác)
  3. Đào tạo phân loại ( SVM, Naive Bayes, Logistic Regressionhay Random Forest)
  4. Dự đoán dữ liệu chưa thấy dựa trên mô hình phân loại được đào tạo.

Vì vậy, câu hỏi là tôi sử dụng công cụ / khung nào để xử lý dữ liệu chiều cao như vậy? Tôi biết về các nghi phạm thông thường (R, WEKA ...) nhưng theo như kiến ​​thức của tôi (tôi có thể sai) có lẽ không ai trong số họ có thể xử lý dữ liệu lớn như vậy. Có cái nào khác ngoài công cụ kệ mà tôi có thể nhìn vào không?

Nếu tôi phải song song hóa nó, tôi có nên xem Apache Mahout không? Có vẻ như nó có thể chưa hoàn toàn cung cấp các chức năng tôi yêu cầu.

Cảm ơn tất cả trước.


Cập nhật: Tôi đã xem qua trang web này , danh sách gửi thư R và internet nói chung. Tôi nhận thấy rằng những vấn đề sau đây có thể xuất hiện trong tình huống của tôi:

(1) Việc xử lý trước dữ liệu của tôi bằng R ( đặc biệt là gói tm ) có thể không thực tế , vì tmsẽ rất chậm.

(2) Vì tôi sẽ cần sử dụng một nhóm các gói R (tiền xử lý, ma trận thưa thớt, phân loại, v.v.) khả năng tương tác giữa các gói có thể trở thành một vấn đề và tôi có thể phải chịu thêm chi phí trong việc chuyển đổi dữ liệu từ định dạng này sang định dạng khác . Ví dụ: nếu tôi xử lý trước bằng cách sử dụng tm(hoặc một công cụ bên ngoài như WEKA), tôi sẽ cần tìm ra cách chuyển đổi dữ liệu này thành một dạng mà các thư viện HPC trong R có thể đọc được. Và một lần nữa tôi không rõ liệu các gói phân loại sẽ trực tiếp lấy dữ liệu như được cung cấp bởi các thư viện HPC.

Có phải tôi đang trên đường ray bên phải không? Và quan trọng hơn, tôi có ý nghĩa?


R có thể xử lý các tập dữ liệu lớn hơn nhiều so với điều này, bạn chỉ cần sử dụng tốt các công cụ có sẵn. Không có sự khác biệt giữa những gì có thể đạt được trong bất kỳ ngôn ngữ hoặc môi trường chính nào, mặc dù Weka và Mahout tụt hậu về những gì có sẵn. FWIW, đây là kích thước mẫu khá nhỏ và kích thước 1M không phải là vấn đề lớn, nhưng nó cũng quá mức cần thiết về mặt thống kê. Đề xuất của tôi là R hoặc Python, vì chúng đều miễn phí và dễ dàng cho người mới bắt đầu. Matlab không miễn phí, nhưng cũng tốt. Nó cũng phải chịu một khoản thuế lớn khi bạn sử dụng nhiều máy tính.
Lặp lại

1
Một điểm nổi bật hơn nhiều là bạn có nhiều lớp hơn các ví dụ cho mỗi lớp và bạn đang nhúng nó vào một không gian rất cao. Tôi không chắc bạn sẽ tách lớp rất tốt ở đây. Bạn có một số quan hệ cấu trúc cho các lớp học của bạn? Nếu vậy, một số phương pháp này có thể bị trả giá thấp mà không có cái nhìn sâu sắc.
vòng lặp

1
Bạn có thể sử dụng foreachthư viện viết mã song song trong R. Điều này đặc biệt hiệu quả khi kết hợp với các khu rừng ngẫu nhiên, vốn dễ dàng song song.
Zach

2
Một vài câu hỏi: 1) Bạn có muốn so sánh tất cả các loại phương pháp học tập khác nhau mà bạn đề cập, hoặc bạn chỉ cần một cách để hoàn thành công việc? 2) Mỗi ​​tài liệu thuộc về 1, 1 hoặc nhiều hơn, hoặc 0 hoặc nhiều hơn các lớp? 3) Bạn có đặc biệt muốn sử dụng lựa chọn tính năng vì một số lý do, hoặc bạn chỉ nghĩ rằng nó là cần thiết? Tôi đồng ý với các ý kiến ​​khác rằng đây là một vấn đề có quy mô khiêm tốn theo tiêu chuẩn ngày nay và việc giảm kích thước là không cần thiết.
DavidDLewis

1
Tôi đang làm việc về phân loại văn bản liên quan đến gần 10.000 chủ đề (ví dụ: các lớp hoặc danh mục hoặc bất kỳ thuật ngữ nào bạn thích). Tôi hiện đang làm việc để điều chỉnh hệ thống phân loại văn bản này ở quy mô này. Tôi không thể chia sẻ các kỹ thuật của riêng mình vì chúng là độc quyền, nhưng tôi có một lời khuyên: hãy thận trọng khi cho rằng một số quy mô kỹ thuật được đề xuất trừ khi nó đã được chứng minh là làm như vậy. Theo kinh nghiệm của tôi, rất ít làm.

Câu trả lời:


13

Điều này có thể làm cho nó hoạt động miễn là dữ liệu được biểu diễn dưới dạng cấu trúc dữ liệu thưa thớt như scipy.sparse.csr_matrixthể hiện trong Python. Tôi đã viết một hướng dẫn để làm việc trên dữ liệu văn bản . Có thể giảm hơn nữa việc sử dụng bộ nhớ hơn nữa bằng cách tận dụng thủ thuật băm: điều chỉnh nó để sử dụng HashingVectorizerthay vì CountingVectorizerhoặc TfidfVectorizer. Điều này được giải thích trong phần tài liệu trích xuất tính năng văn bản .

Rừng ngẫu nhiên nói chung đắt hơn nhiều so với mô hình tuyến tính (như máy vectơ hỗ trợ tuyến tính và hồi quy logistic) và Bayes ngây thơ đa chiều hoặc Bernoulli và đối với hầu hết các vấn đề phân loại văn bản không mang lại độ chính xác dự đoán tốt hơn đáng kể so với mô hình đơn giản.

Nếu scikit-learn kết thúc không thể mở rộng theo vấn đề của bạn, Vowpal Wợi sẽ làm (và có thể nhanh hơn sklearn) mặc dù nó không thực hiện tất cả các mô hình mà bạn đang nói đến.

Được chỉnh sửa vào tháng 4 năm 2015 để phản ánh trạng thái hiện tại của thư viện scikit-learn và để sửa các liên kết bị hỏng.


Vấn đề với việc sử dụng bất kỳ kỹ thuật giảm kích thước "không chuẩn" nào là bạn có thể gặp rắc rối khi bạn cố gắng xuất bản tác phẩm của mình. Trong lĩnh vực phân loại văn bản ít nhất, tôi biết một thực tế rằng các nhà đánh giá muốn xem các kỹ thuật thường được sử dụng (giúp dễ dàng so sánh với các kỹ thuật phân loại hiện có).
dùng721975

Đừng lo lắng - @ogrisel đã không đề cập đến bất cứ điều gì không chuẩn, ít nhất là không liên quan đến việc phân loại văn bản nghệ thuật, mặc dù tôi chưa đọc hướng dẫn của anh ấy.
vòng lặp

+1 Tôi nghĩ Python có lẽ là một cách thú vị để đi. Có một số gói rất gần đây trong R để khai thác văn bản, nhưng nếu một gói có tính toán nhiều hơn chuyên môn và sở thích thống kê, Python sẽ là đề xuất của tôi.
lặp

@ogrisel: Kudos cho những đóng góp mà bạn và những người khác đã làm cho sklearn. Tôi đã giới thiệu nó cho nhiều người làm việc trong Python - toàn bộ thiết kế là mẫu mực.
vòng lặp

Đối với việc giảm kích thước "không chuẩn" (sử dụng các phép chiếu ngẫu nhiên) và tính năng băm kiểm tra thủ thuật băm của John Langford và cuộc thảo luận này về siêu tối đa hóa .
ogrisel

10

Gensim cho Python là ma thuật. Và vì nó có trong Python, bạn có thể sử dụng nó cùng với đề xuất của @ ogrisel.


1

Không tự mình bấm còi, nhưng tôi đã tạo một loạt video khá phổ biến về phân tích văn bản với Rapidminer. Bạn có thể thấy nó ở đây:

http://vancodardata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

Bạn có thể tránh thực hiện lựa chọn tính năng, chỉ cần sử dụng trình phân loại không tạo ra ma trận triệu * triệu trong bộ nhớ :)

Hồi quy logistic sẽ nghẹt thở trên nhiều chiều. Naive Bayes giả định kích thước độc lập, vì vậy bạn sẽ ổn. SVM không phụ thuộc vào số lượng kích thước (nhưng vào số lượng vectơ hỗ trợ) vì vậy nó cũng sẽ ổn.

300 là rất nhiều lớp mặc dù. Tôi sẽ bắt đầu chỉ với một vài và làm theo cách của bạn.


Con trỏ và lời khuyên tuyệt vời. Cảm ơn. Bạn có thể vui lòng giải thích những gì bạn có nghĩa là "bắt đầu chỉ với một vài và làm theo cách của bạn"?
dùng721975

tốt, thay vì 300 lớp (như "violin, viola, cello, kèn ..."), bạn có thể phân loại lại chúng thành một số nhỏ hơn như "chuỗi, đồng thau".
Neil McGuigan

OK, tôi hiểu rồi
dùng721975

1

Đầu tiên, dựa trên ý kiến ​​của bạn, tôi sẽ coi đây là 300 vấn đề phân loại nhị phân (có / không). Có nhiều người học phân loại nhị phân mã nguồn mở dễ sử dụng và điều này cho phép bạn trao đổi thời gian cho bộ nhớ.

SVM và hồi quy logistic có lẽ là phương pháp phổ biến nhất để phân loại văn bản. Cả hai đều có thể dễ dàng xử lý 1000000 kích thước, vì các triển khai hiện đại sử dụng cấu trúc dữ liệu thưa thớt và bao gồm các cài đặt chính quy hóa tránh quá mức.

Một số bộ máy học mã nguồn mở, bao gồm WEKAKNIME , bao gồm cả SVM và hồi quy logistic. Các triển khai độc lập của SVM bao gồm libSVMSVMlight . Để hồi quy logistic, tôi sẽ cắm BXRtrain và BXRVELify , mà tôi đã phát triển cùng với Madigan, Genkin và những người khác. BXR classify có thể xây dựng một chỉ mục trong bộ nhớ của hàng ngàn mô hình hồi quy logistic và áp dụng chúng đồng thời.

Đối với việc chuyển đổi văn bản thành dạng vector thuộc tính, bằng cách nào đó tôi luôn luôn viết một chút Perl để làm điều đó từ đầu. :-) Nhưng tôi nghĩ rằng các bộ máy học tôi đã đề cập bao gồm mã thông báo và mã hóa. Một lộ trình khác là đi cùng với nhiều bộ công cụ ngôn ngữ tự nhiên như LingPipe , mặc dù điều đó có thể là quá mức cần thiết cho bạn.


+1 Nhận xét tốt. Nếu tôi thực hiện 300 phân loại có / không, tôi sẽ chọn dữ liệu đào tạo tiêu cực cho một lớp như thế nào? Dữ liệu tích cực rõ ràng là các tài liệu thuộc về lớp.
dùng721975

Một bình luận khác. SVM / Logistic reg có thể chắc chắn xử lý một triệu kích thước, nhưng làm cách nào tôi có thể chạy thử nghiệm để chọn tham số cho các phân loại này? Ví dụ, trên một tập dữ liệu nhỏ, bạn có thể chạy xác thực chéo 10 lần để quyết định các tham số, nhưng cách tiếp cận nào cần cho dữ liệu lớn như vậy để thuật toán kết thúc chạy trong thời gian hợp lý?
dùng721975

@ user721975: Đối với một sự phân biệt đối xử cụ thể, các tài liệu tích cực là những tài liệu có nhãn X trên đó và các tài liệu phủ định là tất cả các tài liệu còn lại.
DavidDLewis

@ user721975: Thật khó để đưa ra lời khuyên chung về thời gian chạy, vì các chi tiết rất khác nhau giữa các thuật toán và triển khai. Xác thực chéo 10 lần có thể không thực tế đối với tập dữ liệu của bạn: 60000 ví dụ không phải là vấn đề.
DavidDLewis

1
Bộ đào tạo không cân bằng không nhất thiết là một vấn đề. Nhưng thực ra tôi nhận ra có một điều tôi bối rối: vì tài liệu có thể thuộc về 0, 1 hoặc một vài lớp, ý bạn là gì khi có 200 tài liệu đào tạo mỗi lớp? Bạn đã làm gì để xóa tài liệu với 0 lớp hoặc 2+ lớp? Nói chung, làm thế nào bạn tạo ra bộ 60000 tài liệu này?
DavidDLewis

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.