def constructLiterals(self, word: str, parse: MorphologicalParse,
                          metaParse: MetamorphicParse,
                          fsm: FsmMorphologicalAnalyzer):
        """
        Creates a list of literals with a specified word, or possible words corresponding to morphological parse.

        PARAMETERS
        ----------
        word : str
            literal String
        parse : MorphologicalParse
            morphological parse to get possible words
        metaParse : MetamorphicParse
            metamorphic parse to get possible words
        fsm : FsmMorphologicalAnalyzer
            finite state machine morphological analyzer to be used at getting possible words

        RETURNS
        -------
        list
            A list of literal
        """
        result = []
        if parse.size() > 0:
            if not parse.isPunctuation() and not parse.isCardinal(
            ) and not parse.isReal():
                possibleWords = fsm.getPossibleWords(parse, metaParse)
                for possibleWord in possibleWords:
                    result.extend(self.getLiteralsWithName(possibleWord))
            else:
                result.extend(self.getLiteralsWithName(word))
        else:
            result.extend(self.getLiteralsWithName(word))
        return result
    def __init__(self, parse: MorphologicalParse):
        """
        Binary attribute for a given word. If the word is an auxiliary verb, the attribute will have
        the value "true", otherwise "false".

        PARAMETERS
        ----------
        parse : MorphologicalParse
            Morphological parse of the word.
        """
        super().__init__(parse.isAuxiliary() and parse.isVerb())
    def setParse(self, parseString: MorphologicalParse):
        """
        Sets the morphological parse layer of the word.

        PARAMETERS
        ----------
        parseString : str
            The new morphological parse of the word in string form.
        """
        if parseString is not None:
            self.__parse = MorphologicalParse(parseString)
        else:
            self.__parse = None
    def getMetaMorphemeTagForParse(self, parse: MorphologicalParse,
                                   tag: str) -> list:
        """
        getMetaMorphemeTagForParse method which also takes parse as an input. It also checks the morphotactic tags.

        PARAMETERS
        ----------
        parse : MorphologicalParse
            MorphologicalParse type input.
        tag : str
            String to get meta morphemes from.

        RETURNS
        -------
        list
            List type result which holds meta morphemes.
        """
        result = []
        s = tag[0]
        if Word.isPunctuationSymbol(s):
            tag = tag[1:]
        for j in range(len(MetamorphicParse.metaMorphemes)):
            if tag == self.metaMorphemes[j] and parse.containsTag(
                    MetamorphicParse.morphotacticTags[j]):
                result.append(MetamorphicParse.morphotacticTags[j])
        return result
Example #5
0
    def __init__(self, parse: MorphologicalParse):
        """
        Discrete attribute for a given word. Returns the the root word

        PARAMETERS
        ----------
        parse : MorphologicalParse
            Morphological parse of the word.
        """
        super().__init__(parse.getWord().getName())
    def __init__(self, parse: MorphologicalParse):
        """
        Discrete attribute for a given word. Returns the last part of speech (main part of speech) of the word

        PARAMETERS
        ----------
        parse : MorphologicalParse
            Morphological parse of the word.
        """
        super().__init__(parse.getPos())
Example #7
0
 def getMetaMorphemeTagForParse(self, parse: MorphologicalParse,
                                tag: str) -> list:
     result = []
     s = tag[0]
     if Word.isPunctuation(s):
         tag = tag[1:]
     for j in range(len(MetamorphicParse.metaMorphemes)):
         if tag == self.metaMorphemes[j] and parse.containsTag(
                 MetamorphicParse.morphotacticTags[j]):
             result.append(MetamorphicParse.morphotacticTags[j])
     return result
Example #8
0
    def __init__(self, parse: MorphologicalParse):
        """
        Binary attribute for a given word. If the word represents a date (if the morphological parse contains
        tag PROPERNOUN), the attribute will have the value "true", otherwise "false".

        PARAMETERS
        ----------
        parse : MorphologicalParse
            Morphological parse of the word.
        """
        super().__init__(parse.isProperNoun())
Example #9
0
    def __init__(self, parse: MorphologicalParse):
        """
        Binary attribute for a given word. If the word is represents a real number (if the morphological parse contains
        tag REAL), the attribute will have the value "true", otherwise "false".

        PARAMETERS
        ----------
        parse : MorphologicalParse
            Morphological parse of the word.
        """
        super().__init__(parse.isReal())
    def __init__(self, parse: MorphologicalParse):
        """
        Discrete attribute for a given word. If the last inflectional group of the word contains case information, the
        attribute will have that case value. Otherwise the attribute will have the value null.

        PARAMETERS
        ----------
        parse : MorphologicalParse
            Morphological parse of the word.
        """
        super().__init__(parse.lastIGContainsCase())
    def __init__(self, parse: MorphologicalParse):
        """
        Binary attribute for a given word. If the last inflectional group of the word contains POSSESSIVE tag,
        the attribute will be "true", otherwise "false".

        PARAMETERS
        ----------
        parse : MorphologicalParse
            Morphological parse of the word.
        """
        super().__init__(parse.lastIGContainsPossessive())
 def setLayerValue(self, layerValue: str):
     self.items = []
     if isinstance(layerValue, str):
         self.layerValue = layerValue
         if layerValue is not None:
             splitWords = self.layerValue.split(" ")
             for word in splitWords:
                 self.items.append(MorphologicalParse(word))
     elif isinstance(layerValue, MorphologicalParse):
         parse = layerValue
         self.layerValue = parse.getTransitionList()
         self.items.append(parse)
    def __init__(self, parse: MorphologicalParse, tag: MorphologicalTag):
        """
        Binary attribute for a given word. If the last inflectional group of the word contains tag,
        the attribute will be "true", otherwise "false".

        PARAMETERS
        ----------
        parse : MorphologicalParse
            Morphological parse of the word.
        tag : MorphologicalTag
            Tag that is checked in the last inflectional group.
        """
        super().__init__(parse.lastIGContainsTag(tag))
 def __init__(self, fileName=None):
     """
     Constructor which creates a list of sentences and a CounterHashMap of wordList.
     """
     super().__init__()
     if fileName is not None:
         inputFile = open(fileName, "r", encoding="utf8")
         lines = inputFile.readlines()
         newSentence = Sentence()
         for line in lines:
             word = line[:line.index("\t")]
             parse = line[line.index("\t") + 1:]
             if len(word) > 0 and len(parse) > 0:
                 newWord = DisambiguatedWord(word, MorphologicalParse(parse.strip()))
                 if word == "<S>":
                     newSentence = Sentence()
                 elif word == "</S>":
                     self.addSentence(newSentence)
                 elif word == "<DOC>" or word == "</DOC>" or word == "<TITLE>" or word == "</TITLE>":
                     pass
                 else:
                     newSentence.addWord(newWord)
         inputFile.close()
 def setMorphologicalAnalysis(self, parse: MorphologicalParse):
     self.layers[
         ViewLayerType.INFLECTIONAL_GROUP] = MorphologicalAnalysisLayer(
             parse.__str__())
     self.layers[ViewLayerType.PART_OF_SPEECH] = MorphologicalAnalysisLayer(
         parse.__str__())
 def setUp(self) -> None:
     self.parse1 = MorphologicalParse("bayan+NOUN+A3SG+PNON+NOM")
     self.parse2 = MorphologicalParse("yaşa+VERB+POS^DB+ADJ+PRESPART")
     self.parse3 = MorphologicalParse("serbest+ADJ")
     self.parse4 = MorphologicalParse(
         "et+VERB^DB+VERB+PASS^DB+VERB+ABLE+NEG+AOR+A3SG")
     self.parse5 = MorphologicalParse(
         "sür+VERB^DB+VERB+CAUS^DB+VERB+PASS+POS^DB+NOUN+INF2+A3SG+P3SG+NOM"
     )
     self.parse6 = MorphologicalParse(
         "değiş+VERB^DB+VERB+CAUS^DB+VERB+PASS+POS^DB+VERB+ABLE+AOR^DB+ADJ+ZERO"
     )
     self.parse7 = MorphologicalParse(
         "iyi+ADJ^DB+VERB+BECOME^DB+VERB+CAUS^DB+VERB+PASS+POS^DB+VERB+ABLE^DB+NOUN+INF2+A3PL+P3PL+ABL"
     )
     self.parse8 = MorphologicalParse("değil+ADJ^DB+VERB+ZERO+PAST+A3SG")
     self.parse9 = MorphologicalParse("hazır+ADJ^DB+VERB+ZERO+PAST+A3SG")
class MorphologicalParseTest(unittest.TestCase):

    parse1: MorphologicalParse
    parse2: MorphologicalParse
    parse3: MorphologicalParse
    parse4: MorphologicalParse
    parse5: MorphologicalParse
    parse6: MorphologicalParse
    parse7: MorphologicalParse
    parse8: MorphologicalParse
    parse9: MorphologicalParse

    def setUp(self) -> None:
        self.parse1 = MorphologicalParse("bayan+NOUN+A3SG+PNON+NOM")
        self.parse2 = MorphologicalParse("yaşa+VERB+POS^DB+ADJ+PRESPART")
        self.parse3 = MorphologicalParse("serbest+ADJ")
        self.parse4 = MorphologicalParse(
            "et+VERB^DB+VERB+PASS^DB+VERB+ABLE+NEG+AOR+A3SG")
        self.parse5 = MorphologicalParse(
            "sür+VERB^DB+VERB+CAUS^DB+VERB+PASS+POS^DB+NOUN+INF2+A3SG+P3SG+NOM"
        )
        self.parse6 = MorphologicalParse(
            "değiş+VERB^DB+VERB+CAUS^DB+VERB+PASS+POS^DB+VERB+ABLE+AOR^DB+ADJ+ZERO"
        )
        self.parse7 = MorphologicalParse(
            "iyi+ADJ^DB+VERB+BECOME^DB+VERB+CAUS^DB+VERB+PASS+POS^DB+VERB+ABLE^DB+NOUN+INF2+A3PL+P3PL+ABL"
        )
        self.parse8 = MorphologicalParse("değil+ADJ^DB+VERB+ZERO+PAST+A3SG")
        self.parse9 = MorphologicalParse("hazır+ADJ^DB+VERB+ZERO+PAST+A3SG")

    def test_GetTransitionList(self):
        self.assertEqual("NOUN+A3SG+PNON+NOM", self.parse1.getTransitionList())
        self.assertEqual("VERB+POS+ADJ+PRESPART",
                         self.parse2.getTransitionList())
        self.assertEqual("ADJ", self.parse3.getTransitionList())
        self.assertEqual("VERB+VERB+PASS+VERB+ABLE+NEG+AOR+A3SG",
                         self.parse4.getTransitionList())
        self.assertEqual(
            "VERB+VERB+CAUS+VERB+PASS+POS+NOUN+INF2+A3SG+P3SG+NOM",
            self.parse5.getTransitionList())
        self.assertEqual("VERB+VERB+CAUS+VERB+PASS+POS+VERB+ABLE+AOR+ADJ+ZERO",
                         self.parse6.getTransitionList())
        self.assertEqual(
            "ADJ+VERB+BECOME+VERB+CAUS+VERB+PASS+POS+VERB+ABLE+NOUN+INF2+A3PL+P3PL+ABL",
            self.parse7.getTransitionList())
        self.assertEqual("ADJ+VERB+ZERO+PAST+A3SG",
                         self.parse8.getTransitionList())

    def test_GetTag(self):
        self.assertEqual("A3SG", self.parse1.getTag(2))
        self.assertEqual("PRESPART", self.parse2.getTag(4))
        self.assertEqual("serbest", self.parse3.getTag(0))
        self.assertEqual("AOR", self.parse4.getTag(7))
        self.assertEqual("P3SG", self.parse5.getTag(10))
        self.assertEqual("ABLE", self.parse6.getTag(8))
        self.assertEqual("ABL", self.parse7.getTag(15))

    def test_GetTagSize(self):
        self.assertEqual(5, self.parse1.tagSize())
        self.assertEqual(5, self.parse2.tagSize())
        self.assertEqual(2, self.parse3.tagSize())
        self.assertEqual(9, self.parse4.tagSize())
        self.assertEqual(12, self.parse5.tagSize())
        self.assertEqual(12, self.parse6.tagSize())
        self.assertEqual(16, self.parse7.tagSize())
        self.assertEqual(6, self.parse8.tagSize())

    def test_Size(self):
        self.assertEqual(1, self.parse1.size())
        self.assertEqual(2, self.parse2.size())
        self.assertEqual(1, self.parse3.size())
        self.assertEqual(3, self.parse4.size())
        self.assertEqual(4, self.parse5.size())
        self.assertEqual(5, self.parse6.size())
        self.assertEqual(6, self.parse7.size())
        self.assertEqual(2, self.parse8.size())

    def test_GetRootPos(self):
        self.assertEqual("NOUN", self.parse1.getRootPos())
        self.assertEqual("VERB", self.parse2.getRootPos())
        self.assertEqual("ADJ", self.parse3.getRootPos())
        self.assertEqual("VERB", self.parse4.getRootPos())
        self.assertEqual("VERB", self.parse5.getRootPos())
        self.assertEqual("VERB", self.parse6.getRootPos())
        self.assertEqual("ADJ", self.parse7.getRootPos())
        self.assertEqual("ADJ", self.parse8.getRootPos())

    def test_GetPos(self):
        self.assertEqual("NOUN", self.parse1.getPos())
        self.assertEqual("ADJ", self.parse2.getPos())
        self.assertEqual("ADJ", self.parse3.getPos())
        self.assertEqual("VERB", self.parse4.getPos())
        self.assertEqual("NOUN", self.parse5.getPos())
        self.assertEqual("ADJ", self.parse6.getPos())
        self.assertEqual("NOUN", self.parse7.getPos())
        self.assertEqual("VERB", self.parse8.getPos())

    def test_GetWordWithPos(self):
        self.assertEqual("bayan+NOUN", self.parse1.getWordWithPos().getName())
        self.assertEqual("yaşa+VERB", self.parse2.getWordWithPos().getName())
        self.assertEqual("serbest+ADJ", self.parse3.getWordWithPos().getName())
        self.assertEqual("et+VERB", self.parse4.getWordWithPos().getName())
        self.assertEqual("sür+VERB", self.parse5.getWordWithPos().getName())
        self.assertEqual("değiş+VERB", self.parse6.getWordWithPos().getName())
        self.assertEqual("iyi+ADJ", self.parse7.getWordWithPos().getName())
        self.assertEqual("değil+ADJ", self.parse8.getWordWithPos().getName())

    def test_LastIGContainsCase(self):
        self.assertEqual("NOM", self.parse1.lastIGContainsCase())
        self.assertEqual("NULL", self.parse2.lastIGContainsCase())
        self.assertEqual("NULL", self.parse3.lastIGContainsCase())
        self.assertEqual("NULL", self.parse4.lastIGContainsCase())
        self.assertEqual("NOM", self.parse5.lastIGContainsCase())
        self.assertEqual("NULL", self.parse6.lastIGContainsCase())
        self.assertEqual("ABL", self.parse7.lastIGContainsCase())

    def test_LastIGContainsPossessive(self):
        self.assertFalse(self.parse1.lastIGContainsPossessive())
        self.assertFalse(self.parse2.lastIGContainsPossessive())
        self.assertFalse(self.parse3.lastIGContainsPossessive())
        self.assertFalse(self.parse4.lastIGContainsPossessive())
        self.assertTrue(self.parse5.lastIGContainsPossessive())
        self.assertFalse(self.parse6.lastIGContainsPossessive())
        self.assertTrue(self.parse7.lastIGContainsPossessive())

    def test_IsPlural(self):
        self.assertFalse(self.parse1.isPlural())
        self.assertFalse(self.parse2.isPlural())
        self.assertFalse(self.parse3.isPlural())
        self.assertFalse(self.parse4.isPlural())
        self.assertFalse(self.parse5.isPlural())
        self.assertFalse(self.parse6.isPlural())
        self.assertTrue(self.parse7.isPlural())

    def test_IsAuxiliary(self):
        self.assertFalse(self.parse1.isAuxiliary())
        self.assertFalse(self.parse2.isAuxiliary())
        self.assertFalse(self.parse3.isAuxiliary())
        self.assertTrue(self.parse4.isAuxiliary())
        self.assertFalse(self.parse5.isAuxiliary())
        self.assertFalse(self.parse6.isAuxiliary())
        self.assertFalse(self.parse7.isAuxiliary())

    def test_IsNoun(self):
        self.assertTrue(self.parse1.isNoun())
        self.assertTrue(self.parse5.isNoun())
        self.assertTrue(self.parse7.isNoun())

    def test_IsAdjective(self):
        self.assertTrue(self.parse2.isAdjective())
        self.assertTrue(self.parse3.isAdjective())
        self.assertTrue(self.parse6.isAdjective())

    def test_IsVerb(self):
        self.assertTrue(self.parse4.isVerb())
        self.assertTrue(self.parse8.isVerb())

    def test_IsRootVerb(self):
        self.assertTrue(self.parse2.isRootVerb())
        self.assertTrue(self.parse4.isRootVerb())
        self.assertTrue(self.parse5.isRootVerb())
        self.assertTrue(self.parse6.isRootVerb())

    def test_GetTreePos(self):
        self.assertEqual("NP", self.parse1.getTreePos())
        self.assertEqual("ADJP", self.parse2.getTreePos())
        self.assertEqual("ADJP", self.parse3.getTreePos())
        self.assertEqual("VP", self.parse4.getTreePos())
        self.assertEqual("NP", self.parse5.getTreePos())
        self.assertEqual("ADJP", self.parse6.getTreePos())
        self.assertEqual("NP", self.parse7.getTreePos())
        self.assertEqual("NEG", self.parse8.getTreePos())
        self.assertEqual("NOMP", self.parse9.getTreePos())
    def constructSynSets(self, word: str, parse: MorphologicalParse,
                         metaParse: MetamorphicParse,
                         fsm: FsmMorphologicalAnalyzer) -> list:
        """
        Creates a list of SynSets with a specified word, or possible words corresponding to morphological parse.

        PARAMETERS
        ----------
        word : str
            literal String  to get SynSets with
        parse : MorphologicalParse
            morphological parse to get SynSets with proper literals
        metaParse : MetamorphicParse
            metamorphic parse to get possible words
        fsm : FsmMorphologicalAnalyzer
            finite state machine morphological analyzer to be used at getting possible words

        RETURNS
        -------
        list
            A list of SynSets
        """
        result = []
        if parse.size() > 0:
            if parse.isProperNoun():
                result.append(self.getSynSetWithLiteral("(özel isim)", 1))
            if parse.isTime():
                result.append(self.getSynSetWithLiteral("(zaman)", 1))
            if parse.isDate():
                result.append(self.getSynSetWithLiteral("(tarih)", 1))
            if parse.isHashTag():
                result.append(self.getSynSetWithLiteral("(hashtag)", 1))
            if parse.isEmail():
                result.append(self.getSynSetWithLiteral("(email)", 1))
            if parse.isOrdinal():
                result.append(
                    self.getSynSetWithLiteral("(sayı sıra sıfatı)", 1))
            if parse.isPercent():
                result.append(self.getSynSetWithLiteral("(yüzde)", 1))
            if parse.isFraction():
                result.append(self.getSynSetWithLiteral("(kesir sayı)", 1))
            if parse.isRange():
                result.append(self.getSynSetWithLiteral("(sayı aralığı)", 1))
            if parse.isReal():
                result.append(self.getSynSetWithLiteral("(reel sayı)", 1))
            if not parse.isPunctuation() and not parse.isCardinal(
            ) and not parse.isReal():
                possibleWords = fsm.getPossibleWords(parse, metaParse)
                for possibleWord in possibleWords:
                    synSets = self.getSynSetsWithLiteral(possibleWord)
                    if len(synSets) > 0:
                        for synSet in synSets:
                            if synSet.getPos() is not None and (
                                    parse.getPos() == "NOUN" or parse.getPos()
                                    == "ADVERB" or parse.getPos() == "VERB"
                                    or parse.getPos() == "ADJ"
                                    or parse.getPos() == "CONJ"):
                                if synSet.getPos() == Pos.NOUN:
                                    if parse.getPos(
                                    ) == "NOUN" or parse.getRootPos(
                                    ) == "NOUN":
                                        result.append(synSet)
                                elif synSet.getPos() == Pos.ADVERB:
                                    if parse.getPos(
                                    ) == "ADVERB" or parse.getRootPos(
                                    ) == "ADVERB":
                                        result.append(synSet)
                                elif synSet.getPos() == Pos.VERB:
                                    if parse.getPos(
                                    ) == "VERB" or parse.getRootPos(
                                    ) == "VERB":
                                        result.append(synSet)
                                elif synSet.getPos() == Pos.ADJECTIVE:
                                    if parse.getPos(
                                    ) == "ADJ" or parse.getRootPos() == "ADJ":
                                        result.append(synSet)
                                elif synSet.getPos() == Pos.CONJUNCTION:
                                    if parse.getPos(
                                    ) == "CONJ" or parse.getRootPos(
                                    ) == "CONJ":
                                        result.append(synSet)
                                else:
                                    result.append(synSet)
                            else:
                                result.append(synSet)
                if len(result) == 0:
                    for possibleWord in possibleWords:
                        synSets = self.getSynSetsWithLiteral(possibleWord)
                        result.extend(synSets)
            else:
                result.extend(self.getSynSetsWithLiteral(word))
            if parse.isCardinal() and len(result) == 0:
                result.append(self.getSynSetWithLiteral("(tam sayı)", 1))
        else:
            result.extend(self.getSynSetsWithLiteral(word))
        return result
    def __init__(self, word: str, layerType=None):
        """
        Constructor for the AnnotatedWord class. Gets the word with its annotation layers as input and sets the
        corresponding layers.

        PARAMETERS
        ----------
        word : str
            Input word with annotation layers
        """
        self.__parse = None
        self.__metamorphicParse = None
        self.__semantic = None
        self.__namedEntityType = None
        self.__argument = None
        self.__frameElement = None
        self.__shallowParse = None
        self.__universalDependency = None
        if layerType is None:
            splitLayers = re.compile("[{}]").split(word)
            for layer in splitLayers:
                if len(layer) == 0:
                    continue
                if "=" not in layer:
                    self.name = layer
                    continue
                layerType = layer[:layer.index("=")]
                layerValue = layer[layer.index("=") + 1:]
                if layerType == "turkish":
                    self.name = layerValue
                elif layerType == "morphologicalAnalysis":
                    self.__parse = MorphologicalParse(layerValue)
                elif layerType == "metaMorphemes":
                    self.__metamorphicParse = MetamorphicParse(layerValue)
                elif layerType == "namedEntity":
                    self.__namedEntityType = NamedEntityType.getNamedEntityType(
                        layerValue)
                elif layerType == "propbank":
                    self.__argument = Argument(layerValue)
                elif layerType == "framenet":
                    self.__frameElement = FrameElement(layerValue)
                elif layerType == "shallowParse":
                    self.__shallowParse = layerValue
                elif layerType == "semantics":
                    self.__semantic = layerValue
                elif layerType == "universalDependency":
                    values = layerValue.split("$")
                    self.__universalDependency = UniversalDependencyRelation(
                        int(values[0]), values[1])
        elif isinstance(layerType, NamedEntityType):
            super().__init__(word)
            self.__namedEntityType = layerType
            self.__argument = Argument("NONE")
        elif isinstance(layerType, MorphologicalParse):
            super().__init__(word)
            self.__parse = layerType
            self.__namedEntityType = NamedEntityType.NONE
            self.__argument = Argument("NONE")
        elif isinstance(layerType, FsmParse):
            super().__init__(word)
            self.__parse = layerType
            self.__namedEntityType = NamedEntityType.NONE
            self.setMetamorphicParse(layerType.withList())
            self.__argument = Argument("NONE")
class AnnotatedWord(Word):
    __parse: MorphologicalParse
    __metamorphicParse: MetamorphicParse
    __semantic: str
    __namedEntityType: NamedEntityType
    __argument: Argument
    __frameElement: FrameElement
    __shallowParse: str
    __universalDependency: UniversalDependencyRelation

    def __init__(self, word: str, layerType=None):
        """
        Constructor for the AnnotatedWord class. Gets the word with its annotation layers as input and sets the
        corresponding layers.

        PARAMETERS
        ----------
        word : str
            Input word with annotation layers
        """
        self.__parse = None
        self.__metamorphicParse = None
        self.__semantic = None
        self.__namedEntityType = None
        self.__argument = None
        self.__frameElement = None
        self.__shallowParse = None
        self.__universalDependency = None
        if layerType is None:
            splitLayers = re.compile("[{}]").split(word)
            for layer in splitLayers:
                if len(layer) == 0:
                    continue
                if "=" not in layer:
                    self.name = layer
                    continue
                layerType = layer[:layer.index("=")]
                layerValue = layer[layer.index("=") + 1:]
                if layerType == "turkish":
                    self.name = layerValue
                elif layerType == "morphologicalAnalysis":
                    self.__parse = MorphologicalParse(layerValue)
                elif layerType == "metaMorphemes":
                    self.__metamorphicParse = MetamorphicParse(layerValue)
                elif layerType == "namedEntity":
                    self.__namedEntityType = NamedEntityType.getNamedEntityType(
                        layerValue)
                elif layerType == "propbank":
                    self.__argument = Argument(layerValue)
                elif layerType == "framenet":
                    self.__frameElement = FrameElement(layerValue)
                elif layerType == "shallowParse":
                    self.__shallowParse = layerValue
                elif layerType == "semantics":
                    self.__semantic = layerValue
                elif layerType == "universalDependency":
                    values = layerValue.split("$")
                    self.__universalDependency = UniversalDependencyRelation(
                        int(values[0]), values[1])
        elif isinstance(layerType, NamedEntityType):
            super().__init__(word)
            self.__namedEntityType = layerType
            self.__argument = Argument("NONE")
        elif isinstance(layerType, MorphologicalParse):
            super().__init__(word)
            self.__parse = layerType
            self.__namedEntityType = NamedEntityType.NONE
            self.__argument = Argument("NONE")
        elif isinstance(layerType, FsmParse):
            super().__init__(word)
            self.__parse = layerType
            self.__namedEntityType = NamedEntityType.NONE
            self.setMetamorphicParse(layerType.withList())
            self.__argument = Argument("NONE")

    def __str__(self) -> str:
        """
        Converts an AnnotatedWord to string. For each annotation layer, the method puts a left brace, layer name,
        equal sign and layer value finishing with right brace.

        RETURNS
        -------
        str
            String form of the AnnotatedWord.
        """
        result = "{turkish=" + self.name + "}"
        if self.__parse is not None:
            result = result + "{morphologicalAnalysis=" + self.__parse.__str__(
            ) + "}"
        if self.__metamorphicParse is not None:
            result = result + "{metaMorphemes=" + self.__metamorphicParse.__str__(
            ) + "}"
        if self.__semantic is not None:
            result = result + "{semantics=" + self.__semantic + "}"
        if self.__namedEntityType is not None:
            result = result + "{namedEntity=" + NamedEntityType.getNamedEntityString(
                self.__namedEntityType) + "}"
        if self.__argument is not None:
            result = result + "{propbank=" + self.__argument.__str__() + "}"
        if self.__frameElement is not None:
            result = result + "{framenet=" + self.__frameElement.__str__(
            ) + "}"
        if self.__shallowParse is not None:
            result = result + "{shallowParse=" + self.__shallowParse + "}"
        if self.__universalDependency is not None:
            result = result + "{universalDependency=" + self.__universalDependency.to().__str__() + "$" + \
                     self.__universalDependency.__str__() + "}"
        return result

    def getLayerInfo(self, viewLayerType: ViewLayerType) -> str:
        """
        Returns the value of a given layer.

        PARAMETERS
        ----------
        viewLayerType : ViewLayerType
            Layer for which the value questioned.

        RETURNS
        -------
        str
            The value of the given layer.
        """
        if viewLayerType == ViewLayerType.INFLECTIONAL_GROUP:
            if self.__parse is not None:
                return self.__parse.__str__()
        elif viewLayerType == ViewLayerType.META_MORPHEME:
            if self.__metamorphicParse is not None:
                return self.__metamorphicParse.__str__()
        elif viewLayerType == ViewLayerType.SEMANTICS:
            return self.__semantic
        elif viewLayerType == ViewLayerType.NER:
            if self.__namedEntityType is not None:
                return self.__namedEntityType.__str__()
        elif viewLayerType == ViewLayerType.SHALLOW_PARSE:
            return self.__shallowParse
        elif viewLayerType == ViewLayerType.TURKISH_WORD:
            return self.name
        elif viewLayerType == ViewLayerType.PROPBANK:
            if self.__argument is not None:
                return self.__argument.__str__()
        elif viewLayerType == ViewLayerType.FRAMENET:
            if self.__frameElement is not None:
                return self.__frameElement.__str__()
        elif viewLayerType == ViewLayerType.DEPENDENCY:
            if self.__universalDependency is not None:
                return self.__universalDependency.to().__str__(
                ) + "$" + self.__universalDependency.__str__()
        else:
            return None

    def getParse(self) -> MorphologicalParse:
        """
        Returns the morphological parse layer of the word.

        RETURNS
        -------
        MorphologicalParse
            The morphological parse of the word.
        """
        return self.__parse

    def setParse(self, parseString: MorphologicalParse):
        """
        Sets the morphological parse layer of the word.

        PARAMETERS
        ----------
        parseString : str
            The new morphological parse of the word in string form.
        """
        if parseString is not None:
            self.__parse = MorphologicalParse(parseString)
        else:
            self.__parse = None

    def getMetamorphicParse(self) -> MetamorphicParse:
        """
        Returns the metamorphic parse layer of the word.

        RETURNS
        -------
        MetamorphicParse
            The metamorphic parse of the word.
        """
        return self.__metamorphicParse

    def setMetamorphicParse(self, parseString: str):
        """
        Sets the metamorphic parse layer of the word.

        PARAMETERS
        ----------
        parseString : str
            The new metamorphic parse of the word in string form.
        """
        self.__metamorphicParse = MetamorphicParse(parseString)

    def getSemantic(self) -> str:
        """
        Returns the semantic layer of the word.

        RETURNS
        -------
        str
            Sense id of the word.
        """
        return self.__semantic

    def setSemantic(self, semantic: str):
        """
        Sets the semantic layer of the word.

        PARAMETERS
        ----------
        semantic : str
            New sense id of the word.
        """
        self.__semantic = semantic

    def getNamedEntityType(self) -> NamedEntityType:
        """
        Returns the named entity layer of the word.

        RETURNS
        -------
        NamedEntityType
            Named entity tag of the word.
        """
        return self.__namedEntityType

    def setNamedEntityType(self, namedEntity: str):
        """
        Sets the named entity layer of the word.

        PARAMETERS
        ----------
        namedEntity : str
            New named entity tag of the word.
        """
        if namedEntity is not None:
            self.__namedEntityType = NamedEntityType.getNamedEntityType(
                namedEntity)
        else:
            self.__namedEntityType = None

    def getArgument(self) -> Argument:
        """
        Returns the semantic role layer of the word.

        RETURNS
        -------
        Argument
            Semantic role tag of the word.
        """
        return self.__argument

    def setArgument(self, argument: str):
        """
        Sets the semantic role layer of the word.

        PARAMETERS
        ----------
        argument : Argument
            New semantic role tag of the word.
        """
        if self.__argument is not None:
            self.__argument = Argument(argument)
        else:
            self.__argument = None

    def getFrameElement(self) -> FrameElement:
        """
        Returns the framenet layer of the word.

        RETURNS
        -------
        FrameElement
            Framenet tag of the word.
        """
        return self.__frameElement

    def setFrameElement(self, frameElement: str):
        """
        Sets the framenet layer of the word.

        PARAMETERS
        ----------
        frameElement : str
            New framenet tag of the word.
        """
        if self.__frameElement is not None:
            self.__frameElement = Argument(frameElement)
        else:
            self.__frameElement = None

    def getShallowParse(self) -> str:
        """
        Returns the shallow parse layer of the word.

        RETURNS
        -------
        str
            Shallow parse tag of the word.
        """
        return self.__shallowParse

    def setShallowParse(self, parse: str):
        """
        Sets the shallow parse layer of the word.

        PARAMETERS
        ----------
        parse : str
            New shallow parse tag of the word.
        """
        self.__shallowParse = parse

    def getUniversalDependency(self) -> UniversalDependencyRelation:
        """
        Returns the universal dependency layer of the word.

        RETURNS
        -------
        UniversalDependencyRelation
            Universal dependency relation of the word.
        """
        return self.__universalDependency

    def setUniversalDependency(self, to: int, dependencyType: str):
        """
        Sets the universal dependency layer of the word.

        PARAMETERS
        ----------
        to : int
            to Word related to.
        dependencyType : str
            type of dependency the word is related to.
        """
        self.__universalDependency = UniversalDependencyRelation(
            to, dependencyType)

    def getUniversalDependencyFormat(self, sentenceLength: int) -> str:
        if self.__parse is not None:
            result = self.name + "\t" + self.__parse.getWord().getName() + "\t" + \
                     self.__parse.getUniversalDependencyPos() + "\t_\t"
            features = self.__parse.getUniversalDependencyFeatures()
            if len(features) == 0:
                result = result + "_"
            else:
                first = True
                for feature in features:
                    if first:
                        first = False
                    else:
                        result += "|"
                    result += feature
            result += "\t"
            if self.__universalDependency is not None and self.__universalDependency.to(
            ) <= sentenceLength:
                result += self.__universalDependency.to().__str__() + "\t" + \
                          self.__universalDependency.__str__().lower() + "\t"
            else:
                result += "_\t_\t"
            result += "_\t_"
            return result
        else:
            return self.name + "\t" + self.name + "\t_\t_\t_\t_\t_\t_\t_"

    def getFormattedString(self, wordFormat: WordFormat):
        if wordFormat == WordFormat.SURFACE:
            return self.name
        return self.name

    def checkGazetteer(self, gazetteer: Gazetteer):
        wordLowercase = self.name.lower()
        if gazetteer.contains(wordLowercase) and self.__parse.containsTag(
                MorphologicalTag.PROPERNOUN):
            self.setNamedEntityType(gazetteer.getName())
        if "'" in wordLowercase and gazetteer.contains(wordLowercase[:wordLowercase.index("'")]) and \
                self.__parse.containsTag(MorphologicalTag.PROPERNOUN):
            self.setNamedEntityType(gazetteer.getName())