Пример #1
0
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()
Пример #2
0
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))
Пример #4
0
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')