Skip to content

Commit

Permalink
#355 fixed bug: text_opinion actualy required information that would …
Browse files Browse the repository at this point in the history
…describe a text part, i.e. ContextID.
  • Loading branch information
nicolay-r committed Jul 26, 2022
1 parent 25b9ecf commit 5d8cc48
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 20 deletions.
42 changes: 23 additions & 19 deletions arekit/common/evaluation/comparators/text_opinions.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from arekit.common.evaluation.comparators.base import BaseComparator
from arekit.common.evaluation.context_opinion import ContextOpinion
from arekit.common.evaluation.evaluators.modes import EvaluationModes
from arekit.common.evaluation.evaluators.utils import check_is_supported, label_to_str
from arekit.common.text_opinions.base import TextOpinion


class TextOpinionBasedComparator(BaseComparator):
Expand All @@ -13,36 +13,40 @@ def __init__(self, eval_mode):
self.__eval_mode = eval_mode

@staticmethod
def text_opinion_to_id(text_opinion):
def context_opinion_to_id(context_opinion):
""" Compose a unique opinion ID, based on the document information,
and indices of the opinion participants.
"""
assert(isinstance(text_opinion, TextOpinion))
return "{}_{}_{}".format(text_opinion.DocID, text_opinion.SourceId, text_opinion.TargetId)
assert(isinstance(context_opinion, ContextOpinion))
return "{doc_id}_{ctx_id}_{src_id}_{tgt_id}".format(
doc_id=context_opinion.DocID,
ctx_id=context_opinion.ContextID,
src_id=context_opinion.SourceId,
tgt_id=context_opinion.TargetId)

@staticmethod
def __create_index_by_id(text_opinions, id_func):
def __create_index_by_id(context_opinions, id_func):
index = {}
for o_etalon in text_opinions:
assert(isinstance(o_etalon, TextOpinion))
for o_etalon in context_opinions:
assert(isinstance(o_etalon, ContextOpinion))
index[id_func(o_etalon)] = o_etalon
return index

def __iter_diff_core(self, etalon_text_opins, test_text_opins):
def __iter_diff_core(self, etalon_context_opinions, test_context_opinions):
""" Perform the comparison by the exact
"""
assert(isinstance(etalon_text_opins, list))
assert(isinstance(test_text_opins, list))
assert(isinstance(etalon_context_opinions, list))
assert(isinstance(test_context_opinions, list))

test_by_id = TextOpinionBasedComparator.__create_index_by_id(
test_text_opins, id_func=self.text_opinion_to_id)
test_context_opinions, id_func=self.context_opinion_to_id)

etalon_by_id = TextOpinionBasedComparator.__create_index_by_id(
etalon_text_opins, id_func=self.text_opinion_to_id)
etalon_context_opinions, id_func=self.context_opinion_to_id)

for o_etalon in etalon_text_opins:
assert(isinstance(o_etalon, TextOpinion))
o_id = self.text_opinion_to_id(o_etalon)
for o_etalon in etalon_context_opinions:
assert(isinstance(o_etalon, ContextOpinion))
o_id = self.context_opinion_to_id(o_etalon)
o_test = test_by_id[o_id] if o_id in test_by_id else None
has_opinion = o_test is not None

Expand All @@ -58,9 +62,9 @@ def __iter_diff_core(self, etalon_text_opins, test_text_opins):
o_etalon.Sentiment,
None if not has_opinion else o_test.Sentiment]

for o_test in test_text_opins:
assert (isinstance(o_test, TextOpinion))
o_id = self.text_opinion_to_id(o_test)
for o_test in test_context_opinions:
assert(isinstance(o_test, ContextOpinion))
o_id = self.context_opinion_to_id(o_test)
has_opinion = etalon_by_id[o_id] if o_id in etalon_by_id else None

if has_opinion:
Expand All @@ -83,7 +87,7 @@ def calc_diff(self, etalon, test, is_label_supported):
assert(isinstance(test, list))
assert(callable(is_label_supported))

it = self.__iter_diff_core(etalon_text_opins=etalon, test_text_opins=test)
it = self.__iter_diff_core(etalon_context_opinions=etalon, test_context_opinions=test)

# Cache all rows into `rows` array
rows = []
Expand Down
21 changes: 21 additions & 0 deletions arekit/common/evaluation/context_opinion.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from arekit.common.text_opinions.base import TextOpinion


class ContextOpinion(TextOpinion):
""" This is a text opnion that is a part of a text piece, dubbed as context.
"""

def __int__(self, doc_id, text_opinion_id, source_id, target_id, label, context_id):
""" context_id: it might be sentence index or a combination of them in case of a complex cases.
"""
super(ContextOpinion, self).__init__(doc_id=doc_id,
text_opinion_id=text_opinion_id,
source_id=source_id,
target_id=target_id,
label=label)

self.__context_id = context_id

@property
def ContextID(self):
return self.__context_id
7 changes: 6 additions & 1 deletion arekit/common/text_opinions/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,21 @@ class TextOpinion(object):
and composed between two named entities
(it was found especially by Opinion with predefined label)
allows to modify label using set_label
NOTE: it is important to keep document level IDs. (designed for that)
"""

# region constructors

def __init__(self, doc_id, text_opinion_id, source_id, target_id, label):
""" source_id: document level object id
target_id: document level object id
"""
assert(isinstance(doc_id, int))

self.__doc_id = doc_id
self.__source_id = source_id
self.__target_id = target_id
self.__doc_id = doc_id
self.__text_opinion_id = text_opinion_id
self.__modifiable_label = label

Expand Down

0 comments on commit 5d8cc48

Please sign in to comment.