2010-10-13 32 views
6

Tôi đang thiết lập hộp "chủ đề thịnh hành" theo phong cách Twitter cho diễn đàn của mình. Tôi đã có những từ// từ phổ biến nhất, nhưng thậm chí không thể bắt đầu nghĩ cách tôi sẽ nhận các cụm từ phổ biến như Twitter.Làm cách nào để có được các cụm từ phổ biến nhất từ ​​nhiều văn bản?

Vì nó là viết tắt của tôi, tôi chỉ nhận được tất cả nội dung của 200 bài đăng cuối cùng thành một chuỗi và chia thành các từ, sau đó sắp xếp theo từ nào được sử dụng nhiều nhất. Làm thế nào tôi có thể biến từ này thành những từ phổ biến nhất thành các cụm từ phổ biến nhất?

+0

Thực sự phụ thuộc vào những gì bạn định xác định là "cụm từ" –

+0

Làm thế nào về việc dán hai/ba/bốn từ lại với nhau? Nó vẫn sẽ là O (n). –

+0

tôi không nghĩ rằng bạn sẽ tìm thấy câu trả lời của bạn trên một vài dòng mã trên stackoverflow .. vấn đề này là một chủ đề luận án có thể liên quan đến ngữ nghĩa web – pleasedontbelong

Trả lời

2

Một kỹ thuật bạn có thể xem xét là sử dụng ZSET trong Redis cho một cái gì đó như thế này. Nếu bạn đã có bộ rất lớn dữ liệu, bạn sẽ thấy rằng bạn có thể làm một cái gì đó như thế này:

$words = explode(" ", $input); // Pseudo-code for breaking a block of data into individual words. 
$word_count = count($words); 

$r = new Redis(); // Owlient's PHPRedis PECL extension 
$r->connect("127.0.0.1", 6379); 

function process_phrase($phrase) { 
    global $r; 
    $phrase = implode(" ", $phrase); 
    $r->zIncrBy("trending_phrases", 1, $phrase); 
} 

for($i=0;$i<$word_count;$i++) 
    for($j=1;$j<$word_count - $i;$j++) 
     process_phrase(array_slice($words, $i, $j)); 

Để lấy các cụm từ đầu, bạn muốn sử dụng này:

// Assume $r is instantiated like it is above 
$trending_phrases = $r->zReverseRange("trending_phrases", 0, 10); 

$trending_phrases sẽ là một trong mười cụm từ xu hướng hàng đầu. Để làm những việc như cụm từ xu hướng gần đây (trái với cụm từ toàn cầu, liên tục), hãy sao chép tất cả tương tác Redis ở trên. Đối với mỗi tương tác, hãy sử dụng khóa chỉ dẫn, dấu thời gian của ngày hôm nay và dấu thời gian của ngày mai (ví dụ: ngày kể từ ngày 1 tháng 1 năm 1970). Khi truy xuất kết quả với $trending_phrases, chỉ cần truy xuất cả khóa hôm nay và ngày mai (hoặc ngày hôm qua) và sử dụng array_mergearray_unique để tìm liên kết.

Hy vọng điều này sẽ hữu ích!

1

Thay vì tách từng từ riêng biệt, hãy chia nhỏ các cụm từ riêng lẻ, đơn giản như vậy.

$popular = array(); 

foreach ($tweets as $tweet) 
{ 
    // split by common punctuation chars 
    $sentences = preg_split('~[.!?]+~', $string); 

    foreach ($sentences as $sentence) 
    { 
     $sentence = strtolower(trim($sentence)); // normalize sentences 

     if (isset($popular[$sentence]) === false) 
     //if (array_key_exists($sentence, $popular) === false) 
     { 
      $popular[$sentence] = 0; 
     } 

     $popular[$sentence]++; 
    } 
} 

arsort($popular); 

echo '<pre>'; 
print_r($popular); 
echo '</pre>'; 

Nó sẽ chậm hơn rất nhiều nếu bạn xem xét một cụm từ như một tập hợp của n lời liên tiếp.

+0

Như một vấn đề về hiệu suất, 'mảng_key_exists ($ câu, $ phổ biến)! == true' là một thứ tự toàn bộ độ lớn chậm hơn'! Isset ($ phổ biến [$ câu]) '. Trong tình huống này, sự khác biệt chức năng là không quan trọng. – mattbasta

+0

@mattbasta: Thật vậy. Tuy nhiên, một đơn đặt hàng của cường độ chậm hơn? Như trong 10x chậm hơn? Bạn có điểm chuẩn nào cho thấy những kết quả này không? –

+0

Tôi không có tiện dụng, nhưng tôi đã có kinh nghiệm với mảng lớn hơn (1000+ yếu tố) mà 'isset' sẽ mất trong vòng 50ms,' array_key_exists' có thể mất đến 300-400ms. – mattbasta

1

Im không chắc chắn về loại câu trả lời bạn đang tìm kiếm nhưng Laconica:

http://status.net/?source=laconica

là một nguồn twitter bản sao mở (một phiên bản đơn giản hơn nhiều).

Có thể bạn có thể sử dụng một phần mã để tạo các trích dẫn phổ biến của riêng mình?

Chúc may mắn!

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