Làm thế nào tôi có thể nhóm các chuỗi theo chủ đề phổ biến?


10

Tôi đang cố gắng nhóm, ví dụ, các chuỗi về lập trình với các chuỗi khác về lập trình, các chuỗi về vật lý với các chuỗi khác về vật lý, v.v., cho một loạt các chủ đề. Mặc dù khía cạnh ngôn ngữ lý thuyết rõ ràng của vấn đề, tôi đang tìm cách thực sự làm điều này bằng cách sử dụng lập trình / phần mềm.

Rundown: Đưa ra một số lượng lớn các chuỗi, làm thế nào tôi có thể phân nhóm chúng theo chủ đề ngữ nghĩa?

Ứng dụng cụ thể: Tôi có ~ 200 nghìn câu hỏi nhỏ mà tôi muốn phân loại thành các nhóm chung (xe hơi, máy tính, chính trị, Canada, thực phẩm, Barack Obama, v.v.).

Những gì tôi đã xem xét: Wikipedia có một danh sách các bộ công cụ xử lý ngôn ngữ tự nhiên (giả sử rằng những gì tôi đang cố gắng thực sự được gọi là NLP) vì vậy tôi đã xem xét một số nhưng dường như không làm gì tương tự với nhu cầu của tôi.

Lưu ý: Nó đã được chỉ ra rằng làm điều này đòi hỏi kiến ​​thức bổ sung (ví dụ: một chiếc Porsche là một chiếc xe hơi, C ++ là một ngôn ngữ lập trình). Tôi giả sử rằng dữ liệu đào tạo là cần thiết, nhưng nếu tôi chỉ có danh sách các câu hỏi và câu trả lời, làm thế nào tôi có thể tạo dữ liệu đào tạo? Và sau đó làm thế nào để tôi sử dụng dữ liệu đào tạo?

Ghi chú thêm: Nếu định dạng hiện tại của trợ giúp Hỏi & Đáp của tôi (mặc dù trông giống như JSON, về cơ bản đó là tệp văn bản thô):

// row 1: is metadata
// row 2: is a very specific kind of "category"
// row 3: is the question
// row 4: is the answer
{
  15343
  A MUSICAL PASTICHE
  Of classical music's "three B's", he was the one born in Hamburg in 1833
  Johannes Brahms
}

Nhưng trước khi ai đó chỉ ra rằng đã tồn tại một danh mục, hãy lưu ý rằng có ~ 200k câu hỏi và câu trả lời như thế này, và về cơ bản là nhiều "danh mục". Tôi đang cố gắng nhóm chúng thành các nhóm rộng hơn như những nhóm được liệt kê ở trên. Ngoài ra, định dạng này có thể được thay đổi cho tất cả các câu hỏi rất dễ dàng, tôi thực hiện nó theo chương trình.

Và thêm ghi chú: Tôi thực sự không biết mình cần bao nhiêu loại (ít nhất là 10-20), vì bản thân tôi chưa đọc qua tất cả các câu hỏi. Tôi đã hy vọng một phần có số lượng hữu hạn được xác định bằng cách nào đó trong quá trình phân loại. Trong mọi trường hợp, tôi luôn có thể tự tạo một số danh mục.


Bạn đã sử dụng cà rốt như thế nào? Từ đọc ngắn gọn của tôi về nó, có vẻ như nó sẽ dễ dàng xử lý các hồ sơ 200k.

Nó chỉ mất nhiều thời gian hơn tôi nghĩ và buộc tôi phải tăng phân bổ bộ nhớ ban đầu của JVM lên 1024m và bộ nhớ tối đa lên 2048m. Nó không tệ như tôi có thể tạo ra âm thanh đó.

Bạn chỉ cần đủ dữ liệu đào tạo, và sau đó bạn sẽ có thể phân loại các câu hỏi thành các loại này. Một cách tiếp cận hoàn toàn tự động có thể sẽ kết thúc việc nhóm chúng bằng các phương tiện khác, ví dụ như các câu hỏi có chứa từ "xe hơi". Bạn không thể học các từ đồng nghĩa cùng lúc với việc tạo một nhóm.
Có QUIT - Anony-Mousse

Ơ, bạn đang xử lý hàng loạt; đưa ra JVM không thực sự là một vấn đề. Mất bao lâu? Bạn đã tải tài liệu từ đâu? Một nguồn tùy chỉnh?

Tôi mất khoảng 10 phút, nhưng tôi đồng ý, xử lý hàng loạt theo định nghĩa là tốn thời gian và tốn bộ nhớ. Mặc dù toàn bộ shpeal về nó nghẹt thở không phải là vấn đề, nhiều hơn một lưu ý phụ.

Câu trả lời:


4

Đây là một vấn đề khá chuẩn trong NLP và những từ Google kỳ diệu mà bạn đang tìm kiếm là "mô hình chủ đề". Mặc dù các chuỗi của bạn khá ngắn, nhưng bạn có thể có một số thành công với Phân bổ Dirichlet tiềm ẩn hoặc một phương thức tương tự. Có một bài viết blog hay của Edwin Chen ở đây , trong đó nêu ra ý tưởng chung đằng sau thuật toán. Các chi tiết thực hiện được đề cập trong ghi chú này của Yi Wang.

Nếu bạn đang tìm kiếm một giải pháp sẵn có, tôi khuyên bạn nên dùng thử topicmodelsgói cho R, vì điều này cung cấp giao diện khá hợp lý cho cả LDA và Mô hình chủ đề tương quan phức tạp hơn. Ngoài ra còn có một danh sách tốt các triển khai được duy trì bởi David Mimno ở đây .


Cảm ơn bạn, bài viết trên blog của Chen dường như được chú ý đến những gì tôi đang cố gắng thực hiện. Có bất kỳ cơ hội nào bạn đã sử dụng bất kỳ thứ gì bạn đã liệt kê / thực hiện điều này trước đây không? Tôi đang ở một cơ sở hoàn toàn mới ở đây và sẽ đánh giá cao hướng dẫn về những gì tôi cần làm (sử dụng một trong những giải pháp sẵn có). Tôi nên định dạng "tài liệu" của mình như thế nào? Tôi có nên áp dụng ID cho từng câu hỏi và trả lời để cho phép tôi xác định tài liệu nào thuộc nhóm nào không? Làm cách nào để sử dụng dữ liệu xuất ra? Như tôi đã nói, tôi không hiểu nhiều chi tiết.
Whymarrh

Tôi đã sử dụng gói chủ đề R khá nhiều. Tôi chắc chắn khuyên bạn nên sử dụng mã của riêng bạn - có một số tài liệu với ví dụ hoạt động tại cran.r-project.org/web/packages/topicmodels/vignettes/ . Định dạng cụ thể của từng tài liệu không thực sự quan trọng, vì mọi thứ sẽ được giảm xuống thành một "túi từ". Chỉ cần ném tất cả các văn bản liên quan vào một chuỗi.
Martin O'Leary

4

Bạn đang cố gắng giải quyết hai vấn đề ở đây.

Vấn đề 1: Phân loại chuỗi câu hỏi trong danh mục phù hợp.

Vấn đề 2: Tạo danh mục phù hợp.

Vấn đề đầu tiên có thể được thực hiện bằng cái gọi là thuật toán được giám sát, nhiều phân loại có thể cho độ chính xác và hiệu suất rất tốt. Tuy nhiên, vấn đề 2, tạo ra các thể loại ngoài không khí mỏng (tấn dữ liệu), khó khăn hơn nhiều. Đây là một vấn đề không được giám sát, được cung cấp rất nhiều dữ liệu mà máy tính tự quyết định các danh mục theo một số tiêu chí. Lý tưởng nhất là các tiêu chí và thuật toán này sẽ sắp xếp gọn gàng dữ liệu của bạn thành các cụm. Những cái này sau đó có thể được dán nhãn. Tuy nhiên, vì đây là một nhiệm vụ khó khăn hơn nhiều, tôi muốn nói rằng không có giải pháp thả vào chấp nhận được ở đây sẽ mang lại kết quả tốt mà không cần nhiều nỗ lực điều chỉnh mà rất có thể cần đến các chuyên gia.

Vì vậy, tôi sợ rằng không có nút ma thuật nào ở đây cả. Tuy nhiên, những gì bạn có thể làm là giúp máy ra một chút. Chẳng hạn, bạn có thể quyết định tập hợp thể loại. Khi bạn đã quyết định về danh mục, bạn có thể tạo dữ liệu đào tạo. Trong thiết lập này, dữ liệu đào tạo chỉ là cặp câu hỏi và cặp danh mục chính xác.

Càng nhiều dữ liệu đào tạo càng tốt. Tuy nhiên, vì nhiệm vụ vẫn là tự động làm một cái gì đó, ban đầu nó không có ý nghĩa gì khi bắt đầu thực hiện mọi thứ bằng tay. Bây giờ tại sao bạn muốn có dữ liệu đào tạo? Đánh giá độ chính xác. Nếu bạn muốn có kết quả tốt, điều quan trọng là bạn có thể thực hiện một số loại đánh giá về việc thiết lập đang hoạt động tốt như thế nào. Và cách duy nhất để làm điều đó một cách có hệ thống là tự dán nhãn cho một số nhiệm vụ. Nếu không thì bạn đang bị mù.

Sau đó, một số câu hỏi mới phát sinh. Đầu tiên: Tôi cần bao nhiêu dữ liệu đào tạo? "Nó phụ thuộc". Không nhìn thấy dữ liệu hoặc danh mục của bạn, tôi không chắc là mình đã đoán được; nhưng tôi có thể lấy "ước tính sân bóng" và nói khoảng 500 câu hỏi. Lưu ý rằng tôi có thể tắt theo một thứ tự cường độ.

Điều này thực sự có nghĩa là bạn phải gắn thẻ 500 câu hỏi bằng tay? Có và không. Có thể sử dụng kết quả trung gian và một số thông minh để phân loại "bootstrap". Tuy nhiên, đây vẫn là công việc thủ công và khi bạn nghĩ về nó, 500 câu hỏi sẽ không mất nhiều thời gian để gắn thẻ. Thông minh ở đây có thể nhanh chóng cho kết quả tồi tệ hơn là siêng năng.

Khi bạn có dữ liệu đào tạo với số lượng đủ, hãy lấy 75% dữ liệu đó và tạo một trình phân loại bằng công cụ yêu thích của bạn (ví dụ: những dữ liệu được đề cập ở đây hoặc không có gì). Bây giờ, hãy để trình phân loại cố gắng gắn nhãn 25% dữ liệu và có nghĩa là chính xác kết quả. Nếu kết quả là tốt, sau đó pop champagne. Nếu không thì tạo thêm dữ liệu đào tạo hoặc thử phân loại khác.

TL; DR

Tóm lại, đây là cách tôi sẽ làm nó.

0) Use a supervised learner.
1) Create a category set yourself. 
2) Label manually about 500 questions
3) Use 75% of those to train a classifier.
4) Check performance.
5) If good then cheers else goto 2.

Một câu hỏi nhỏ: Bạn nói "khoảng 500 câu hỏi" cho dữ liệu đào tạo và để tự gắn thẻ những câu hỏi đó, nhưng cũng "Tôi có thể tắt theo thứ tự cường độ", vì vậy nếu tôi sử dụng câu hỏi 5k hoặc 50k thay thế, tôi vẫn sẽ tự tay gắn thẻ nhiều?

Vấn đề là; mà không thấy dữ liệu của bạn cũng như không có ý tưởng rất rõ ràng về tất cả các chi tiết nhỏ trong dự án của bạn, thật khó để đưa ra một ước tính tốt. Tuy nhiên, và điều này rất quan trọng cần nhớ, nếu 500 quá thấp, nỗ lực gắn thẻ không bị lãng phí. Bạn vẫn cần các câu hỏi được dán nhãn thủ công để đánh giá. Bạn càng có nhiều dữ liệu đánh giá, bạn càng có thể đánh giá tốt hơn.

Theo một thứ tự cường độ tôi có nghĩa là 50-500-5000. Tôi không nghĩ bạn sẽ cần phân loại 50k. Đó là 1/4 toàn bộ kho dữ liệu của bạn! Nếu 500 câu hỏi quá thấp, có thể phân loại bootstrap. Ý tưởng ở đây là bạn huấn luyện bộ phân loại trên một kho văn bản ban đầu nhỏ (ví dụ 500 của bạn) và sau đó gắn thẻ phần còn lại. Bây giờ, bạn có thể sử dụng một số trường hợp trong đó trình phân loại rất tự tin để đào tạo lại một trình phân loại mới, lớn hơn.

Một điều quan trọng khác cần ghi nhớ; hiệu suất của nhiều phân loại không phải là tuyến tính trong số lượng dữ liệu đào tạo, nhưng thường sẽ là một đường cong giống như sigmoid. Điều đó có nghĩa là hơn 500 câu hỏi được gắn thẻ có thể gần như là một lợi ích tương đương với 5000. Lời khuyên của tôi là làm việc theo các bước nhỏ.

Những chi tiết nào sẽ cung cấp cái nhìn sâu sắc bổ sung vào dự án của tôi? Tôi có thể chia sẻ một số câu hỏi mẫu để hiển thị định dạng của mình, nhưng tôi sẵn sàng điều chỉnh định dạng của Hỏi & Đáp để phù hợp với quy trình phân loại. Tôi đánh giá cao sự giúp đỡ.
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.