aboutsummaryrefslogtreecommitdiff
path: root/tools/import_etcbc.py
blob: 4d752e7909425ee93eee1cb6cd778bc39cbdec77 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/usr/bin/env python3

from tf.fabric import Fabric
import csv
import re

VERB_STARTID=13
ROOT_STARTID=2

STEMS = {
    'qal':  'Qal',
    'hif':  'Hiphil',
    'piel': 'Piel',
    'nif':  'Niphal',
    'hit':  'Hitpael',
    'pual': 'Pual',
    'hof':  'Hophal'
    }

TENSES = {
    'perf': 'perfect',
    'impf': 'imperfect',
    #'wayq': 'wayyiqtol',
    'ptca': 'participle active',
    'infc': 'infinitive construct',
    'impv': 'imperative',
    'ptcp': 'participle passive',
    'infa': 'infinitive absolute'
    }

PERSONS = {'p1': 1, 'p2': 2, 'p3': 3, 'unknown': None}
GENDERS = {'m': 'm', 'f': 'f', 'unkown': None}
NUMBERS = {'sg': 's', 'pl': 'p', 'unknown': None}

class Root:
    def __init__(self, n):
        self.lex = F.lex_utf8.v(n)

    def __eq__(self, other):
        return self.lex == other.lex

    def __hash__(self):
        return hash(self.lex)

class Verb:
    def __init__(self, n):
        self.n = n
        verb = F.g_word_utf8.v(n)
        if verb is None or '\u05c3' in verb or '\u05be' in verb:
            raise ValueError('no text, sof pasuq or maqaf')
        # strip accents
        self.verb = re.sub(r'[^\u05b0-\u05bc\u05c1\u05c2\u05c7-\u05ea]', '', verb)
        self.root = F.lex_utf8.v(n)
        self.stem = STEMS[F.vs.v(n)]
        self.tense = TENSES[F.vt.v(n)]
        self.person = PERSONS[F.ps.v(n)]
        self.gender = GENDERS[F.gn.v(n)]
        self.number = NUMBERS[F.nu.v(n)]
        self.loc = T.sectionFromNode(n)

    def unpointed_word(self):
        return re.sub(r'[^\u05d0-\u05ea]', '', self.verb)

    def __eq__(self, other):
        return self.unpointed_word() == other.unpointed_word() and \
                self.root == other.root and \
                self.stem == other.stem and \
                self.tense == other.tense and \
                self.person == other.person and \
                self.gender == other.gender and \
                self.number == other.number

    def __hash__(self):
        return hash((self.unpointed_word(), self.root, self.stem, self.tense,
                     self.person, self.gender, self.number))

class Databank:
    def __init__(self):
        self.verbs = set()
        self.roots = set()

    def add_root(self, root):
        self.roots.add(root)

    def add_verb(self, verb):
        self.verbs.add(verb)

def handle(n, data):
    if F.language.v(n) != 'hbo': # Ancient Hebrew
        return
    data.add_verb(Verb(n))
    data.add_root(Root(n))

def main():
    TF = Fabric(
        modules=['hebrew/etcbc4c'],
        locations='~/VersionControl/etcbc-data',
        silent=True)
    api = TF.load('language g_word_utf8 lex_utf8 vs vt gn nu ps', silent=True)
    api.makeAvailableIn(globals())

    data = Databank()

    for n in N():
        try:
            handle(n, data)
        except (KeyError, ValueError):
            pass

    print(len(data.verbs), len(data.roots))

    with open('etcbc-verbs.csv', 'w') as csvverbs:
        verbwr = csv.writer(csvverbs, quoting=csv.QUOTE_MINIMAL)
        #verbwr.writerow(['id', 'verb','root','stem','tense','person','gender','number','active'])
        i = VERB_STARTID
        for verb in data.verbs:
            verbwr.writerow([
                i,
                verb.verb,
                verb.root,
                verb.stem,
                verb.tense,
                verb.person if verb.person is not None else 'NULL',
                verb.gender if verb.gender is not None else 'NULL',
                verb.number if verb.number is not None else 'NULL',
                1
                ])
            i += 1

    with open('etcbc-roots.csv', 'w') as csvroots:
        rootwr = csv.writer(csvroots, quoting=csv.QUOTE_MINIMAL)
        #rootwr.writerow(['id', 'root', 'root_kind_id'])
        i = ROOT_STARTID
        for root in data.roots:
            rootwr.writerow([i, root.lex, 1])
            i += 1


if __name__ == '__main__':
    main()