[python] levenshtein

Viewer

copydownloadembedprintName: levenshtein
  1. import Levenshtein
  2. import xml.etree.ElementTree as ET
  3.  
  4. def compare_strings(string1, string2):
  5.     # Calculate Levenshtein distance
  6.     distance = Levenshtein.distance(string1, string2)
  7.     max_len = max(len(string1), len(string2))
  8.     # Calculate similarity ratio as 1 - (distance / max_length)
  9.     similarity_ratio = 1 - (distance / max_len)
  10.     return similarity_ratio * 100
  11.  
  12. def extract_text_from_xml(xml_string, excluded_tags=None):
  13.     root = ET.fromstring(xml_string)
  14.     text = {}
  15.     for elem in root.iter():
  16.         if excluded_tags and elem.tag in excluded_tags:
  17.             continue
  18.         if elem.tag not in text:
  19.             text[elem.tag] = []
  20.         if elem.text:
  21.             text[elem.tag].append(elem.text.strip())
  22.     return text
  23.  
  24. def read_file_content(file_path):
  25.     with open(file_path, 'r', encoding='utf-8') as file:
  26.         return file.read()
  27.  
  28. def comparaison(xml_file1, xml_file2, excluded_tags=None):
  29.     xml_content1 = read_file_content(xml_file1)
  30.     xml_content2 = read_file_content(xml_file2)
  31.     
  32.     text1 = extract_text_from_xml(xml_content1, excluded_tags)
  33.     text2 = extract_text_from_xml(xml_content2, excluded_tags)
  34.     
  35.     similarity_ratios = {}
  36.     for tag in text1:
  37.         if tag in text2:
  38.             text1_tag = ' '.join(text1[tag])
  39.             text2_tag = ' '.join(text2[tag])
  40.             similarity_ratios[tag] = compare_strings(text1_tag, text2_tag)
  41.         else:
  42.             similarity_ratios[tag] = 0.0
  43.     
  44.     # Calculate the average similarity ratio
  45.     fields_to_average = ['name', 'mail', 'affiliation']
  46.     total_ratio = sum(similarity_ratios[field] for field in fields_to_average)
  47.     average_ratio = total_ratio / len(fields_to_average)
  48.     similarity_ratios['auteurs'] = average_ratio
  49.    
  50.     del similarity_ratios['name']
  51.     del similarity_ratios['mail']
  52.     del similarity_ratios['affiliation']
  53.    
  54.     total_ratio = sum(similarity_ratios.values())
  55.     average_ratio = total_ratio / len(similarity_ratios)
  56.     similarity_ratios['total'] = average_ratio
  57.  
  58.     similarity_ratios['filename'] = xml_file1
  59.     desired_order = ['filename','preamble', 'titre', 'auteurs', 'introduction', 'abstract', 'conclusion', 'biblio', 'total']
  60.     ordered_dict = {key: similarity_ratios[key] for key in desired_order}
  61.     return ordered_dict

Editor

You can edit this paste and save as new:


File Description
  • levenshtein
  • Paste Code
  • 16 Apr-2024
  • 2.29 Kb
You can Share it: