[docs]classClause(Unit):"""節クラス."""count=0def__init__(self)->None:super().__init__()# parent unitself._sentence:Optional["Sentence"]=None# child unitsself._phrases:Optional[list[Phrase]]=Noneself.discourse_relations:list[DiscourseRelation]=[]#: 談話関係のリスト.self.index=self.count#: 文内におけるインデックス.Clause.count+=1@overridedef__post_init__(self)->None:super().__post_init__()# Find discourse relations.forkeyinself.end.features:ifkey.startswith("節-機能"):relation=DiscourseRelation.from_clause_function_fstring(key,modifier=self)ifrelationisnotNone:ifrelationnotinrelation.modifier.discourse_relations:relation.modifier.discourse_relations.append(relation)forbase_phraseinself.base_phrases:forkeyinbase_phrase.features:ifkey.startswith("節-前向き機能"):ifbase_phrase.parentisNoneorbase_phrase.parentinself.base_phrases:head=selfelse:head=base_phrase.parent.clauserelation=DiscourseRelation.from_backward_clause_function_fstring(key,head=head)ifrelationisnotNone:ifrelationnotinrelation.modifier.discourse_relations:relation.modifier.discourse_relations.append(relation)values=self.end.features.get("談話関係")ifvalues:assertisinstance(values,str)forvalueinvalues.split(";"):relation=DiscourseRelation.from_discourse_relation_fstring(value,modifier=self)ifrelationisnotNone:ifrelationnotinrelation.modifier.discourse_relations:relation.modifier.discourse_relations.append(relation)@overridedef__eq__(self,other:object)->bool:ifnotisinstance(other,type(self)):returnFalseifself.parent_unit!=other.parent_unit:returnFalsereturnself.index==other.index@cached_propertydefglobal_index(self)->int:"""文書全体におけるインデックス."""ifnotself.sentence.has_document():returnself.indexifself.sentence.index==0:returnself.indexifself.index>0:returnself.sentence.clauses[0].global_index+self.indexprev_sentence=self.document.sentences[self.sentence.index-1]returnprev_sentence.clauses[0].global_index+len(prev_sentence.clauses)@propertydefparent_unit(self)->Optional["Sentence"]:"""上位の言語単位(文).未登録なら None."""returnself._sentence@propertydefchild_units(self)->Optional[list[Phrase]]:"""下位の言語単位(文節).解析結果にアクセスできないなら None."""returnself._phrases@propertydefdocument(self)->"Document":"""文書. Raises: AttributeError: 解析結果にアクセスできない場合. """returnself.sentence.document@propertydefsentence(self)->"Sentence":"""文."""assertself._sentenceisnotNonereturnself._sentence@sentence.setterdefsentence(self,sentence:"Sentence")->None:"""文. Args: sentence: 文. """self._sentence=sentence@propertydefphrases(self)->list[Phrase]:"""文節のリスト."""assertself._phrasesisnotNonereturnself._phrases@phrases.setterdefphrases(self,phrases:list[Phrase])->None:"""文節のリスト. Args: phrases: 文節のリスト. """forphraseinphrases:phrase.clause=selfself._phrases=phrases@propertydefbase_phrases(self)->list[BasePhrase]:"""基本句のリスト."""return[base_phraseforphraseinself.phrasesforbase_phraseinphrase.base_phrases]@propertydefmorphemes(self)->list[Morpheme]:"""形態素のリスト."""return[morphemeforbase_phraseinself.base_phrasesformorphemeinbase_phrase.morphemes]@cached_propertydefhead(self)->BasePhrase:"""節主辞の基本句."""heads:list[BasePhrase]=[]forbase_phraseinself.base_phrases:if"節-主辞"inbase_phrase.features:heads.append(base_phrase)iflen(heads)==1:returnheads[0]eliflen(heads)>1:logger.warning("found multiple heads in a clause; use the last base phrase as the head")returnheads[-1]else:logger.warning("found no head in a clause; use the last base phrase as the head")returnself.base_phrases[-1]@propertydefend(self)->BasePhrase:"""節区切の基本句."""returnself.base_phrases[-1]@cached_propertydefparent(self)->Optional["Clause"]:"""係り先の節.ないなら None."""head_parent=self.head.parentwhilehead_parentinself.base_phrases:head_parent=head_parent.parentforclauseinself.sentence.clauses:ifhead_parentinclause.base_phrases:returnclausereturnNone@cached_propertydefchildren(self)->list["Clause"]:"""この節に係っている節のリスト."""return[clauseforclauseinself.sentence.clausesifclause.parent==self]