programming - r studio




কিভাবে স্টেনিংস মধ্যে Levenshtein দূরত্ব গণনা করা অপারেশন জানেন? (2)

ফাংশন stringdist , আমি স্ট্রিংগুলির মধ্যে stringdist দূরত্বটি গণনা করতে পারি: এটি অন্য একটি স্ট্রিং ঘুরিয়ে প্রয়োজনীয় মুছে ফেলার সংখ্যা, সন্নিবেশ এবং প্রতিস্থাপনের সংখ্যা গণনা করে। উদাহরণস্বরূপ, stringdist("abc abc","abcd abc") = 1 কারণ দ্বিতীয় স্ট্রিংয়ে "d" ঢোকানো হয়েছে।

দুই স্ট্রিংগুলির মধ্যে লেভেনশেটিন দূরত্বটি পেতে অপারেশনগুলি জানা কি সম্ভব? অন্যথায় 2 টি স্ট্রিংগুলির মধ্যে আলাদা অক্ষরগুলি জানতে হবে (এই উদাহরণে, কেবল "ডি")? ধন্যবাদ।

library(stringdist)
stringdist("abc abc","abcde acc") = 3

আমি জানতে চাই যে:

  • "ডি" ঢোকানো হয়

  • "ই" ঢোকানো হয়েছে

  • "বি" প্রতিস্থাপিত হয় "গ"

অথবা আরো সহজভাবে, আমি তালিকাটি চাই ("ডি", "ই", "সি")।


Tmfmnk এর উত্তরটি তৈরি করা এবং "ট্রাফস" বৈশিষ্ট্যটির সাথে প্রায়শই খেলার প্রস্তাব, এখানে একটি ফাংশন যা আপনাকে সন্নিবেশ করা বা প্রতিস্থাপিত সমস্ত অক্ষরের একটি টেবিল দেখাবে এবং কতবার কতবার সন্নিবেশ করা হয়েছিল এবং প্রতিস্থাপিত হয়েছে। যদি আপনি all_actions = T সেট করেন all_actions = T এটি আপনাকে মেলে দেখাবে।

f <- function(x, y, all_actions = FALSE){
  o <- adist(x, y, count = TRUE)
  cva <- 
    list(char = strsplit(y, '')[[1]], 
         action = strsplit(attr(o,"trafos"), '')[[1]])
  if(!all_actions)
    cva <- lapply(cva, '[', cva$action %in% c('I', 'S'))
  do.call(table, cva)
}

f(x = "abc abc", y = "abcde acc")
#     action
# char I S
#    c 0 1
#    d 1 0
#    e 1 0

f(x = "abc abc", y = "abcde acc", all_actions = T)
#     action
# char I M S
#      0 1 0
#    a 0 2 0
#    b 0 1 0
#    c 0 2 1
#    d 1 0 0
#    e 1 0 0

এই সুডম্যান-Wunsch অ্যালগরিদম হিসাবে পরিচিত হয়। এটি দুই স্ট্রিংগুলির পাশাপাশি তথাকথিত ট্রেসব্যাকের মধ্যে উভয় দূরত্বকে গণনা করে, যা আপনাকে সারিবদ্ধকরণ পুনর্গঠন করতে দেয়।

যেহেতু জৈবিক ক্রমগুলির তুলনা করার সময় এই সমস্যাগুলি বেশিরভাগ ক্ষেত্রে জীববিজ্ঞানে ফসল উৎপন্ন হয়, তাই এই অ্যালগরিদম (এবং সম্পর্কিত বেশী) R প্যাকেজ {Biostrings} প্রয়োগ করা হয় যা Bioconductor অংশ।

যেহেতু এই প্যাকেজ প্রয়োগগুলি সাধারণ লেভেনশেটিন দূরত্বের তুলনায় আরও সাধারণ সমাধান, দুর্ভাগ্যবশত দুর্ভাগ্যজনকভাবে ব্যবহার জটিল, এবং ব্যবহার উইজেটটি সামঞ্জস্যপূর্ণভাবে দীর্ঘ। কিন্তু আপনার উদ্দেশ্যগুলির জন্য মৌলিক ব্যবহার নিম্নরূপ:

library(Biostrings)

dist_mat = diag(27L)
colnames(dist_mat) = rownames(dist_mat) = c(letters, ' ')

result = pairwiseAlignment(
    "abc abc", "abcde acc",
    substitutionMatrix = dist_mat,
    gapOpening = 1, gapExtension = 1
)

এটি কেবল আপনাকে তালিকা c('b', 'c', 'c') প্রদান করবে না, কারণ, যে তালিকাটি আসলে এখানে ঘটেছে তা সম্পূর্ণরূপে উপস্থাপিত করে না। পরিবর্তে, এটি দুটি স্ট্রিংগুলির মধ্যে একটি সারিবদ্ধতা ফেরত দেবে। এই প্রতিস্থাপন এবং ফাঁক সঙ্গে একটি ক্রম হিসাবে প্রতিনিধিত্ব করা যেতে পারে:

score(result)
# [1] 3
aligned(result)
as.matrix(aligned(result))
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
# [1,] "a"  "b"  "c"  "-"  "-"  " "  "a"  "b"  "c"
aligned(result)

- দ্বিতীয় স্ট্রিং প্রতিটি অক্ষর জন্য এটি মূল স্ট্রিং মধ্যে সংশ্লিষ্ট অক্ষর প্রদান করে, সন্নিবেশকৃত অক্ষর প্রতিস্থাপন - । মূলত, প্রথম স্ট্রিংটি দ্বিতীয় স্ট্রিং রূপান্তরিত করার জন্য এটি "রেসিপি"। মনে রাখবেন এটি কেবল সন্নিবেশ এবং প্রতিস্থাপন, মুছে ফেলা হবে না। এইগুলি পেতে, আপনাকে অন্য উপায়ে সারিবদ্ধকরণ সম্পাদন করতে হবে (অর্থাত্ স্ট্রিং আর্গুমেন্টগুলি সোয়াপিং)।





stringdist