Nhờ trích xuất giúp các dòng gần giống nhau trong file text

Cái này mới đầu mình nghĩ là dễ nhưng sau khi viết code thì hoá ra là chạy cứ lung tung beng cả lên, quá chậm hoặc ra kết quả không mong đợi. Nhờ mọi người vào hỗ trợ xem làm cách nào cho đơn giản, chính xác.

Yêu cầu của đề bài xem ra đơn gỉản: trích xuất những đoạn mà các dòng giống nhau ra mảng / hoặc file / in ra màn hình kiểm tra để sau đó xử lý.

Gỉả sử đã có hàm similar_text trong PHP hoặc tương đương để quyết định thế nào là hai dòng text “gần giống nhau” và file text là lưu các chuỗi tiếng Việt có dấu, được đọc vào một mảng để xử lý.

Ý tưởng giải thuật của mình (cài đặt với PHP) là dùng vòng for hoặc while duyệt xuôi mảng, khi gặp trường hợp:

similar_text($line[$i], $line[$i+1], $ratio);

Nếu $ratio >= 90 thì chạy một vòng lặp khác duyệt ngược mảng và tìm chỗ cũng có ratio >=90, sau đó thì ta có được chỉ số (vị trí trong mảng) bắt đầu phân đoạn và kết đoạn các dòng giống nhau và trích ra thành một mảng con để sau đó in ra màn hình hoặc viết ra file.

Cuối cùng thì mình không làm sao chạy cho giống kết quả như trên hình hết. Nhờ các bạn vào phụ cho một tay.

Mình bổ sung: dữ liệu đã được sắp xếp để các dòng gần giống nhau đã nằm liền kề nhau rồi các bạn nhé.

Nếu các bạn viết OpCode hoặc cài đặt bằng PHP càng tốt nhé các bạn. À, những dòng tô vàng trên hình dữ liệu minh hoạ được xem là “gần giống nhau” theo như mình muốn nhé các bạn (và xin lỗi các bạn là thực sự những dòng trên không phải là tên bài hát,mà chỉ là dữ liệu minh hoạ ngẫu nhiên).

Xin cám ơn mọi người!

không biết có đúng ý a không ạ?

function filter($songs = array()){
  $result = array();
  $sub_songs = array();
  for($i = 0; $i < count($songs); $i++){
    $sub_songs[] = $songs[$i];
    $ratio = 0;
    if($i < count($songs) - 1){
      similar_text($songs[$i], $songs[$i+1], $ratio);
    }
    if($ratio < 90){
      if(count($sub_songs) > 1){
        $result[] = $sub_songs;
      }
      $sub_songs = array();
    }
  }
  return $result;
}

Nhưng sao chỉ xét $line[$i] với $line[$i+1] thôi ạ?

1 Like

Dữ liệu thực tế có được sắp xếp ngay ngắn như minh hoạ chưa ? Sao bài toán gì hay vậy mà mà lại được sort lẫn có hàm compare chuỗi hết vậy cà?

cat | grep “”

Dữ liệu được sắp xếp rồi bạn à, chứ không phải để lẫn lộn đâu - để như vậy hơi bị mệt, phải duyệt mảng và “chọc lỗ” thì đuối lắm. Mình quên ghi nhưng có lẽ nhìn bảng minh họa thì nhiều người sẽ hiểu nó đã được sắp xếp.

À, không phải chỉ xét $line[$i] với $line[$i+1] thôi, mà là ý của mình là để tìm được điểm khởi đầu của việc (đoạn) mà có ít nhất 2 dòng text gần giống nhau thì phải xét dòng hiện tại và dòng kề nó khi ta dung vòng lặp, hai dòng đó mang so sánh với nhau, gần giống nhau rồi thì mới tính tiếp - còn nếu không giống thì đi tiếp. Chứ còn không thì làm cách nào khác mình chưa nghĩ ra.

Hàm bạn viết chạy tốt. Cám ơn bạn rất nhiều.

Mình cũng viết gần giống bạn nhưng chạy không ra vì mình dốt ở chỗ không có count($sub_songs) > 1 nên gãy. Lúc rảnh sẽ đưa code lên để ai tò mò muốn chay thử xem thì có thể lấy chạy, cũng là một trò vui.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?