calculate_score.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. """
  2. calculate_score
  3. """
  4. import os
  5. import re
  6. import json
  7. import scoring
  8. from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction
  9. from nltk.tokenize import word_tokenize
  10. from Levenshtein import distance
  11. class Scoring:
  12. """
  13. calculate_score
  14. """
  15. def __init__(self, result_path):
  16. """
  17. init
  18. """
  19. self.edit_distances = []
  20. self.bleu_scores = []
  21. self.sim_scores = []
  22. self.filenames = []
  23. self.score_dict = {}
  24. self.anntion_cnt = 0
  25. self.fw = open(result_path, "w+", encoding='utf-8')
  26. def simple_bleu_score(self, candidate, reference):
  27. """
  28. get bleu score
  29. """
  30. candidate_tokens = word_tokenize(candidate)
  31. reference_tokens = word_tokenize(reference)
  32. return sentence_bleu([reference_tokens], candidate_tokens, smoothing_function=SmoothingFunction().method1)
  33. def preprocess_string(self, s):
  34. """
  35. preprocess_string
  36. """
  37. sub_enter = re.sub(r'\n+', '\n', s)
  38. return re.sub(r' ', ' ', sub_enter)
  39. def calculate_similarity(self, annotion, actual, tool_type):
  40. """
  41. calculate_similarity
  42. """
  43. class_dict = {}
  44. edit_distances = []
  45. bleu_scores = []
  46. sim_scores = list()
  47. total_file = 0
  48. for filename in os.listdir(annotion):
  49. if filename.endswith('.md') and not filename.startswith('.'):
  50. total_file = total_file + 1
  51. with open(os.path.join(annotion, filename), 'r', encoding='utf-8') as file_a:
  52. content_a = file_a.read()
  53. self.anntion_cnt = self.anntion_cnt + 1
  54. filepath_b = os.path.join(actual, filename)
  55. if os.path.exists(filepath_b):
  56. with open(filepath_b, 'r', encoding='utf-8') as file_b:
  57. content_b = file_b.read()
  58. self.filenames.append(filename)
  59. edit_dist = distance(self.preprocess_string(content_b),self.preprocess_string(content_a)) / max(len(content_a), len(content_b))
  60. self.edit_distances.append(edit_dist)
  61. edit_distances.append(edit_dist)
  62. bleu_score = self.simple_bleu_score(content_b, content_a)
  63. bleu_scores.append(bleu_score)
  64. self.bleu_scores.append(bleu_score)
  65. score = scoring.score_text(content_b, content_a)
  66. sim_scores.append(score)
  67. self.sim_scores.append(score)
  68. class_dict[filename] = {"edit_dist": edit_dist, "bleu_score": bleu_score, "sim_score": score}
  69. self.score_dict[filename] = {"edit_dist": edit_dist, "bleu_score": bleu_score, "sim_score": score}
  70. else:
  71. print(f"File {filename} not found in actual directory.")
  72. class_average_edit_distance = sum(edit_distances) / len(edit_distances) if edit_distances else 0
  73. class_average_bleu_score = sum(bleu_scores) / len(bleu_scores) if bleu_scores else 0
  74. class_average_sim_score = sum(sim_scores) / len(sim_scores) if sim_scores else 0
  75. self.fw.write(json.dumps(class_dict, ensure_ascii=False) + "\n")
  76. ratio = len(class_dict)/total_file
  77. self.fw.write(f"{tool_type} extract ratio: {ratio}" + "\n")
  78. self.fw.write(f"{tool_type} Average Levenshtein Distance: {class_average_edit_distance}" + "\n")
  79. self.fw.write(f"{tool_type} Average BLEU Score: {class_average_bleu_score}" + "\n")
  80. self.fw.write(f"{tool_type} Average Sim Score: {class_average_sim_score}" + "\n")
  81. print (f"{tool_type} extract ratio: {ratio}")
  82. print (f"{tool_type} Average Levenshtein Distance: {class_average_edit_distance}")
  83. print (f"{tool_type} Average BLEU Score: {class_average_bleu_score}")
  84. print (f"{tool_type} Average Sim Score: {class_average_sim_score}")
  85. return self.score_dict
  86. def summary_scores(self):
  87. """
  88. calculate the average of edit distance, bleu score and sim score
  89. """
  90. over_all_dict = dict()
  91. average_edit_distance = sum(self.edit_distances) / len(self.edit_distances) if self.edit_distances else 0
  92. average_bleu_score = sum(self.bleu_scores) / len(self.bleu_scores) if self.bleu_scores else 0
  93. average_sim_score = sum(self.sim_scores) / len(self.sim_scores) if self.sim_scores else 0
  94. over_all_dict["average_edit_distance"] = average_edit_distance
  95. over_all_dict["average_bleu_score"] = average_bleu_score
  96. over_all_dict["average_sim_score"] = average_sim_score
  97. self.fw.write(json.dumps(over_all_dict, ensure_ascii=False) + "\n")
  98. return over_all_dict
  99. def calculate_similarity_total(self, tool_type, download_dir):
  100. """
  101. calculate the average of edit distance, bleu score and sim score
  102. """
  103. annotion = os.path.join(download_dir, "annotations", "cleaned")
  104. actual = os.path.join(download_dir, tool_type, "cleaned")
  105. score = self.calculate_similarity(annotion, actual, tool_type)
  106. return score