Làm thế nào tốt quy mô R để phân loại văn bản nhiệm vụ? [đóng cửa]


30

Tôi đang cố gắng tăng tốc với R. Cuối cùng tôi muốn sử dụng các thư viện R để thực hiện phân loại văn bản. Tôi chỉ tự hỏi những kinh nghiệm của mọi người liên quan đến khả năng mở rộng của R khi thực hiện phân loại văn bản.

Tôi có khả năng chạy vào dữ liệu chiều cao (~ 300k kích thước). Tôi đang xem xét sử dụng SVM và Random Forest nói riêng như các thuật toán phân loại.

Thư viện R sẽ mở rộng quy mô vấn đề của tôi?

Cảm ơn.

EDIT 1: Chỉ cần làm rõ, tập dữ liệu của tôi có thể có 1000-3000 hàng (có thể hơn một chút) và 10 lớp.

EDIT 2: Vì tôi rất mới với R, tôi sẽ yêu cầu người đăng phải cụ thể hơn nếu có thể. Ví dụ: nếu bạn đang đề xuất một quy trình / đường ống công việc, vui lòng đảm bảo đề cập đến các thư viện R liên quan đến từng bước nếu có thể. Một số con trỏ bổ sung (ví dụ, mã mẫu, v.v.) sẽ đóng băng trên bánh.

EDIT 3: Trước hết, cảm ơn mọi người vì ý kiến ​​của bạn. Và thứ hai, tôi xin lỗi, có lẽ tôi nên đưa ra nhiều bối cảnh hơn cho vấn đề. Tôi mới sử dụng R nhưng không quá nhiều để phân loại văn bản. Tôi đã thực hiện quá trình xử lý trước (xuất phát, loại bỏ từ khóa, chuyển đổi tf-idf, v.v.) trên một phần dữ liệu của mình bằng gói tm , chỉ để cảm nhận mọi thứ. tm rất chậm thậm chí trên khoảng 200docs mà tôi lo ngại về khả năng mở rộng. Sau đó, tôi bắt đầu chơi với FSelector và thậm chí điều đó rất chậm. Và đó là điểm mà tôi đã tạo ra OP của mình.

EDIT 4: Tôi nhận thấy rằng tôi có 10 lớp và khoảng ~ 300 tài liệu đào tạo mỗi lớp và trên thực tế tôi đang xây dựng ma trận termXdoc trong toàn bộ tập huấn dẫn đến tính chiều hướng rất cao. Nhưng làm thế nào về việc giảm mọi vấn đề phân loại 1 trong số các vấn đề phân loại nhị phân? Điều đó sẽ làm giảm đáng kể số lượng tài liệu đào tạo (và do đó là chiều) ở mỗi bước k-1 đáng kể, phải không? Vì vậy, cách tiếp cận này là một cách tốt? Làm thế nào để nó so sánh về độ chính xác với việc thực hiện nhiều lớp thông thường?


1
Kích thước 300k với bao nhiêu hàng? Thật không may, các đối tượng R phải nằm trong bộ nhớ (ít nhất là trừ khi bạn xem xét điều chỉnh chính, về cơ bản yêu cầu bạn phải tự viết lại các thuật toán này). Điều đó có nghĩa là với 8 hợp đồng ram, tôi không nghĩ bạn có thể lưu trữ hơn vài trăm hàng với 300k cột.
bút chì

@crayola: Số lượng hàng có thể thay đổi từ 1000-3000.
Andy

2
Các đối tượng R không cần phải có trong bộ nhớ. Bản đồ bộ nhớ là rất dễ dàng. Kích thước 300k không phải là vấn đề. Tôi cũng cho rằng dữ liệu của bạn là thưa thớt, vì đó là trường hợp với gần như tất cả các vấn đề văn bản.
Lặp lại

Tôi chỉ nhận thấy nhận xét ở trên: chỉ 1000-3000 hàng? Đó là rất nhỏ. Bạn có thể giải thích khối lượng của bạn là gì? Một loạt email? Mô tả các gói trong CRAN? Bạn có thể có nhiều vấn đề thống kê với P >> N hơn bất kỳ vấn đề lưu trữ nào.
Lặp lại

1
@Iterator: Chúng tôi có một số tài nguyên giáo dục (bài báo, bài tiểu luận, v.v.) mà chúng tôi muốn phân loại.
Andy

Câu trả lời:


17

Theo yêu cầu trong một bình luận, đây là một số gợi ý cho các bước xử lý. Một số công cụ có thể được tìm thấy tại Chế độ xem tác vụ CRAN để xử lý ngôn ngữ tự nhiên . Bạn cũng có thể muốn nhìn vào bài viết này trên tmgói (khai thác văn bản) cho R .

  1. Trước khi xử lý, hãy xem xét chuẩn hóa các mã thông báo từ. openNLP(trong đó có gói R) là một tuyến.
  2. Để xử lý văn bản, bước xử lý trước phổ biến là chuẩn hóa dữ liệu thông qua tf.idf- tần số thuật ngữ * tần số tài liệu nghịch đảo - xem mục nhập Wikipedia để biết thêm chi tiết. Có những cách chuẩn hóa khác gần đây hơn, nhưng đây là phương pháp bánh mì và bơ, vì vậy điều quan trọng là phải biết nó. Bạn có thể dễ dàng triển khai nó trong R: chỉ lưu trữ (docID, wordID, freq1, freq2) trong đó freq1 là số lần từ được lập chỉ mục bởi wordID xuất hiện trong tài liệu đã cho và freq2 là # tài liệu xuất hiện. Không cần lưu trữ vectơ này cho các từ không xuất hiện trong một tài liệu nhất định. Sau đó, chỉ cần lấy freq1 / freq2 và bạn có giá trị tf.idf của mình.
  3. Sau khi tính toán các giá trị tf.idf, bạn có thể làm việc với toàn bộ chiều của dữ liệu của mình hoặc lọc ra những từ đó về cơ bản là không chính xác. Chẳng hạn, bất kỳ từ nào chỉ xuất hiện trong 1 tài liệu sẽ không cung cấp nhiều thông tin chi tiết. Điều này có thể làm giảm đáng kể chiều của bạn. Với số lượng nhỏ tài liệu đang được kiểm tra, bạn có thể thấy rằng việc giảm xuống chỉ còn 1K kích thước là phù hợp.
  4. Tôi sẽ không lưu lại dữ liệu (ví dụ cho PCA), nhưng bạn có thể lưu trữ dữ liệu ngay bây giờ trong một ma trận hạn (trong đó các mục nhập bây giờ là giá trị tf.idf), sử dụng ma trận thưa thớt, như được Matrixgói hỗ trợ .

Tại thời điểm này, bạn có một bộ dữ liệu được xử lý trước độc đáo. Tôi sẽ khuyên bạn nên tiếp tục với các công cụ được trích dẫn trong chế độ xem tác vụ CRAN hoặc gói khai thác văn bản. Ví dụ, phân cụm dữ liệu bằng cách chiếu lên 4 hoặc 6 thành phần chính đầu tiên, có thể rất thú vị đối với nhóm của bạn khi dữ liệu được vẽ.

Một điều khác: bạn có thể thấy rằng việc giảm kích thước dọc theo dòng PCA (*) có thể hữu ích khi sử dụng các phương pháp phân loại khác nhau, vì về cơ bản bạn đang tổng hợp các từ liên quan. 10-50 thành phần chính đầu tiên có thể là tất cả những gì bạn cần để phân loại tài liệu, với kích thước mẫu của bạn.

(*) Lưu ý: PCA chỉ là bước đầu tiên. Nó có thể rất thú vị đối với một người mới bắt đầu khai thác văn bản và PCA, nhưng cuối cùng bạn có thể thấy rằng nó có một chút phiền toái đối với các tập dữ liệu thưa thớt. Tuy nhiên, như một bước đầu tiên, hãy xem nó, đặc biệt là thông qua các chức năng prcompprincomp.

Cập nhật: Tôi không nêu ưu tiên trong câu trả lời này - Tôi khuyên bạn nên prcompthay vì princomp.


+1 Câu trả lời hay; Tôi chỉ tò mò tại sao bạn nói rằng số lượng bến cảng nhỏ có nghĩa là số lượng các biến quan trọng thấp hơn - có vẻ như nó hơi quá sức?

Tôi không chắc tôi hiểu ý của bạn. Để giữ cho chúng là quá mức, chắc chắn, vì vậy các biến này sẽ được loại bỏ trong bất kỳ chính quy hợp lý. Hơn nữa, từ vựng (P) phát triển với # tài liệu hoặc mẫu (N), vì vậy lần đầu tiên một thuật ngữ xuất hiện không có nghĩa là nhiều. Tiếp tục thêm tài liệu và sau đó lặp lại một thuật ngữ trên các tài liệu sẽ trở thành thông tin.
Lặp lại

@Iterator: Cảm ơn câu trả lời của bạn. Vì vậy, prcompvà / hoặc princompsẽ quy mô đến loại dữ liệu này bạn nghĩ? Ngoài ra tôi chỉ cần chỉnh sửa câu hỏi của tôi và thêm một số thông tin bổ sung.
Andy

Không, những khả năng này sẽ không mở rộng khi bạn đạt 300K cột. :) (Chỉ cần chỉ ra: X'X trong trường hợp đó sẽ có các mục 90B - một vấn đề lưu trữ.) Thay vào đó, hãy lọc theo tf.idf trước. Nếu chỉ có 10 lớp riêng biệt, thì một bội số nhỏ của 10 phải đủ cho một chiều lớn hơn để phân tách các lớp. Vì vậy, 1000 kích thước là quá đủ. Cả hai phương pháp PCA (btw, tôi khuyên bạn prcomp) sẽ ổn.
Lặp lại

Khi bạn giới hạn ở 1000 kích thước hoặc có thể thêm một vài chiều (ví dụ 2K) và thực hiện PCA, bạn có thể đưa ra các dự đoán về 100 kích thước (có thể là quá mức, nhưng có ít tác hại trong việc này) và sau đó thực hiện phân loại. Tại thời điểm này, không có gì quá thú vị đang diễn ra.
Lặp lại

5

Đầu tiên, chào mừng bạn! Xử lý văn bản rất thú vị và thực hiện nó trong R trở nên dễ dàng hơn mọi lúc.

Câu trả lời ngắn gọn: có - các công cụ trong R hiện đang khá tốt để xử lý loại dữ liệu này. Trên thực tế, không có gì đặc biệt về R, C ++, Groovy, Scala hoặc bất kỳ ngôn ngữ nào khác khi lưu trữ dữ liệu trong RAM: mọi ngôn ngữ đều lưu trữ một dấu phẩy kép 8 byte trong ... chờ cho nó ... chờ đợi. .. 8 byte!

Các thuật toán và việc thực hiện chúng có vấn đề, đặc biệt là nếu được triển khai rất kém liên quan đến cấu trúc dữ liệu và độ phức tạp tính toán. Nếu bạn đang thực hiện các thuật toán của riêng bạn, chỉ cần chăm sóc. Nếu sử dụng mã khác, emptor caveat áp dụng, giống như trong bất kỳ môi trường nào.

Đối với R, bạn sẽ cần xem xét:

  1. Biểu diễn dữ liệu của bạn (nhìn vào ma trận thưa thớt, đặc biệt là trong Matrixgói)
  2. Lưu trữ dữ liệu (có thể được ánh xạ bộ nhớ, sử dụng bigmemoryhoặc ff; hoặc phân phối, sử dụng Hadoop)
  3. Phân vùng dữ liệu của bạn (bạn có thể lắp RAM bao nhiêu tùy thuộc vào dung lượng RAM bạn có)

Điểm cuối cùng thực sự nằm dưới sự kiểm soát của bạn.

Khi nói đến chiều này, nó không còn đặc biệt nữa. Số lượng quan sát sẽ có nhiều tác động hơn, nhưng bạn có thể phân vùng dữ liệu của mình để điều chỉnh mức độ sử dụng RAM, do đó không thực sự quá lo lắng.


3

Tôi đồng ý với crayola rằng số lượng hàng là rất quan trọng ở đây. Đối với RF, bạn sẽ cần ít nhất gấp 3 lần RAM so với trọng số dữ liệu của bạn và có thể mất rất nhiều thời gian (số lượng thuộc tính như vậy thường đòi hỏi rất nhiều cây trong rừng - và lưu ý rằng không có triển khai song song RF trong R).

Về SVM, tôi nghi ngờ rằng nên chiến đấu với các kích thước 300k trong khi bạn có thể phát triển một hàm kernel sẽ tương đương với các mô tả văn bản của bạn.

EDIT: Ma trận 3k x 30k (thực) sẽ chiếm khoảng 7Gb, vì vậy tất cả những gì bạn cần làm RF (sử dụng RandomForest) trên dữ liệu này là một máy tính có RAM 16 GB, một chút may mắn và khá ít thời gian hoặc chỉ là một máy tính có 24 GB RAM và khá nhiều thời gian.


Chà, tôi chắc chắn sẽ thực hiện lựa chọn tính năng (chi bình phương, dựa trên entropy) nhưng một lần nữa tôi không thể tìm thấy bất kỳ thư viện R nào có thể mở rộng cho nhiệm vụ này. Nếu tính tất cả những điều này, liệu có đúng không khi nói rằng có lẽ tôi nên bắt đầu xem xét các giải pháp không phải R?
Andy

1
"Lưu ý rằng không có triển khai song song RF trong R". Điều đó chỉ đúng một phần, vì foreachgói chơi độc đáo với randomForestgói. Tôi nghĩ rằng có một ví dụ như vậy trong họa tiết cho foreach. (Hoặc có thể doMC.)
bút chì màu

@Andy Vấn đề là, viết lại các thuật toán bằng ngôn ngữ lập trình cấp thấp, tôi không chắc phần mềm nào có thể áp dụng các thuật toán này vào dữ liệu của bạn. Nếu tôi ở trong tình huống của bạn, tôi đoán tôi sẽ bám vào R và viết lại các phần của randomForestnó để truy vấn các cột được chọn ngẫu nhiên, ví dụ, cơ sở dữ liệu SQL ở mỗi lần lặp (sao cho toàn bộ kích thước 300k sẽ không bao giờ có để được trong ram). Nhưng điều đó có lẽ chủ yếu là vì tôi biết nhiều về R hơn là về các lựa chọn có thể khác.
bút chì

Bạn có ý nghĩa chính xác gì khi tuyên bố rằng bạn không thể tìm thấy một thư viện sẽ mở rộng quy mô đó? Các bộ lọc như thế này là đại số cơ bản, chúng sẽ hoạt động mà không gặp vấn đề gì (miễn là bạn có đủ RAM).

@crayola Đúng, nhưng phần sáp nhập là khủng khiếp. Hơn nữa, nó không phải là song song mem-chia sẻ, vì vậy nó có thể sẽ đau đớn (nếu không phải là không thể) trong cài đặt này.
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.