Cara menggunakan sequencematcher in python

String is an interesting topic in programming. We use so many methods and build-in functions to program strings. SequenceMatcher class is one of them. With the help of SequenceMatcher we can compare the similarity of two strings by their ratio. For this, we use a module named “difflib”. By this, we import the sequence matcher class and put both of the strings into it.

We can use only two strings where it compares string two with string 1 and shows the ration of how string two is similar to string one. It is a better idea to compare two strings with a few lines of code. The idea behind this is to find the longest matching subsequence which should be continued and compare it with full string and then get the ration as output.

#import the class
from difflib import SequenceMatcher
s1 = "gun" 
s2 = "run"
sequence = SequenceMatcher(a=s1 , b=s2) #comparing both the strings
print(sequence.ratio())

output:0.6666666666666666

This “difflib” class also provides some extra features. But two features are mostly used for programs first one is get_close_matches and differ.

With get_close_matches we compare a particular list of string elements with a given string and find out those strings who are close to the given cutoff. The below code will explain this very well.

from difflib import SequenceMatcher , get_close_matches
s1 = "abcdefg"
list_one = ["abcdefghi" , "abcdef" , "htyudjh" , "abcxyzg"]
match = get_close_matches(s1,list_one , n=2 , cutoff=0.6)
print(match)

output:

['abcdef' , 'abcdefghi']

In the get_close_matches class I am defining four things:

s1 : Takes the string s1

list1: Takes the list list1

n : How many strings I want in my output it can be any number but should be less than total elements in the list.

cutoff: Defining how much ratio I want between them.

There is another important method we use of this module named differ.

Differ compare two texts which contain some sentences and give common sentences in output. Let me explain in the code.

from difflib import Differ
text1 = '''
hello world!
i like python and code in it.'''.splitlines()
text2 = '''
hello world!
i like java and coding'''.splitlines()
dif = Differ()
df = list(dif.compare(text1 , text2))

from pprint import pprint
pprint(df)

output:

[' ', ' hello world!',

'- i like python and code in it.',

'+ i like java and coding']

Here in output, We can see “hello world!” is common in both the strings, So it is printing only one time. But the rest of the content is different so it is printing separately.

SequenceMatcher class is mostly used for comparing two string. Which comes in many programming challenges. Even it reduces the time complexity and makes the code more efficient.

We have existing solution for this problem please refer Print the longest common substring link. We will solve problem in python using SequenceMatcher.find_longest_match() method.

How SequenceMatcher.find_longest_match(aLow,aHigh,bLow,bHigh) method works ?

First we initialize SequenceMatcher object with two input string str1 and str2, find_longest_match(aLow,aHigh,bLow,bHigh) takes 4 parameters aLow, bLow are start index of first and second string respectively and aHigh, bHigh are length of first and second string respectively. find_longest_match() returns named tuple (i, j, k) such that a[i:i+k] is equal to b[j:j+k], if no blocks match, this returns (aLow, bLow, 0).

Implementation:

Python3




# Function to find Longest Common Sub-string

 

from difflibimport SequenceMatcher

 

def longestSubstring(str1,str2):

 

     

Geeks
0

     

Geeks
2

     

Geeks
4
Geeks
5
Geeks
6
Geeks
7
Geeks
8

 

     # Function to find Longest Common Sub-string0

     # Function to find Longest Common Sub-string2

     # Function to find Longest Common Sub-string4

Geeks
5 # Function to find Longest Common Sub-string6# Function to find Longest Common Sub-string7# Function to find Longest Common Sub-string8# Function to find Longest Common Sub-string9from0# Function to find Longest Common Sub-string7# Function to find Longest Common Sub-string8# Function to find Longest Common Sub-string9from4

Artikel ini akan membahas panduan menggunakan modul “difflib” dengan Python. Modul difflib dapat digunakan untuk membandingkan dua objek Python dari tipe tertentu dan melihat persamaan atau perbedaan di antara keduanya. Semua contoh kode dalam artikel ini diuji dengan Python 3.9.5 di Ubuntu 21.04.

Tentang Modul Difflib

Modul difflib, seperti namanya, dapat digunakan untuk menemukan perbedaan atau “diff” antara konten file atau objek Python hashable lainnya. Ini juga dapat digunakan untuk menemukan rasio yang menunjukkan tingkat kesamaan antara dua objek. Penggunaan modul difflib dan fungsinya dapat dipahami dengan baik melalui contoh. beberapa dari mereka terdaftar di bawah ini.

Tentang Objek Python yang Dapat Di-hash

Dalam Python, tipe objek yang nilainya tidak mungkin berubah atau sebagian besar tipe objek yang tidak dapat diubah disebut tipe hashable. Objek tipe hashable memiliki nilai tetap tertentu yang ditetapkan oleh Python selama deklarasi dan nilai-nilai ini tidak berubah selama masa pakainya. Semua objek hashable di Python memiliki metode “__hash__”. Lihat contoh kode di bawah ini:

number = 6
print (type(number))
print (number.__hash__())

word = "something"
print (type(word))
print (word.__hash__())

dictionary = {"a" : 1, "b": 2}
print (type(dictionary))
print (dictionary.__hash__())

Setelah menjalankan contoh kode di atas, Anda akan mendapatkan output berikut:

6

2168059999105608551

Traceback (most recent call last):
  File "/main.py", line 13, in
    print (dictionary.__hash__())
TypeError: 'NoneType' object is not callable

Contoh kode mencakup tiga tipe Python: objek tipe integer, objek tipe string, dan objek tipe kamus. Keluaran menunjukkan bahwa ketika memanggil metode “__hash__”, objek tipe integer dan objek tipe string menunjukkan nilai tertentu, sedangkan objek tipe kamus melontarkan error karena tidak memiliki metode yang disebut “__hash__”. Oleh karena itu tipe integer atau tipe string adalah objek hashable dalam Python sedangkan tipe kamus tidak. Anda dapat mempelajari lebih lanjut tentang objek hashable dari sini.

Membandingkan Dua Objek Python yang Dapat Di-hash

Anda dapat membandingkan dua tipe atau urutan hashable menggunakan kelas “Differ” yang tersedia di modul difflib. Lihat contoh kode di bawah ini.

from difflib import Differ

line1 = "abcd"
line2 = "cdef"
d = Differ()
difference = list(d.compare(line1, line2))
print (difference)

Pernyataan pertama mengimpor kelas Differ dari modul difflib. Selanjutnya, dua variabel tipe string didefinisikan dengan beberapa nilai. Sebuah instance baru dari kelas Differ kemudian dibuat sebagai “d”. Dengan menggunakan instance ini, metode “bandingkan” kemudian dipanggil untuk menemukan perbedaan antara string “baris1” dan “baris2”. String ini disediakan sebagai argumen untuk metode perbandingan. Setelah menjalankan contoh kode di atas, Anda akan mendapatkan output berikut:

['- a', '- b', '  c', '  d', '+ e', '+ f']

Tanda hubung atau tanda minus menunjukkan bahwa “baris2” tidak memiliki karakter ini. Karakter tanpa tanda atau spasi putih di depan umum untuk kedua variabel. Karakter dengan tanda plus hanya tersedia di string “line2”. Untuk keterbacaan yang lebih baik, Anda dapat menggunakan karakter baris baru dan metode “bergabung” untuk melihat output baris demi baris:

from difflib import Differ

line1 = "abcd"
line2 = "cdef"
d = Differ()
difference = list(d.compare(line1, line2))
difference = 'n'.join(difference)
print (difference)

Setelah menjalankan contoh kode di atas, Anda akan mendapatkan output berikut:

- a
- b
  c
  d
+ e
+ f

Alih-alih kelas Differ, Anda juga dapat menggunakan kelas “HtmlDiff” untuk menghasilkan output berwarna dalam format HTML.

from difflib import HtmlDiff

line1 = "abcd"
line2 = "cdef"
d = HtmlDiff()
difference = d.make_file(line1, line2)
print (difference)

Contoh kodenya sama seperti di atas, kecuali bahwa instance kelas Differ telah digantikan oleh turunan kelas HtmlDiff dan alih-alih metode perbandingan, Anda sekarang memanggil metode “make_file”. Setelah menjalankan perintah di atas, Anda akan mendapatkan beberapa output HTML di terminal. Anda dapat mengekspor output ke file menggunakan simbol “>” di bash atau Anda dapat menggunakan contoh kode di bawah ini untuk mengekspor output ke file “diff.html” dari Python itu sendiri.

from difflib import HtmlDiff

line1 = "abcd"
line2 = "cdef"
d = HtmlDiff()
difference = d.make_file(line1, line2)
with open("diff.html", "w") as f:
    for line in difference.splitlines():
        print (line, file=f)

Pernyataan “with open” dalam cara “w” membuat file “diff.html” baru dan menyimpan seluruh isi variabel “difference” ke fi
le diff.html. Saat Anda membuka file diff.html di browser, Anda akan mendapatkan tata letak yang mirip dengan ini:

Cara menggunakan sequencematcher in python

Mendapatkan Perbedaan Antara Isi Dua File

Jika Anda ingin menghasilkan data yang berbeda dari isi dua file menggunakan metode Differ.compare(), Anda dapat menggunakan pernyataan “dengan terbuka” dan metode “readline” untuk membaca isi file. Contoh di bawah mengilustrasikan hal ini di mana konten “file1.txt” dan “file2.txt” dibaca menggunakan pernyataan “dengan terbuka”. Pernyataan “dengan terbuka” digunakan untuk membaca data dari file dengan aman.

from difflib import Differ

with open ("file1.txt") as f:
    file1_lines = f.readlines()
with open ("file2.txt") as f:
    file2_lines = f.readlines()
d = Differ()
difference = list(d.compare(file1_lines, file2_lines))
difference = 'n'.join(difference)
print (difference)

Kodenya cukup mudah dan hampir sama dengan contoh yang ditunjukkan di atas. Dengan asumsi bahwa “file1.txt” berisi karakter “a”, “b”, “c”, dan “d” masing-masing pada baris baru dan “file2.txt” berisi “c”, “d”, “e”, dan karakter “f” masing-masing pada baris baru, contoh kode di atas akan menghasilkan output sebagai berikut:

- a

- b

  c

- d
+ d

+ e

+ f

Outputnya hampir sama dengan sebelumnya, tanda “-” mewakili garis yang tidak ada di file kedua. Tanda “+” menunjukkan baris yang hanya ada di file kedua. Garis tanpa tanda atau memiliki kedua tanda adalah umum untuk kedua file.

Menemukan Rasio Kesamaan

Anda dapat menggunakan kelas “sequenceMatcher” dari modul difflib untuk menemukan rasio kesamaan antara dua objek Python. Rentang rasio kesamaan terletak antara 0 dan 1 dimana memiliki nilai 1 menunjukkan kecocokan yang tepat atau kesamaan maksimum. Nilai 0 menunjukkan objek yang benar-benar unik. Lihat contoh kode di bawah ini:

6

2168059999105608551

Traceback (most recent call last):
  File "/main.py", line 13, in
    print (dictionary.__hash__())
TypeError: 'NoneType' object is not callable
0

Instance SequenceMatcher telah dibuat dengan objek untuk dibandingkan yang diberikan sebagai argumen “a” dan “b”. Metode “rasio” kemudian dipanggil ke instance untuk mendapatkan rasio kesamaan. Setelah menjalankan contoh kode di atas, Anda akan mendapatkan output berikut:

6

2168059999105608551

Traceback (most recent call last):
  File "/main.py", line 13, in
    print (dictionary.__hash__())
TypeError: 'NoneType' object is not callable
1

Kesimpulan

Modul difflib dalam Python dapat digunakan dalam berbagai cara untuk membandingkan data dari objek hashable yang berbeda atau konten yang dibaca dari file. Metode rasionya juga berguna jika Anda hanya ingin mendapatkan persentase kesamaan antara dua objek.