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_merge
và array_unique
để tìm liên kết.
Hy vọng điều này sẽ hữu ích!
Thực sự phụ thuộc vào những gì bạn định xác định là "cụm từ" –
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). –
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