দুটি স্ট্রিংয়ের মধ্যে মিলের মেট্রিকটি সন্ধান করুন


284

পাইথনের অন্য স্ট্রিংয়ের মতো স্ট্রিংয়ের সম্ভাবনা কীভাবে পাব?

আমি দশমিক মান যেমন 0.9 (যার অর্থ 90%) ইত্যাদি পেতে চাই etc. মানক পাইথন এবং লাইব্রেরি সহ।

যেমন

similar("Apple","Appel") #would have a high prob.

similar("Apple","Mango") #would have a lower prob.

6
আমি মনে করি না "সম্ভাব্যতা" এখানে বেশ সঠিক শব্দ। যে কোনও ইভেন্টে, স্ট্যাকওভারফ্লো
23৮২676767/২

1
আপনি যে শব্দটির সন্ধান করছেন তা হ'ল অনুপাত, সম্ভাবনা নয়।
ইনবার রোজ


2
বাক্যাংশটি 'সাদৃশ্য মেট্রিক' , তবে একাধিক সাদৃশ্য মেট্রিক রয়েছে (জ্যাকার্ড, কোসিন, হামিং, লেভেনশেইন ইত্যাদি) তাই আপনাকে কোনটি নির্দিষ্ট করতে হবে। বিশেষত আপনি স্ট্রিংয়ের মধ্যে একটি মিল মেট্রিক চান; @hbprotoss বেশ কয়েকটি তালিকাভুক্ত হয়েছে।
smci

উত্তর:


543

একটি অন্তর্নির্মিত আছে।

from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

এটি ব্যবহার করছি:

>>> similar("Apple","Appel")
0.8
>>> similar("Apple","Mango")
0.0

43
SequenceMatcherবনাম python-Levenshteinমডিউলটির তুলনা করে এই দুর্দান্ত উত্তরটি দেখুন । stackoverflow.com/questions/6690739/...
ssoler

1
আকর্ষণীয় নিবন্ধ এবং সরঞ্জাম: চেয়ারারড.সিয়েটগেইক.com/…
অ্যান্টনি পেরোট

7
আমি অত্যন্ত পুরো difflib ডক চেক আউট সুপারিশ করবে docs.python.org/2/library/difflib.html একটা হয় get_close_matchesসালে নির্মিত যদিও আমি পাওয়া sorted(... key=lambda x: difflib.SequenceMatcher(None, x, search).ratio(), ...)অধিক নির্ভরযোগ্য, কাস্টম সঙ্গে sorted(... .get_matching_blocks())[-1] > min_matchচেক
ThorSummoner

2
@ থারস্মমনার একটি খুব কার্যকর কার্য ( get_closest_matches) এর দিকে মনোযোগ এনেছে । এটি একটি সুবিধার ফাংশন যা আপনি যা খুঁজছেন তা হতে পারে, এ কেএ ডক্সটি পড়ে! আমার নির্দিষ্ট অ্যাপ্লিকেশনটিতে আমি খারাপ ইনপুট সরবরাহকারী ব্যবহারকারীর কাছে কিছু প্রাথমিক ত্রুটি পরীক্ষা / প্রতিবেদন করার চেষ্টা করছিলাম এবং এই উত্তরটি আমাকে তাদের কাছে সম্ভাব্য ম্যাচগুলি এবং "মিল" কী ছিল তা জানাতে সহায়তা করে। আপনার যদি get_closest_matches
সাদৃশ্যটি

এটি পুরোপুরি কাজ করে। সহজ এবং কার্যকর। থানকিউ :)
কার্তিক শ্রীনিবাসন

68

আমি মনে করি আপনি স্ট্রিংয়ের মধ্যে দূরত্ব বর্ণনা করার জন্য একটি অ্যালগরিদম খুঁজছেন। আপনি উল্লেখ করতে পারেন এখানে কিছু:

  1. হামিং দূরত্ব
  2. লেভেনস্টেইনের দূরত্ব
  3. ডামেরাউ – লেভেনস্টেইন দূরত্ব
  4. জারো ink উইঙ্কলারের দূরত্ব

46

সমাধান # 1: পাইথন অন্তর্নির্মিত

ডিফ্ল্লিব থেকে সিকোয়েন্সম্যাচার ব্যবহার করুন

পেশাদাররা : নেটিভ পাইথন গ্রন্থাগার, অতিরিক্ত প্যাকেজের দরকার নেই।
কনস : খুব সীমাবদ্ধ, স্ট্রিং মিলের জন্য আরও অনেক ভাল অ্যালগরিদম রয়েছে।

উদাহরণ :
>>> from difflib import SequenceMatcher
>>> s = SequenceMatcher(None, "abcd", "bcde")
>>> s.ratio()
0.75

সমাধান # 2: জেলিফিশ লাইব্রেরি

এটি ভাল কভারেজ এবং কয়েকটি সমস্যা সহ একটি খুব ভাল গ্রন্থাগার। এটি সমর্থন করে:
- লেভেনস্টেইন দূরত্ব
- ডামেরাউ-লেভেনস্টেইন দূরত্ব
- জারো দূরত্ব
- জারো-উইঙ্কলার দূরত্ব
- ম্যাচ রেটিং পদ্ধতির তুলনা
- হামিং দূরত্ব

পেশাদাররা : সহজেই ব্যবহারযোগ্য, সমর্থিত অ্যালগরিদমের ছাঁটাই, পরীক্ষিত।
কনস : নেটিভ লাইব্রেরি নয়।

উদাহরণ :

>>> import jellyfish
>>> jellyfish.levenshtein_distance(u'jellyfish', u'smellyfish')
2
>>> jellyfish.jaro_distance(u'jellyfish', u'smellyfish')
0.89629629629629637
>>> jellyfish.damerau_levenshtein_distance(u'jellyfish', u'jellyfihs')
1

26

Fuzzy Wuzzyএকটি প্যাকেজ যা অজগরে লেভেনস্টাইন দূরত্ব কার্যকর করে, কিছু সহায়ক ফাংশন সহ যেখানে আপনি দুটি স্বতন্ত্র স্ট্রিংকে অভিন্ন হিসাবে বিবেচনা করতে চাইতে পারেন। উদাহরণ স্বরূপ:

>>> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
    91
>>> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
    100

9

আপনি যেমন একটি ফাংশন তৈরি করতে পারেন:

def similar(w1, w2):
    w1 = w1 + ' ' * (len(w2) - len(w1))
    w2 = w2 + ' ' * (len(w1) - len(w2))
    return sum(1 if i == j else 0 for i, j in zip(w1, w2)) / float(len(w1))

তবে অনুরূপ ('আপেল', 'আপেল')
অনুরূপের

1
আপনার ফাংশন অন্য স্টিংয়ের বিপরীতে প্রদত্ত স্ট্রিংটির তুলনা করবে। আমি সর্বোচ্চ সাদৃশ্য অনুপাতের সাথে স্ট্রিংটি ফেরত দেওয়ার একটি উপায় চাই
সিকার

1
@ সালোলো কাস্ট্রো, আপাতত if self.similar(search_string, item.text()) > 0.80:কাজ করে। ধন্যবাদ,
সন্ধানকারী


6

বিল্টিনটি SequenceMatcherবড় ইনপুটটিতে খুব ধীর গতির হয়, কীভাবে এটি ডিফ ম্যাচ-প্যাচ দিয়ে করা যায় :

from diff_match_patch import diff_match_patch

def compute_similarity_and_diff(text1, text2):
    dmp = diff_match_patch()
    dmp.Diff_Timeout = 0.0
    diff = dmp.diff_main(text1, text2, False)

    # similarity
    common_text = sum([len(txt) for op, txt in diff if op == 0])
    text_length = max(len(text1), len(text2))
    sim = common_text / text_length

    return sim, diff

5

দ্রষ্টব্য, difflib.SequenceMatcher কেবল দীর্ঘতম মিলিত অনুষঙ্গটি সন্ধান করে, এটি প্রায়শই পছন্দ হয় না, উদাহরণস্বরূপ:

>>> a1 = "Apple"
>>> a2 = "Appel"
>>> a1 *= 50
>>> a2 *= 50
>>> SequenceMatcher(None, a1, a2).ratio()
0.012  # very low
>>> SequenceMatcher(None, a1, a2).get_matching_blocks()
[Match(a=0, b=0, size=3), Match(a=250, b=250, size=0)]  # only the first block is recorded

দুটি স্ট্রিংয়ের মধ্যে মিল খুঁজে পাওয়া বায়োইনফরম্যাটিকসে পেয়ারওয়াই সিকোয়েন্স অ্যালাইনমেন্টের ধারণার সাথে নিবিড়ভাবে সম্পর্কিত। এর জন্য বায়োপীথন সহ অনেক নিবেদিত গ্রন্থাগার রয়েছে । এই উদাহরণটি সুই উইলশ অ্যালগোরিদম প্রয়োগ করে :

>>> from Bio.Align import PairwiseAligner
>>> aligner = PairwiseAligner()
>>> aligner.score(a1, a2)
200.0
>>> aligner.algorithm
'Needleman-Wunsch'

পাইপথন স্ট্যান্ডার্ড লাইব্রেরির যে কোনও অংশের তুলনায় অনেকগুলি স্কোরিং স্কিম এবং অ্যালগরিদম পাওয়া যায় বলে বায়োপাইথন বা অন্য কোনও বায়োইনফরমেটিক্স প্যাকেজ ব্যবহার করা আরও নমনীয়। এছাড়াও, আপনি যা ঘটছে তা কল্পনা করার জন্য আপনি ম্যাচের ক্রমগুলি আসলে পেতে পারেন:

>>> alignment = next(aligner.align(a1, a2))
>>> alignment.score
200.0
>>> print(alignment)
Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-
|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-
App-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-el

0

আপনি বেশিরভাগ পাঠ্যের সাদৃশ্য পদ্ধতি এবং কীভাবে সেগুলি এই লিঙ্কের অধীনে গণনা করা হয় তা খুঁজে পেতে পারেন: https://github.com/luozhouyang/python-string-siversityity#python-string-s ورتهতা এখানে কয়েকটি উদাহরণ;

  • সাধারণীকরণ, মেট্রিক, মিল এবং দূরত্ব

  • (সাধারণীকৃত) মিল এবং দূরত্ব

  • মেট্রিক দূরত্ব

  • শিংলস (এন-গ্রাম) ভিত্তিক মিল এবং দূরত্ব
  • Levenshtein
  • নমনীয় লেভেনস্টাইন
  • ভারী লেভেনস্টাইন
  • Damerau-Levenshtein
  • অনুকূল স্ট্রিং প্রান্তিককরণ
  • Jaro-ভিঙ্কলারকে
  • দীর্ঘতম কমন সাবসেক্সেন্স
  • মেট্রিক দীর্ঘতম কমন সাবসেক্সেন্স
  • এন-গ্রাম
  • শিংল (এন-গ্রাম) ভিত্তিক অ্যালগরিদম
  • কিউ-গ্রাম
  • কোসিন মিল
  • জ্যাকার্ড সূচক
  • সোরেনসেন-ডাইস সহগ
  • ওভারল্যাপ সহগ (যেমন, সিজিমকিউইজ-সিম্পসন)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.