class MarriageRelationships1Tests(unittest.TestCase, TestUtilsMixin): nlp = spacy.load('fr') merger = quotemerger.HyphenatedNameMerger(nlp.vocab) nlp.add_pipe(merger.merger, first=True) def testM1FindsFatherNameAndHusbandName(self): self.notImplemented()
class MarriageRelationship5Tests(unittest.TestCase, TestUtilsMixin): nlp = spacy.load('fr') merger = quotemerger.HyphenatedNameMerger(nlp.vocab) nlp.add_pipe(merger.merger, first=True) def testM5FindsFatherNameAndHusbandName(self): test_case = """ Ce personnage avait jusqu’alors résidé à Alger où il avait épousé la belle Azîza-Bey, veuve de son frère. """ self.notImplemented()
class FatherDaughter1Tests(unittest.TestCase, TestUtilsMixin): nlp = spacy.load('fr') merger = quotemerger.HyphenatedNameMerger(nlp.vocab) nlp.add_pipe(merger.merger, first=True) def testFD1FindsFatherDaughterWhenBothPresent(self): test_case = "D’après lui, le bey de Constantine, allié â celui de Tunis, avait, dans le cours de Tannée précédente (1724) attaqué à Timproviste la tribu des Henanecha. Bou-Aziz, après s'être vu enlever par ses adversaires 8.000 têtes de bétail et une partie de ses bagages, était sur le point de se rendre, lorsque sa fille Euldjia « se fit apporter les vêtements les plus beaux « et, s’en étant vêtue, monta achevai, appela les femmes « et les filles, ses parentes ou ses amies qui montèrent « aussi à cheval ; puis, elle harangua les femmes en leur « disant : « Puisque ces hommes n’ont pas de courage « d’aller contre les Turcs qui viendront bientôt nous « violer à leurs yeux, allons nous-mêmes vendre chèrement notre vie et ne restons pas plus longtemps avec ces lâches." parsed_doc = self.nlp(test_case) relationship_set = RelationshipHandler() matcher = spacy.matcher.Matcher(self.nlp.vocab) matcher.add('FATHER_DAUGHTER_1', relationship_set.handle_fd_1, patterns.MATCHERS['FATHER_DAUGHTER_1']) matches = matcher(parsed_doc) self.assertEqual(1, len(relationship_set.relationships)) relationship = relationship_set.relationships[0] self.assertEqual('Bou-Aziz', relationship.father) self.assertEqual('Euldjia', relationship.daughter) def testFD1FindsFatherDaughterWhenCommaSeparatesFilleAndName(self): test_case = "D’après lui, le bey de Constantine, allié â celui de Tunis, avait, dans le cours de Tannée précédente (1724) attaqué à Timproviste la tribu des Henanecha. Bou-Aziz, après s'être vu enlever par ses adversaires 8.000 têtes de bétail et une partie de ses bagages, était sur le point de se rendre, lorsque sa fille, Euldjia « se fit apporter les vêtements les plus beaux « et, s’en étant vêtue, monta achevai, appela les femmes « et les filles, ses parentes ou ses amies qui montèrent « aussi à cheval ; puis, elle harangua les femmes en leur « disant : « Puisque ces hommes n’ont pas de courage « d’aller contre les Turcs qui viendront bientôt nous « violer à leurs yeux, allons nous-mêmes vendre chèrement notre vie et ne restons pas plus longtemps avec ces lâches." parsed_doc = self.nlp(test_case) relationship_set = RelationshipHandler() matcher = spacy.matcher.Matcher(self.nlp.vocab) matcher.add('FATHER_DAUGHTER_1', relationship_set.handle_fd_1, patterns.MATCHERS['FATHER_DAUGHTER_1']) matches = matcher(parsed_doc) self.assertEqual(1, len(relationship_set.relationships)) relationship = relationship_set.relationships[0] self.assertEqual('Bou-Aziz', relationship.father) self.assertEqual('Euldjia', relationship.daughter) def testFD1DoesNotFindFatherDaughterWhenFatherNotPresentInParagraph(self): test_case = "Il, après s'être vu enlever par ses adversaires 8.000 têtes de bétail et une partie de ses bagages, était sur le point de se rendre, lorsque sa fille, Euldjia « se fit apporter les vêtements les plus beaux « et, s’en étant vêtue, monta achevai, appela les femmes « et les filles, ses parentes ou ses amies qui montèrent « aussi à cheval ; puis, elle harangua les femmes en leur « disant : « Puisque ces hommes n’ont pas de courage « d’aller contre les Turcs qui viendront bientôt nous « violer à leurs yeux, allons nous-mêmes vendre chèrement notre vie et ne restons pas plus longtemps avec ces lâches." parsed_doc = self.nlp(test_case) relationship_set = RelationshipHandler() matcher = spacy.matcher.Matcher(self.nlp.vocab) matcher.add('FATHER_DAUGHTER_1', relationship_set.handle_fd_1, patterns.MATCHERS['FATHER_DAUGHTER_1']) matches = matcher(parsed_doc) self.assertEqual(0, len(relationship_set.relationships)) def testFD1DoesNotFindFatherDaughterWhenCapitalizedNonNameIsPresentAfterSaFille( self): test_case = "Il, après s'être vu enlever par ses adversaires 8.000 têtes de bétail et une partie de ses bagages, était sur le point de se rendre, lorsque sa fille « se fit apporter les vêtements les plus beaux « et, s’en étant vêtue, monta achevai, appela les femmes « et les filles, ses parentes ou ses amies qui montèrent « aussi à cheval ; puis, elle harangua les femmes en leur « disant : « Puisque ces hommes n’ont pas de courage « d’aller contre les Turcs qui viendront bientôt nous « violer à leurs yeux, allons nous-mêmes vendre chèrement notre vie et ne restons pas plus longtemps avec ces lâches." parsed_doc = self.nlp(test_case) relationship_set = RelationshipHandler() matcher = spacy.matcher.Matcher(self.nlp.vocab) matcher.add('FATHER_DAUGHTER_1', relationship_set.handle_fd_1, patterns.MATCHERS['FATHER_DAUGHTER_1']) matches = matcher(parsed_doc) self.assertEqual(0, len(relationship_set.relationships))
class MarriageRelationship4Tests(unittest.TestCase, TestUtilsMixin): nlp = spacy.load('fr') merger = quotemerger.HyphenatedNameMerger(nlp.vocab) nlp.add_pipe(merger.merger, first=True) def testM4FindsFatherNameAndHusbandName(self): test_case = """Avec la fraction la plus turbulente des Douaouda commandée par Oum-Hanni veuve de Ahmed Ben Selthri, il contracta une alliance en épousant sa fille. """ parsed_doc = self.nlp(test_case) self.assertEqual('') self.notImplemented()
def main(): in_file = codecs.open('Mercier_1600-1837.txt').read() nlp = spacy.load('fr') print('Model loaded ...') merger = quotemerger.HyphenatedNameMerger(nlp.vocab) nlp.add_pipe(merger.merger, first=True) parsed_doc = nlp(in_file) print('Parsed doc ...') named_people = {} relationship_set = PeopleSet(named_people) for ent in parsed_doc.ents: if ent.label_ == 'PERSON': name = name_from_text(ent) named_people[name] = Person(name) print('Found all people ...') # for name in sorted(named_people.keys()): # print(name) # Iterate through all matches and update relationships matcher = spacy.matcher.Matcher(nlp.vocab) matcher.add('FATHER_SON_1', relationship_set.handle_fs_1, MATCHERS['FATHER_SON_1']) matcher.add('FATHER_SON_2', relationship_set.handle_fs_2, MATCHERS['FATHER_SON_2']) matcher.add('FATHER_SON_3', relationship_set.handle_fs_3, MATCHERS['FATHER_SON_3']) matcher.add('FATHER_DAUGHTER_2', relationship_set.handle_fd_2, MATCHERS['FATHER_DAUGHTER_2']) matcher.add('FATHER_DAUGHTER_4', relationship_set.handle_fd_4, MATCHERS['FATHER_DAUGHTER_4']) matcher.add('GENDRE_1', relationship_set.handle_gendre_1, MATCHERS['GENDRE_1']) matcher.add('GENDRE_2', relationship_set.handle_gendre_2, MATCHERS['GENDRE_2']) parsed_doc = nlp(in_file) matcher(parsed_doc) for _, person in relationship_set.people.items(): for child in person.children: print('{} is the {} of {}'.format(person.name, gender_to_parent(person.gender), child))
class FatherDaughter4Tests(unittest.TestCase, TestUtilsMixin): nlp = spacy.load('fr') merger = quotemerger.HyphenatedNameMerger(nlp.vocab) nlp.add_pipe(merger.merger, first=True) def testFD4FindsFatherWhenPresentAndLaIsPresent(self): test_case = "Comme sa femme préférée, la fille de Ben-Gana, ne lui avait pas donné d’enfants, il épousa une fille des Mokrani, seigneurs de la Medjana." parsed_doc = self.nlp(test_case) relationship_set = RelationshipHandler() matcher = spacy.matcher.Matcher(self.nlp.vocab) matcher.add('FATHER_DAUGHTER_4', relationship_set.handle_fd_4, patterns.MATCHERS['FATHER_DAUGHTER_4']) matches = matcher(parsed_doc) self.assertEqual(1, len(relationship_set.relationships)) relationship = relationship_set.relationships[0] self.assertEqual(relationship.father, 'Ben-Gana') self.assertEqual(relationship.daughter, 'unnamed daughter') def testFD4FindsFatherWhenPresentAndUneIsPresent(self): test_case = "Comme sa femme préférée, une fille de Ben-Gana, ne lui avait pas donné d’enfants, il épousa une fille des Mokrani, seigneurs de la Medjana." parsed_doc = self.nlp(test_case) relationship_set = RelationshipHandler() matcher = spacy.matcher.Matcher(self.nlp.vocab) matcher.add('FATHER_DAUGHTER_4', relationship_set.handle_fd_4, patterns.MATCHERS['FATHER_DAUGHTER_4']) matches = matcher(parsed_doc) self.assertEqual(1, len(relationship_set.relationships)) relationship = relationship_set.relationships[0] self.assertEqual(relationship.father, 'Ben-Gana') self.assertEqual(relationship.daughter, 'unnamed daughter') def testFD4DoesNotFindFatherDaughterWhenFatherNotPresentInParagraph(self): test_case = "Comme sa femme préférée, une fille du cheik, ne lui avait pas donné d’enfants, il épousa une fille des Mokrani, seigneurs de la Medjana." parsed_doc = self.nlp(test_case) relationship_set = RelationshipHandler() matcher = spacy.matcher.Matcher(self.nlp.vocab) matcher.add('FATHER_DAUGHTER_4', relationship_set.handle_fd_4, patterns.MATCHERS['FATHER_DAUGHTER_4']) matches = matcher(parsed_doc) self.assertEqual(0, len(relationship_set.relationships))
def main(): in_file = codecs.open('Mercier_1600-1837.txt').read() relationship_set = RelationshipHandler() merger = quotemerger.HyphenatedNameMerger(nlp.vocab) nlp.add_pipe(merger.merger, first=True) matcher.add('FATHER_SON_1', relationship_set.handle_fs_1, MATCHERS['FATHER_SON_1']) matcher.add('FATHER_SON_2', relationship_set.handle_fs_2, MATCHERS['FATHER_SON_2']) matcher.add('FATHER_SON_3', relationship_set.handle_fs_3, MATCHERS['FATHER_SON_3']) matcher.add('FATHER_DAUGHTER_1', relationship_set.handle_fd_1, MATCHERS['FATHER_DAUGHTER_1']) matcher.add('FATHER_DAUGHTER_2', relationship_set.handle_fd_2, MATCHERS['FATHER_DAUGHTER_2']) matcher.add('FATHER_DAUGHTER_3', relationship_set.handle_fd_3, MATCHERS['FATHER_DAUGHTER_3']) matcher.add('FATHER_DAUGHTER_4', relationship_set.handle_fd_4, MATCHERS['FATHER_DAUGHTER_4']) matcher.add('MARIAGE_1', relationship_set.handle_mariage_1_and_2, MATCHERS['MARIAGE_1']) matcher.add('MARIAGE_2', relationship_set.handle_mariage_1_and_2, MATCHERS['MARIAGE_2']) matcher.add('MARIAGE_3', relationship_set.handle_mariage_3_and_4, MATCHERS['MARIAGE_3']) matcher.add('MARIAGE_4', relationship_set.handle_mariage_3_and_4, MATCHERS['MARIAGE_4']) matcher.add('MARIAGE_5', relationship_set.handle_mariage_5, MATCHERS['MARIAGE_5']) matcher.add('MARIAGE_6', relationship_set.handle_mariage_6, MATCHERS['MARIAGE_6']) matcher.add('GENDRE_1', relationship_set.handle_gendre_1, MATCHERS['GENDRE_1']) matcher.add('GENDRE_2', relationship_set.handle_gendre_2, MATCHERS['GENDRE_2']) matcher.add('GENDRE_3', relationship_set.handle_gendre_3, MATCHERS['GENDRE_3']) matcher.add('PERE', relationship_set.handle_pere_1, MATCHERS['PERE']) parsed_doc = nlp(in_file) matches = matcher(parsed_doc) out_file = codecs.open('relations.csv', 'w', encoding='utf8') out_file.write('parent,child,relation type\n') for rel in relationship_set.relationships: if isinstance(rel, FatherSonRelationship): out_file.write('{},{},son\n'.format(rel.father, rel.son)) print('{} is the father of {}'.format(rel.father, rel.son)) elif isinstance(rel, FatherDaughterRelationship): out_file.write('{},{},daughter\n'.format(rel.father, rel.daughter)) print('{} is the father of {}'.format(rel.father, rel.daughter)) elif isinstance(rel, GendreRelationship): out_file.write('{},{},daughter'.format(rel.father, rel.name)) out_file.write('{},{},spouse'.format(rel.husband, rel.name)) print('An unnamed woman is the daughter of {} and husband of {}'. format(rel.father, rel.husband)) out_file.close() print('Matchers done')