You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
13 KiB

  1. from unittest import TestCase
  2. import rouge
  3. import utils
  4. def get_file_data(filename):
  5. text_file = open(filename, "r", encoding='utf-8')
  6. data = text_file.read()
  7. text_file.close()
  8. return data
  9. def run_tests_with_data(self, test_data):
  10. for original, generated_one, generated_two, description in test_data:
  11. print(description)
  12. print('original: ' + original)
  13. rouge_one = rouge.rouge_n(original, generated_one, n=1)
  14. rouge_two = rouge.rouge_n(original, generated_two, n=1)
  15. print('Rouge for one: ' + str(rouge_one) + ' ' + generated_one)
  16. print('Rouge for two: ' + str(rouge_two) + ' ' + generated_two)
  17. combined = generated_two + ' ' + generated_one
  18. combined_rouge = rouge.rouge_n(original, combined, n=1)
  19. print('Rouge for combined: ' + str(combined_rouge) + ' ' + combined)
  20. self.assertGreaterEqual(combined_rouge, rouge_one)
  21. self.assertGreaterEqual(combined_rouge, rouge_two)
  22. class RougeTest(TestCase):
  23. def tests_from_paper(self):
  24. s1 = 'police killed the gunman'
  25. s2 = 'police kill the gunman'
  26. s3 = 'the gunman kill police'
  27. score_s2 = rouge.rouge_l(s1, s2)
  28. self.assertEqual(score_s2, 0.75)
  29. score_s3 = rouge.rouge_l(s1, s3)
  30. self.assertEqual(score_s3, 0.5)
  31. reference = 'affe birne club düne essen'
  32. summary = 'affe birne feder geld himmel. affe club insel jagd essen.'
  33. lcs = 4
  34. p = lcs / 12
  35. r = lcs / 5
  36. f = 2*(r*p)/(r+p)
  37. r_p, r_r, r_f = rouge.rouge_l(reference_summary=reference, created_summary=summary, pp_options=[utils.pp_option_stopwords],
  38. extended_results=True)
  39. self.assertEqual(r_r, r)
  40. self.assertEqual(r_p, p)
  41. self.assertEqual(r_f, f)
  42. score_equal = rouge.rouge_l(summary, summary)
  43. self.assertEqual(score_equal, 1)
  44. def test_one(self):
  45. original = 'Für die Frage, ob alle in Art. 6 Abs. 1 der Richtlinie 2011/83/EU genannten Informationen objektiv in einem Werbemittel dargestellt werden können, ist erheblich, welchen Anteil diese Informationen am verfügbaren Raum des vom Unternehmer ausgewählten Werbeträgers einnehmen würden; die Werbebotschaft muss gegenüber den Verbraucherinformationen nicht zurücktreten.'
  46. sent_1 = '(1) Zwar ist für die nach der Vorabentscheidung des Gerichtshofs der Europäischen Union maßgebliche Frage, ob alle in Art. 6 Abs. 1 der Richtlinie 2011/83/EU genannten Informationen objektiv in einem Werbemittel dargestellt werden können, erheblich, welchen Anteil diese Informationen am verfügbaren Raum des vom Unternehmer ausgewählten Werbeträgers einnehmen würden.'
  47. sent_2 = 'Aus der Anforderung, die Informationen objektiv in der Werbebotschaft darstellen zu können, ist zu schließen, dass die Werbebotschaft gegenüber den Verbraucherinformationen nicht zurücktreten muss.'
  48. rouge_v1 = rouge.rouge_n(original, sent_1, 1, pp_options=[utils.pp_option_stopwords])
  49. rouge_v2 = rouge.rouge_n(original, sent_1 + ' ' + sent_2, 1, pp_options=[utils.pp_option_stopwords])
  50. self.assertGreater(rouge_v2, rouge_v1)
  51. def test_one_match(self):
  52. original = 'a b c d e.'
  53. score = rouge.rouge_n(original, 'd.', n=1)
  54. self.assertGreater(score, 0)
  55. def test_extension(self):
  56. original_short = 'a b c d e.'
  57. original_medi = 'a b c d e f g h i j k l m n o.'
  58. original_long = 'a b c d e f g h i j k l m n o p q r s t u v w x y z.'
  59. test_data = [[original_short, 'a b.', 'a b d.', 'small extension short sentence'],
  60. [original_short, 'a.', 'a b c d.', 'large extension short sentence'],
  61. [original_medi, 'a b c d e f g h i.', 'a b c d e f g h i j.', 'small extension medi sentence'],
  62. [original_medi, 'a b c d e f g h i.', 'a b c d e f g h i m n o l.',
  63. 'large extension medi sentence'],
  64. [original_long, 'a b c d e f g h i j k l m n o p q r s t u v.',
  65. 'a b c d e f g h i j k l m n o p q r s t u v w.', 'small extension long sentence'],
  66. [original_long, 'a b c d e f g h i j k.',
  67. 'a b c d e f g h i j k l m n o p q r s t u v w.', 'large extension long sentence'],
  68. ]
  69. print('Test extensions')
  70. run_tests_with_data(self, test_data)
  71. def test_differing(self):
  72. original_short = 'a b c d e.'
  73. original_medi = 'a b c d e f g h i j k l m n o.'
  74. original_long = 'a b c d e f g h i j k l m n o p q r s t u v w x y z.'
  75. test_data = [[original_short, 'a b c.', 'a b d.', 'small difference short sentence'],
  76. [original_short, 'a e.', 'a b c.', 'large difference short sentence'],
  77. [original_medi, 'a b c d e f g h i.', 'a b c d e f g h j.', 'small difference medi sentence'],
  78. [original_medi, 'a b c d e f g h i.', 'a b c d j k l m.',
  79. 'large difference medi sentence'],
  80. [original_long, 'a b c d e f g h i j k l m n o p q r s t u v.',
  81. 'a b c d e f g h i j k l m n o p q r s t u w.', 'small difference long sentence'],
  82. [original_long, 'a b c d e f g h i j k.',
  83. 'a b l m n o p q r s t u v.', 'large difference long sentence'],
  84. ]
  85. print('Test differences')
  86. run_tests_with_data(self, test_data)
  87. def test_rougel_high_precision_or_recall(self):
  88. gold = 'Boot.'
  89. created = 'Boot. Boot.'
  90. r_p, r_r, r_f = rouge.rouge_l(created_summary=created, reference_summary=gold, extended_results=True,
  91. pp_options=[utils.pp_option_stopwords, utils.pp_option_lemmatize])
  92. self.assertEqual(r_p, 1/2)
  93. self.assertEqual(r_r, 1)
  94. self.assertEqual(r_f, 2/3)
  95. gold = 'Affe Boot. Boot Club.'
  96. created = 'Boot.'
  97. r_p, r_r, r_f = rouge.rouge_l(created_summary=created, reference_summary=gold, extended_results=True,
  98. pp_options=[utils.pp_option_stopwords, utils.pp_option_lemmatize])
  99. self.assertEqual(r_p, 1)
  100. self.assertEqual(r_r, 2/6)
  101. self.assertEqual(r_f, 1/2)
  102. gold = 'Im Rahmen der bei Prüfung der Schutzschranke der Berichterstattung über Tagesereignisse gemäß § 50 ' \
  103. 'UrhG vorzunehmenden Grundrechtsabwägung ist im Falle der Veröffentlichung eines bislang ' \
  104. 'unveröffentlichten Werks auch das vom Urheberpersönlichkeitsrecht geschützte Interesse an einer ' \
  105. 'Geheimhaltung des Werks zu berücksichtigen. Dieses schützt das urheberrechtsspezifische Interesse des ' \
  106. 'Urhebers, darüber zu bestimmen, ob er mit der erstmaligen Veröffentlichung den Schritt von der ' \
  107. 'Privatsphäre in die Öffentlichkeit tut und sich und sein Werk damit der öffentlichen Kenntnisnahme ' \
  108. 'und Kritik aussetzt. Nicht zu berücksichtigen ist bei dieser Abwägung dagegen das Interesse an der ' \
  109. 'Geheimhaltung von Umständen, deren Offenlegung Nachteile für die Interessen des Staates und seiner ' \
  110. 'Einrichtungen haben könnten. Dieses Interesse ist nicht durch das Urheberpersönlichkeitsrecht, ' \
  111. 'sondern durch andere Vorschriften - etwa das Sicherheitsüberprüfungsgesetz, § 3 Nr. 1 Buchst. b IFG ' \
  112. 'und die strafrechtlichen Bestimmungen gegen Landesverrat und die Gefährdung der äußeren Sicherheit ' \
  113. 'gemäß §§ 93 ff. StGB - geschützt. '
  114. created = 'Dieses Interesse ist vielmehr durch die allgemeinen Vorschriften - etwa das ' \
  115. 'Sicherheitsüberprüfungsgesetz, § 3 Nr. 1 Buchst. b IFG und die strafrechtlichen Bestimmungen gegen ' \
  116. 'Landesverrat und die Gefährdung der äußeren Sicherheit gemäß §§ 93 ff. '
  117. r_p, r_r, r_f = rouge.rouge_l(created_summary=created, reference_summary=gold, extended_results=True,
  118. pp_options=[utils.pp_option_stopwords, utils.pp_option_lemmatize])
  119. self.assertLessEqual(r_p, 1)
  120. gold = 'Der Eigentümer eines Grundstücks ist hinsichtlich der von einem darauf befindlichen Baum (hier: ' \
  121. 'Birken) ausgehenden natürlichen Immissionen auf benachbarte Grundstücke Störer i.S.d. § 1004 Abs. 1 ' \
  122. 'BGB, wenn er sein Grundstück nicht ordnungsgemäß bewirtschaftet. Hieran fehlt es in aller Regel, ' \
  123. 'wenn die für die Anpflanzung bestehenden landesrechtlichen Abstandsregelungen eingehalten sind. 1b. ' \
  124. 'Ein Anspruch auf Beseitigung des Baums lässt sich in diesem Fall regelmäßig auch nicht aus dem ' \
  125. 'nachbarlichen Gemeinschaftsverhältnis herleiten. Hält der Grundstückseigentümer die für die ' \
  126. 'Anpflanzung bestehenden landesrechtlichen Abstandsregelungen ein, hat der Eigentümer des ' \
  127. 'Nachbargrundstücks wegen der Beeinträchtigungen durch die von den Anpflanzungen ausgehenden ' \
  128. 'natürlichen Immissionen weder einen Ausgleichsanspruch gemäß § 906 Abs. 2 Satz 2 BGB in unmittelbarer ' \
  129. 'Anwendung noch einen nachbarrechtlichen Ausgleichsanspruch gemäß § 906 Abs. 2 Satz 2 analog (' \
  130. 'Abgrenzung zu Senat, Urteil vom 27. Oktober 2017 - V ZR 8/17, ZfIR 2018, 190). '
  131. created = "Für die Entscheidung des Meinungsstreits ist von dem oben dargelegten Grundsatz auszugehen, " \
  132. "dass der Eigentümer eines Grundstücks hinsichtlich der von einem darauf befindlichen Baum " \
  133. "ausgehenden natürlichen Immissionen auf benachbarte Grundstücke Störer i.S.d. § 1004 Abs. 1 BGB " \
  134. "ist, wenn er sein Grundstück nicht ordnungsgemäß bewirtschaftet. Hält der Grundstückseigentümer " \
  135. "die für die Anpflanzung bestehenden landes-rechtlichen Abstandsregelungen ein, hat der Eigentümer " \
  136. "des Nachbargrund-stücks wegen der Beeinträchtigungen durch die von den Anpflanzungen ausgehenden " \
  137. "natürlichen Immissionen weder einen Ausgleichsanspruch gemäß § 906 Abs. 2 Satz 2 BGB in " \
  138. "unmittelbarer Anwendung noch einen nachbarrechtlichen Ausgleichsanspruch gemäß § 906 Abs. 2 Satz 2 " \
  139. "analog. Sind die für die Anpflanzung bestehenden landesrechtlichen Abstandsregelungen eingehalten, " \
  140. "lässt sich ein Anspruch auf Beseitigung der Bäume in aller Regel - und so auch hier - nicht aus " \
  141. "dem nachbarlichen Gemeinschaftsverhältnis herleiten. Gemäß § 907 Abs. 2 BGB gehören aber Bäume und " \
  142. "Sträucher nicht zu den Anlagen i.S.d. § 907 Abs. 1 BGB. Ob den Grundstückseigentümer für " \
  143. "natürliche Immissionen eine „Sicherungspflicht“ trifft und er damit Störer i.S.d. § 1004 Abs. 1 " \
  144. "BGB ist, ist jeweils anhand der Umstände des Einzelfalls zu prüfen. Rechtsfehlerhaft ist jedoch " \
  145. "die Auffassung des Berufungsgerichts, der Beklagte sei als Störer i.S.d. § 1004 Abs. 1 BGB für die " \
  146. "von den Birken ausgehenden Immissionen auf das Grundstück des Klägers verantwortlich. In diesem " \
  147. "Fall ist er regelmäßig schon nicht Störer, so dass es bereits an einem Beseitigungsanspruch gemäß " \
  148. "§ 1004 Abs. 1 BGB fehlt und der von dem Berufungsgericht beschriebene Konflikt zwischen den Regeln " \
  149. "des Bürgerlichen Gesetzbuchs und den landesrechtlichen Vorschriften nicht besteht. Voraussetzung " \
  150. "hierfür ist jedoch, dass der in Anspruch genommene Grundstückseigentümer für die " \
  151. "Eigentumsbeeinträchtigung verantwortlich und damit Störer i.S.d. § 1004 Abs. 1 BGB ist. "
  152. r_p, r_r, r_f = rouge.rouge_l(created_summary=created, reference_summary=gold, extended_results=True,
  153. pp_options=[utils.pp_option_stopwords, utils.pp_option_lemmatize])
  154. self.assertLessEqual(r_p, 1)
  155. self.assertLessEqual(r_r, 1)
  156. def test_specific(self):
  157. gold = 'Diese Voraussetzungen hat der XII. Zivilsenat für den vorliegenden Fall bejaht.'
  158. created = 'Dies ist insbesondere der Fall, wenn die Sanktion außer Verhältnis zum Gewicht des Vertragsverstoßes und den Folgen für den Schuldner der Vertragsstrafe steht.'
  159. created_2 = 'Deren Untergrenze ist mit 30 € angegeben.'
  160. r_p, r_r, r_f = rouge.rouge_l(created_summary=created, reference_summary=gold, extended_results=True,
  161. pp_options=[utils.pp_option_stopwords, utils.pp_option_lemmatize])
  162. r_p_2, r_r_2, r_f_2 = rouge.rouge_l(created_summary=created_2, reference_summary=gold, extended_results=True,
  163. pp_options=[utils.pp_option_stopwords, utils.pp_option_lemmatize])
  164. r_p_c, r_r_c, r_f_c = rouge.rouge_l(created_summary=created+ ' '+created_2, reference_summary=gold, extended_results=True,
  165. pp_options=[utils.pp_option_stopwords, utils.pp_option_lemmatize])
  166. self.assertGreater(r_f, r_f_2)
  167. self.assertGreater(r_f_c, r_f)