|
|
|
|
|
|
|
|
|
|
|
|
|
from abc import ABC, abstractmethod |
|
from typing import Tuple, Optional, List |
|
|
|
|
|
from nltk.stem import WordNetLemmatizer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class KGBaseHandler(ABC): |
|
def __init__(self): |
|
super().__init__() |
|
self.st = WordNetLemmatizer() |
|
|
|
def normalize_noun(self, ent): |
|
try: |
|
noun = self.st.lemmatize(ent, pos='n') |
|
noun = self.st.lemmatize(noun, pos='v') |
|
except Exception as _: |
|
noun = ent[:-1] if ent[-1] == 's' else ent |
|
return noun |
|
|
|
def normalize_nouns(self, ent): |
|
local_ent = ent[:] |
|
nouns = local_ent.split(' ') |
|
if len(nouns) == 1: |
|
return ' '.join([self.normalize_noun(e) for e in nouns]) |
|
return local_ent |
|
|
|
def ignore_less_relevant_connection(self, relations): |
|
if len(relations) >= 2: |
|
for r in relations: |
|
if r != 'related_to': |
|
return r |
|
return relations[0] |
|
|
|
@abstractmethod |
|
def get_relation_types(self) -> List[str]: |
|
pass |
|
|
|
@abstractmethod |
|
def exists_relation_between(self, concept, other_concept) -> bool: |
|
pass |
|
|
|
@abstractmethod |
|
def relation_between(self, concept, other_concept) -> Tuple[Optional[str], Optional[str]]: |
|
pass |
|
|
|
@abstractmethod |
|
def get_related_concepts(self, concept) -> Optional[List[str]]: |
|
pass |
|
|
|
@abstractmethod |
|
def does_concept_exist(self, concept) -> bool: |
|
pass |
|
|
|
class NoKnowledge(KGBaseHandler): |
|
def __init__(self): |
|
super(NoKnowledge, self).__init__() |
|
|
|
def get_relation_types(self) -> List[str]: |
|
return [] |
|
|
|
def exists_relation_between(self, concept, other_concept) -> bool: |
|
return False |
|
|
|
def relation_between(self, concept, other_concept) -> Tuple[Optional[str], Optional[str]]: |
|
return (None, None) |
|
|
|
def does_concept_exist(self, concept) -> bool: |
|
return False |
|
|