Điểm tương tự chuỗi ma trận


8

Tôi có một tải tài liệu, trong đó có tải các cặp giá trị khóa trong đó. Khóa có thể không phải là duy nhất nên có thể có nhiều khóa cùng loại với các giá trị khác nhau.

Tôi muốn so sánh sự giống nhau của các phím giữa 2 tài liệu. Cụ thể hơn là sự tương tự chuỗi của các giá trị này. Tôi đang nghĩ đến việc sử dụng một cái gì đó giống như Thuật toán Smith-Waterman để so sánh sự giống nhau.

Vì vậy, tôi đã vẽ một bức tranh về cách tôi nghĩ về việc thể hiện dữ liệu -

nhập mô tả hình ảnh ở đây

Các giá trị trong các ô là kết quả của thuật toán smith-waterman (hoặc một số số liệu tương tự chuỗi khác).

Hình ảnh mà ma trận này đại diện cho một loại "vật" quan trọng sau đó tôi cần thêm điểm tương tự "thứ" vào một vectơ 0 hoặc 1. Điều đó ok.

Điều tôi không thể hiểu là làm thế nào tôi xác định được ma trận tương tự hay không tương tự - lý tưởng là tôi muốn chuyển đổi ma trận thành một số trong khoảng từ 0 đến 1 và sau đó tôi sẽ chỉ đặt một ngưỡng để ghi điểm là 0 hoặc 1.

Bất kỳ ý tưởng làm thế nào tôi có thể tạo ra một số điểm của ma trận? Có ai biết bất kỳ thuật toán nào thực hiện loại điều này không (rõ ràng những thứ như cách thợ rèn hoạt động là loại áp dụng).


2
Có thể dễ dàng hơn để trả lời câu hỏi của bạn nếu bạn đưa ra một ví dụ về ma trận mà bạn sẽ xem xét tương tự như đầu tiên, và giải thích những phẩm chất mà bạn đang tìm kiếm về sự tương đồng. Hoặc nếu có một mục tiêu chung ở đây, nhiệm vụ bạn muốn hoàn thành là gì?
Không khí

Vâng, tôi muốn xem một ví dụ về việc 1 sẽ trông như thế nào và 0 sẽ như thế nào.
Ben

Câu trả lời:


2

Theo tôi hiểu, Tài liệu 1 và Tài liệu 2 có thể có số lượng khóa khác nhau. Và bạn di chuyển để có được đánh giá tương tự cuối cùng trong khoảng từ 0 đến 1. Nếu vậy, tôi sẽ đề xuất thuật toán sau:

  1. Tổng tối đa. vals bằng 0.
  2. Chọn giá trị tối đa từ ma trận doc-doc và thêm nó vào Sum of max. vals.
  3. Xóa hàng và cột có giá trị tối đa khỏi ma trận.
  4. Lặp lại các bước 2-3 cho đến khi hàng hoặc cột kết thúc.
  5. Mệnh giá tổng của max. vals theo số lượng trung bình của các từ khóa trong hai văn bản.

Ước tính cuối cùng sẽ bằng 1, nếu cả hai tài liệu có độ dài giống hệt nhau và mọi từ trong Tài liệu 1 đều có giá trị tương đương trong Tài liệu 2.

Bạn chưa đề cập đến phần mềm, bạn đang sử dụng, nhưng đây là ví dụ R về chức năng, tính toán sự giống nhau như vậy (nó lấy đối tượng của ma trận lớp làm đầu vào):

eval.sim <- function(sim.matrix){
  similarity <- 0
  denominator <- sum(dim(sim.matrix)) / 2
  for(i in 1:(min(c(nrow(sim.matrix), ncol(sim.matrix))) - 1)){
    extract <- which(sim.matrix == max(sim.matrix), arr.ind=T)[1, ]
    similarity <- similarity + sim.matrix[extract[1], extract[2]]
    sim.matrix <- sim.matrix[-extract[1], -extract[2]]
  }
  similarity <- similarity + max(sm.copy)
  similarity <- similarity / denominator
}

Trong trăn -

import numpy as np

def score_matrix(sim_matrix):
    similarity = 0
    denominator = sum(sim_matrix.shape) / 2
    for i in range(min(sim_matrix.shape)):
        x, y = np.where(sim_matrix == np.max(sim_matrix))[0][0], np.where(sim_matrix == np.max(sim_matrix))[1][0]
        similarity += sim_matrix[x, y]
        sim_matrix = np.delete(sim_matrix,(x),axis=0)
        sim_matrix = np.delete(sim_matrix,(y),axis=1)
    return similarity / denominator

Điều này có vẻ hoạt động khá tốt ngoại trừ việc chia tỷ lệ các số trong khoảng từ 0 đến 1. Không chắc chắn liệu phiên bản python có đúng như dự định không?
David

Tôi đã đơn giản hóa phiên bản python của bạn. Và có gì sai với tỉ lệ? Giả sử, tất cả các giá trị trong ma trận gốc nằm trong khoảng từ 0 đến 1, kết quả cũng phải có cùng tỷ lệ.
sobach

Không có gì sai với quy mô bây giờ ... Tôi phải có một lỗi trong mã của tôi. Cảm ơn sự giúp đỡ này hoạt động tuyệt vời trên tập dữ liệu của tôi
David

2

Nếu mục tiêu của bạn là biến đổi ma trận của bạn thành một số (thước đo tương tự của bạn), bạn có thể muốn sử dụng một định mức ma trận .

Chẳng hạn, sử dụng định mức Frobenius trong ví dụ của bạn sẽ trả về 1.488086.


Đúng, tôi đã quên về các tiêu chuẩn, tôi sẽ xem xét lời cảm ơn này.
David

0

Tôi nghĩ mục tiêu của bạn là tìm ra hai tài liệu giống nhau như thế nào, nếu đó là trường hợp tôi đề nghị áp dụng thuật toán sau:

Cách tiếp cận này đưa ra mức độ tương tự như Doc1 là wrt Doc2. (Các giá trị tương tự sẽ khác nhau đối với Doc2 wrt Doc1 nếu nó không phải là ma trận vuông)

  1. Trong ma trận của bạn giữa Doc1 và Doc2, Nhận hàng có giá trị tương tự tối đa theo từng hàng.
    1. Lấy tổng và chia cho số hàng
    2. Điều này sẽ cung cấp cho bạn các chỉ số tương tự. Ví dụ. Trong hình ảnh ma trận của bạn, tôi thấy hàng tương tự tối đa là: 0,88, 1, 0,6 Vì vậy (0,88 + 1 + 0,6) / 3 = 82,67%

Điều này có nghĩa là Doc2 tương tự 82,67% so với Doc1 . Sự giống nhau không thể vượt quá giá trị này vì chúng tôi đã chọn các mục tương tự tối đa trong mỗi hàng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.