2009-06-18 25 views
9

Tôi muốn triển khai Phân tích ngữ nghĩa tiềm ẩn (LSA) trong PHP để tìm ra các chủ đề/thẻ cho văn bản.LSA - Phân tích ngữ nghĩa tiềm ẩn - Làm thế nào để mã hóa nó trong PHP?

Đây là những gì tôi nghĩ mình phải làm. Điều này có đúng không? Làm thế nào tôi có thể mã nó trong PHP? Làm cách nào để xác định từ nào để chọn?

Tôi không muốn sử dụng bất kỳ thư viện bên ngoài nào. I've already an implementation for the Singular Value Decomposition (SVD).

  1. Trích xuất tất cả các từ từ văn bản đã cho.
  2. Trọng lượng các từ/cụm từ, ví dụ: với tf–idf. Nếu trọng số quá phức tạp, chỉ cần lấy số lần xuất hiện.
  3. Tạo một ma trận: Các cột là một số tài liệu từ cơ sở dữ liệu (càng nhiều càng tốt?), Các hàng là tất cả các từ duy nhất, các giá trị là số lần xuất hiện hoặc trọng số.
  4. Thực hiện phân tách giá trị số ít (SVD).
  5. Sử dụng các giá trị trong ma trận S (SVD) để làm giảm kích thước (như thế nào?).

Tôi hy vọng bạn có thể giúp tôi. Cảm ơn bạn rất nhiều trước!

+1

"Tôi đã đã thực hiện một cho Số ít giá trị gia tăng phân hủy" http://stackoverflow.com/questions/960060/singular-value-decomposition-svd-in-php – Ben

+0

Xin lỗi, tôi đã đã thêm liên kết ngay bây giờ. – caw

+0

Điều này phải làm gì với PHP? – Novelocrat

Trả lời

7

liên kết LSA:

Đây là thuật toán hoàn chỉnh. Nếu bạn có SVD, bạn hầu hết ở đó. Các giấy tờ trên giải thích nó tốt hơn tôi.

Giả định:

  • chức năng SVD của bạn sẽ cung cấp cho các giá trị số ít và vectơ đặc biệt trong thứ tự giảm dần. Nếu không, bạn phải làm thêm nhào lộn.

M: ma trận corpus, w (từ) bởi d (tài liệu) (w hàng, d cột). Đây có thể là số liệu thô, hoặc tfidf hoặc bất cứ điều gì. Các từ dừng có thể hoặc không thể bị loại bỏ, và bắt nguồn gốc có thể xảy ra (Landauer nói giữ lại các từ dừng và không xuất phát, nhưng có với tfidf).

U,Sigma,V = singular_value_decomposition(M) 

U: w x w 
Sigma: min(w,d) length vector, or w * d matrix with diagonal filled in the first min(w,d) spots with the singular values 
V: d x d matrix 

Thus U * Sigma * V = M 
# you might have to do some transposes depending on how your SVD code 
# returns U and V. verify this so that you don't go crazy :) 

Sau đó reductionality .... giấy LSA thực tế cho thấy một xấp xỉ tốt cho cơ sở là giữ đủ vectơ như vậy mà giá trị đặc biệt của họ là hơn 50% trong tổng số các giá trị duy nhất.

succintly Nhiều hơn ... (giả)

Let s1 = sum(Sigma). 
total = 0 
for ii in range(len(Sigma)): 
    val = Sigma[ii] 
    total += val 
    if total > .5 * s1: 
     return ii 

này sẽ trở lại thứ hạng của cơ sở mới, đó là min (d, w) trước đây, và chúng tôi sẽ hiện xấp xỉ với {ii}.

(ở đây, '-> đắc địa, không transpose)

Chúng tôi tạo ra ma trận mới: U', Sigma 'V', với kích thước w x ii, ii x ii, và ii x d.

Đó là bản chất của thuật toán LSA.

Ma trận kết quả này U '* Sigma' * V 'có thể được sử dụng cho tìm kiếm tương tự như cosin được cải thiện, hoặc bạn có thể chọn 3 từ trên cùng cho mỗi tài liệu trong đó. Cho dù anh em này nhiều hơn một tf-idf đơn giản là một vấn đề của một số cuộc tranh luận.

Đối với tôi, LSA hoạt động kém trong các tập dữ liệu thế giới thực bởi vì đa diện và tập dữ liệu có quá nhiều chủ đề. Đó là cơ sở toán học/xác suất là không rõ ràng (nó giả định phân phối bình thường-ish (Gaussian), mà không có ý nghĩa cho số lượng từ).

Số dặm của bạn chắc chắn sẽ thay đổi.

Gắn thẻ sử dụng LSA (một phương pháp!)

  1. Xây dựng U 'Sigma' V' giảm chiều ma trận sử dụng SVD và giảm dựa trên kinh nghiệm

  2. Bằng tay, nhìn qua U 'ma trận và đưa ra các thuật ngữ mô tả từng "chủ đề". Ví dụ, nếu phần lớn nhất của vectơ đó là "Bronx, Yankees, Manhattan" thì "Thành phố New York" có thể là một thuật ngữ tốt cho nó. Giữ chúng trong một mảng kết hợp hoặc danh sách. Bước này phải hợp lý vì số lượng vectơ sẽ là hữu hạn.

  3. Giả sử bạn có vectơ (v1) từ cho tài liệu, thì v1 * t (U ') sẽ cung cấp' chủ đề 'mạnh nhất cho tài liệu đó. Chọn 3 cao nhất, sau đó cung cấp cho "chủ đề" của họ như được tính toán trong bước trước.

+0

Chắc chắn, đây là những gì tôi muốn biết. Nhưng tôi vẫn có một số câu hỏi: Tôi có cần V hoặc VT (chuyển vị trí) không? Tôi sử dụng http://stitchpanorama.sourceforge.net/Python/svd.py cung cấp cho bạn V. Như bạn có thể thấy ở đó, các giá trị số ít không theo thứ tự giảm dần. Đây có phải là chức năng mã giả của bạn trong PHP không? http://paste.bradleygill.com/index.php?paste_id=10532 Nó làm gì? – caw

+0

Các thử nghiệm dễ dàng cho dù bạn cần V hay Vt là để tìm ra cho dù USV = M hoặc USVt = M. Đó là một chức năng heuristic cách để tìm ra bao nhiêu chiều để giảm. Trong hàm này, nó nói, "làm giảm cơ sở sao cho các vectơ có từ 50% trở lên tổng giá trị số ít". Bạn cũng có thể nói "giữ k lớn nhất, đối với một số giá trị k, như 50" .... về cơ bản, xác định có bao nhiêu danh mục thực sự có, đó là toàn bộ điểm của LSA. –

+0

Đã bao giờ có một giải pháp cho LSA này trong câu hỏi PHP. Tôi hiểu thuật toán nhưng cũng đã phải vật lộn để thực hiện nó trong PHP. – privateace

0

Điều đó có vẻ đúng, đến bước cuối cùng. Ký pháp thông thường cho SVD là nó trả về ba ma trận A = USV *. S là ma trận đường chéo (có nghĩa là tất cả số không ở đường chéo), trong trường hợp này, về cơ bản cho phép đo lường số lượng mỗi kích thước của dữ liệu gốc. Các con số ("giá trị số ít") sẽ giảm xuống và bạn có thể tìm kiếm một trình đơn thả xuống cho số lượng thứ nguyên hữu ích. Nếu không, bạn sẽ chỉ muốn chọn một số tùy ý N cho số lượng thứ nguyên cần thực hiện.

Ở đây tôi thấy hơi mờ. Các tọa độ của các từ (từ) trong không gian được giảm kích thước hoặc là trong U hoặc V, tôi nghĩ tùy thuộc vào việc chúng nằm trong các hàng hay cột của ma trận đầu vào. Off hand, tôi nghĩ rằng các tọa độ cho các từ sẽ là các hàng của U. tức là hàng đầu tiên của U tương ứng với hàng đầu tiên của ma trận đầu vào, tức là từ đầu tiên. Sau đó, bạn chỉ cần lấy N cột đầu tiên của hàng đó làm tọa độ của từ trong không gian đã giảm.

HTH

Cập nhật:

Quá trình này cho đến nay không cho bạn biết chính xác làm thế nào để chọn ra thẻ. Tôi đã không bao giờ nghe nói về bất cứ ai sử dụng LSI để chọn thẻ (một thuật toán học máy có thể phù hợp hơn với nhiệm vụ, như, nói, cây quyết định). LSI cho bạn biết liệu hai từ có giống nhau hay không. Đó là một chặng đường dài từ việc gán thẻ.

Có hai tác vụ- a) bộ thẻ để sử dụng là gì? b) cách chọn ba thẻ tốt nhất ?. Tôi không có nhiều ý nghĩa về cách LSI sẽ giúp bạn trả lời (a). Bạn có thể chọn bộ thẻ bằng tay. Tuy nhiên, nếu bạn đang sử dụng LSI, các thẻ có thể là các từ xuất hiện trong tài liệu. Sau đó cho (b), bạn muốn chọn các thẻ gần với các từ được tìm thấy trong tài liệu. Bạn có thể thử nghiệm với một vài cách để thực hiện điều đó. Chọn ba thẻ gần nhất với từ trong tài liệu, trong đó độ gần được đo bằng độ tương tự cosin (xem Wikipedia) giữa tọa độ của thẻ (hàng của nó trong U) và tọa độ của từ (hàng của nó trong U).

+0

Cảm ơn bạn. Vấn đề chính của tôi là: Làm thế nào tôi có thể xác định những từ tôi nên chọn? Giả sử rằng tôi luôn muốn có 3 thẻ: Tôi phải làm gì? – caw

+0

Cảm ơn. Có lẽ tôi đã hiểu lầm một cái gì đó và LSA không được sử dụng để tìm các thẻ. Nhưng nếu tôi có một bộ thẻ, ví dụ: "Thể thao, chính trị, thế giới", sau đó bạn chắc chắn có thể sử dụng LSA để tìm thẻ phù hợp nhất, phải không? – caw

+0

"Nhưng nếu tôi có một bộ thẻ, ví dụ:" Thể thao, Chính trị, Thế giới "," ... Không. Đó không phải là điều thực sự là LSA. Nếu bạn có các thẻ đó và một tập hợp các bài viết về các chủ đề đó, sẽ có ý nghĩa hơn khi sử dụng một classfier Bayes. Những gì LSA là để nói, "các từ: bóng chày, yankees, A-Rod có xu hướng đồng xảy ra, và có thể phản ánh một số cấu trúc cơ bản, do đó các bài viết khác có bóng chày trong chúng có thể liên quan đến cùng một chủ đề cơ bản". LSA chỉ là phân tích nhân tố. –

1

Câu trả lời này không trực tiếp đến câu hỏi của người đăng, mà là câu hỏi meta về cách tự động gắn thẻ các mục tin tức.OP đề cập đến nhận dạng đối tượng được đặt tên, nhưng tôi tin rằng chúng có ý nghĩa gì đó dọc theo dòng tự động gắn thẻ. Nếu họ thực sự có nghĩa NER, sau đó phản ứng này là hogwash :)

Với những hạn chế (600 mặt hàng/ngày, 100-200 ký tự/item) với các nguồn khác nhau, sau đây là một số tùy chọn gắn thẻ:

  1. Bằng tay. Một nhà phân tích có thể dễ dàng làm 600 trong số này mỗi ngày, có thể trong một vài giờ. Một cái gì đó như cơ khí của Amazon Turk, hoặc làm cho người dùng làm điều đó, cũng có thể là khả thi. Có một số "được gắn thẻ thủ công", ngay cả khi chỉ có 50 hoặc 100, sẽ là cơ sở tốt để so sánh bất kỳ phương pháp tự tạo nào bên dưới giúp bạn.

  2. Giảm mức độ tối thiểu, sử dụng LSA, Mô hình chủ đề (Phân bổ gián tiếp) và tương tự .... Tôi đã thực sự kém may mắn với LSA trên các tập dữ liệu trong thế giới thực và tôi không hài lòng với thống kê của nó nền tảng. LDA Tôi thấy tốt hơn nhiều, và có một số incredible mailing list có suy nghĩ tốt nhất về cách gán chủ đề cho văn bản.

  3. chẩn đoán đơn giản ... nếu bạn có các mục tin tức thực tế, sau đó khai thác cấu trúc của mục tin tức. Tập trung vào câu đầu tiên, tung ra tất cả các từ phổ biến (dừng từ) và chọn 3 danh từ tốt nhất từ ​​hai câu đầu tiên. Hoặc heck, lấy tất cả các danh từ trong câu đầu tiên, và xem nơi mà được bạn. Nếu các văn bản là tất cả bằng tiếng Anh, sau đó làm một phần của phân tích lời nói trên toàn bộ shebang, và xem những gì mà được bạn. Với các mục có cấu trúc, như báo cáo tin tức, LSA và các phương thức độc lập khác (tf-idf) đưa ra rất nhiều thông tin.

Chúc may mắn!

(nếu bạn thích câu trả lời này, có lẽ retag câu hỏi để phù hợp với nó)

+0

Cảm ơn bạn rất nhiều. Bạn nói đúng, tôi có nghĩa là tự động gắn thẻ. Nhưng tôi chắc chắn không muốn gắn thẻ bài viết theo cách thủ công (1). Phương pháp 3 là quá đơn giản và cho kết quả quá kém (đã thử điều này). Nhưng cách tiếp cận 2 âm thanh tốt và đây là những gì câu hỏi của tôi là về. ;) Tôi muốn tự động gắn thẻ (Tôi không sử dụng từ này, nhưng các từ khác có thể sai, có thể) các bài viết tin tức với LSA. LDA âm thanh tốt, quá, nhưng nó là một phương pháp để phân loại, không phải cho gắn thẻ tôi nghĩ. – caw

+0

LDA cũng hoạt động để gắn thẻ. Tất cả các kỹ thuật này là những nỗ lực để giảm kích thước (cơ sở) của không gian tài liệu. –

0

Có thêm thread SO về những nguy hiểm để làm điều này tất cả trong PHP tại link text.

Cụ thể, có một liên kết đến bài báo này trên Latent Semantic Mapping, mô tả cách nhận "chủ đề" kết quả cho văn bản.

+0

Câu hỏi bạn đã liên kết (liên kết đầu tiên) là một trong những câu hỏi của tôi. ;) Tôi cũng đã liên kết nó trong câu hỏi của tôi ở đầu trang này. Nhưng đó là về SVD, cái này ở đây là về LSA ... – caw

+0

SVD là một phần của LSA, và trong đó thảo luận SO. Nhìn vào Blackkettles trả lời. Bạn làm SVD, giảm ma trận eigenvalue, sau đó kết hợp lại. Đọc giấy LSM, nó có các bước. Tôi nghĩ bạn đặt nhiều niềm tin hơn vào LSM để giải quyết vấn đề này, hơn là thực sự được bảo hành cho dự án tự động gắn thẻ của bạn. –

Các vấn đề liên quan