2011-11-02 28 views
7

Những gì tôi đang cố gắng thực hiện là một kết quả tìm kiếm "tầm thường" (như trong tiêu đề & mô tả ngắn), nhóm chúng thành các nhóm có ý nghĩa "chương trình trong PHP.Thư viện PHP cho cụm từ/NLP?

Sau nhiều giờ tìm kiếm và vô số tìm kiếm trên SO (mang lại kết quả thú vị như mọi khi, mặc dù không có gì hữu ích) Tôi vẫn không thể tìm thấy bất kỳ thư viện PHP nào có thể giúp tôi xử lý nhóm.

  • Có thư viện PHP nào mà tôi có thể đã bỏ lỡ không?
  • Nếu không, có bất kỳ PMNM nào xử lý phân cụm và có API phong nha không?
+3

Kết hợp chúng dựa trên nội dung gì? Một nhóm có ý nghĩa với bạn là gì? – netcoder

+0

Vui lòng xác định "các nhóm có ý nghĩa có tên". – hakre

+0

@netcoder: trong thư viện phân cụm mục đích chung, điều đó không quan trọng. Việc lựa chọn các tính năng nên xác định loại nhóm nào được tạo ra. –

Trả lời

4

Như thế này:

Sử dụng một danh sách các từ dừng, nhận được tất cả từ hoặc cụm từ không có trong từ dừng, đếm lần xuất hiện của mỗi, sắp xếp theo thứ tự giảm dần.

Các từ dừng cần phải là danh sách tất cả các thuật ngữ tiếng Anh thông dụng. Nó cũng phải bao gồm dấu chấm câu và trước tiên bạn sẽ cần phải đặt trước tất cả các dấu chấm câu là một từ riêng biệt, ví dụ: "Một cái gì đó, như thế này." -> "Một cái gì đó, như thế này." HOẶC, bạn chỉ có thể xóa tất cả dấu chấm câu.

$content=preg_replace('/[^a-z\s]/', '', $content); // remove punctuation 

$stopwords='the|and|is|your|me|for|where|etc...'; 
$stopwords=explode('|',$stopwords); 
$stopwords=array_flip($stopwords); 

$result=array(); $temp=array(); 
foreach ($content as $s) 
if (isset($stopwords[$s]) OR strlen($s)<3) 
{ 
if (sizeof($temp)>0) 
    { 
    $result[]=implode(' ',$temp); 
    $temp=array(); 
    }    
} else $temp[]=$s; 
if (sizeof($temp)>0) $result[]=implode(' ',$temp); 

$phrases=array_count_values($result); 
arsort($phrases); 

Bây giờ bạn có một mảng kết hợp theo tần suất các thuật ngữ xảy ra trong dữ liệu đầu vào của bạn.

Cách bạn muốn thực hiện các kết quả phù hợp tùy thuộc vào bạn và phụ thuộc phần lớn vào độ dài của các chuỗi trong dữ liệu đầu vào.

Tôi sẽ xem liệu có bất kỳ trong số 3 khóa mảng hàng đầu khớp với bất kỳ trong số 3 khóa hàng đầu từ bất kỳ khóa nào khác trong dữ liệu hay không. Đây là những nhóm của bạn.

Hãy cho tôi biết nếu bạn gặp bất kỳ sự cố nào với vấn đề này.

+0

Tôi quên đề cập đến strtolower() đầu tiên, mặc dù nó phải được rõ ràng. – Alasdair

2

"... nhóm chúng thành các nhóm có ý nghĩa" hơi mơ hồ, bạn sẽ cần cụ thể hơn.

Để bắt đầu, bạn có thể xem xét nhóm K-Means.

Có một cái nhìn tại trang này và trang web:

PHP/irInformation Retrieval and other interesting topics

EDIT: Bạn có thể thử một số dữ liệu khai thác chính mình bằng kết quả tìm kiếm tham khảo chéo với một cái gì đó giống như mở thư mục dmoz RDF bãi chứa dữ liệu và sau đó liệt kê các danh mục phù hợp.

EDIT2: Và đây là câu hỏi dmoz/category cũng đề cập đến "Tìm kiếm khuôn mặt"!

Dmoz/Monster algorithme to calculate count of each category and sub category?

+0

Cảm ơn, tôi đã tìm thấy rằng một đã… Trong khi một mã ví dụ đọc và tốt thú vị, nó xa là một thư viện. Đối với "nhóm có ý nghĩa", [tìm kiếm Yippy này (ghi nhớ những gì họ gọi là "đám mây")] (http://search.yippy.com/search?input-form=clusty-simple&v%3Asources=webplus-ns-aaf&v% 3Aproject = clusty & query = tham quan + munich) minh họa những gì tôi đang cố gắng triển khai khá tốt. – vzwick

+0

@vzwick: Ý bạn là ... faceting? – netcoder

+0

@vzwick Ah, trang web mẫu giải thích tất cả. Câu trả lời đơn giản là không - bạn sẽ không tìm thấy một thư viện để tự động làm điều đó cho bạn. – zaf

1

Nếu bạn chỉ làm điều này cho tiếng Anh, bạn có thể sử dụng WordNet: http://wordnet.princeton.edu/. Đó là một từ vựng được sử dụng rộng rãi trong nghiên cứu cung cấp, trong số những thứ khác, bộ từ đồng nghĩa cho các từ tiếng Anh. Khoảng cách ngắn nhất giữa hai từ sau đó có thể phục vụ như một số liệu tương tự để tự phân cụm như zaf được đề xuất.

Dường như có giao diện PHP tới WordNet tại đây: http://www.foxsurfer.com/wordnet/. Nó xuất hiện trong câu hỏi này: How to use word Net with php, nhưng tôi đã không thử nó. Tuy nhiên, giao tiếp với một công cụ dòng lệnh từ PHP chính mình là khả thi là tốt.

1

Bạn cũng có thể xem Programming Collective Intelligence (Chương 3: Khám phá nhóm) của Toby Segaran, chỉ sử dụng Python này. Tuy nhiên, bạn sẽ có thể thực hiện mọi thứ trong PHP khi bạn hiểu cách nó hoạt động.

Mặc dù nó không phải là PHP, dự án Carrot2 cung cấp một số công cụ phân cụm và có thể được tích hợp với Solr.

0

Đây có thể là cách tắt nhưng hãy kiểm tra OpenCalais. Họ có một dịch vụ web cho phép bạn vượt qua một khối văn bản và nó sẽ đưa bạn trở lại một phản ứng có thể phân tích những thứ được tìm thấy trong văn bản, chẳng hạn như địa điểm, con người, sự kiện, v.v. "đám mây" và cũng chọn kết quả để hiển thị.

Tôi đã sử dụng thư viện này một vài lần trong php và luôn dễ dàng làm việc với nó.

Một lần nữa, có thể không liên quan đến những gì bạn đang cố gắng làm. Có lẽ bạn có thể đăng một ví dụ về những gì bạn đang cố gắng để đạt được?

0

Nếu bạn có thể xác định trước các bộ lọc cho tìm kiếm mặt của bạn (các nhóm được đặt tên) thì nó sẽ dễ dàng hơn nhiều. Thay vì dựa vào thuật toán sử dụng đầu vào của người tìm kiếm hiện tại và kết quả cụ thể của họ để tạo danh sách bộ lọc, bạn sẽ sử dụng tổng hợp các tìm kiếm được thực hiện phổ biến nhất bởi tất cả người dùng và sau đó gắn thẻ kết quả với chúng nếu chúng khớp nhau.

Bạn sẽ kết thúc với một bảng (hoặc một cái gì đó) của URL trong một nhiều-nhiều tham gia vào một bảng thẻ, do đó, mỗi url kết quả có thể có một số thẻ thích hợp.

Khi người dùng tìm kiếm, bạn chỉ cần đối sánh tìm kiếm của họ với chỉ mục đầy đủ. Nhưng đối với các bộ lọc, bạn lấy các kết quả hàng đầu trong số các kết quả hiện tại.

Tôi sẽ làm việc trên các ví dụ truy vấn nếu bạn muốn.