View difference between Paste ID: yHBbhE3s and wT5KTwZe
SHOW: | | - or go back to the newest paste.
1-
#! /bin/python
1+
2-
# Ported my own code in a different language (HASKELL)
2+
3-
# TO Python
3+
4-
# and not having haskells pure functional methods
4+
5-
# do hurt while porting to python :-/
5+
6
females = ["mother", "aunty", "daugther", "sister"]
7
levels = ["grand", "great", "great ", "great"]
8-
# This code lacks utils, code that will be sent later on
8+
9-
# Utils is easy peasy its just a shortest path finder
9+
10-
# and then digester
10+
11
grandparents = ["grandpa", "grandma", "grandfather", "grandmother"]
12
cousin = "cousin"
13
14
15
# This comes from My utils
16
# need to finish that
17
# basically what it does is
18
# look for the "lookup parameter"
19
# and then convert into these direct relations as possible
20
direct_relations = {
21
	"brother": "- male",
22
	"sister": "- female",
23
	"daughter" : "> female",
24
	"son": "> male",
25
	"father": "< male",
26
	"mother": "< female",
27
}
28
29
indirect_relations = {
30
	"cousin": "-- male | female",
31
	"uncle" : "-< male",
32
	"aunty" : "-< female",
33
	"nephew": "-> male",
34
	"neice": "-> female"
35
}
36
37
class Person():
38
	def __init__(self, gender):
39
		self.gender = gender
40
		self.parents = { 
41
								 "mother": None,
42
								 "father": None
43
				}; // Only two parents
44
		self.kids = {
45
			"sons": [],
46
			"daughters": [] 
47
		};
48
		self.siblings = []
49
		self.husband = None
50
		self.wife = None
51
	
52
	# deprecated
53
	# Finds the spouse, helpful in finding stuff
54
	def findSpouse(self):
55
		the_chosen_one = None
56
57
		if len(self.kids["daughters"]) > 0:
58
			the_chosen_one = self.kids["daughters"][0]
59
		if len(self.kids["sons"]) > 0:
60
			the_chosen_one = self.kids["sons"][0]
61
		if the_chosen_one is None:
62
			return None
63
64
		spouse = None
65
66
		if( self.gender is "male"):
67
			spouse = the_chosen_one.parents["mother"]
68
		if( self.gender is "female"):
69
			spouse = the_chosen_one.parents["father"]
70
71
		return spouse			
72
	
73
	def addSpouse(self, spouse):
74
		if relation in ["husband", "wife"]:
75
			self[relation] = spouse
76
			# Now the kids must be brothers and sisters :P
77
			# and blah blah blah
78
			# Okay this part of the code i am ashamed about completely 
79
			# unreadable
80
			for x in range(0, len(self.kids["daughter"])):				
81
				for y in range(0, len(spouse.kids["daugthers"])):
82
					spouse.kids["daughters"][y].addSibling( self.kids["daughter"][x], "sister")
83
					self.addChild(spouse.kids["daughters"][y], "daughter")
84
85
				for y in range(0, len(spouse.kids["sons"])):
86
					spouse.kids["sons"][y].addSibling( self.kids["daughter"][x], "sister")
87
					self.addChild(spouse.kids["sons"][y], "son")
88
89
			for x in range(0, len(self.kids["sons"])):				
90
				for y in range(0, len(spouse.kids["daugthers"])):
91
					spouse.kids["daughters"][y].addSibling( self.kids["sons"][x], "brother")
92
				for y in range(0, len(spouse.kids["sons"])):
93
					spouse.kids["sons"][y].addSibling( self.kids["sons"][x], "brother")
94
95
	# Adds child	
96
	def addChild(self, child, relation):
97
		if relation in ["son", "daughter"]:
98
			
99
			# Add brothers
100
			for i in range(0, len( self.kids["sons"] )):
101
				self.kids["sons"][i].addSibling(child)
102
			
103
			# Add sisters
104
			for i in range(0, len( self.kids["sons"] )):
105
				self.kids["sons"][i].addSibling(child)
106
107
108
			self.kids[relation + "s"].push(child)
109
			
110
			rel = "father"
111
			if self.gender is "female":
112
				rel = "mother"
113
114
			child.addParent(self, rel)
115
116
117
118
119
	def addGrandChild(self, child, relation):
120
		# Yes we know its grand child ... remove it
121
		relation = relation.replace("grand", "")
122
		
123
		gender = "male",
124
		rel = "son"
125
		
126
		if "maternal" in relation:
127
			gender = "female"
128
			rel = "daughter"
129
130
		parent =  Person(gender)
131
		self.addChild(parent, rel)
132
		parent.addChild(child, relation)
133
134
	# Adds parent
135
	def addParent(self, parent, relation):
136
		if relation in ["father", "mother"]:
137
			self.parents[relation] = parent
138
			rel = "son"
139
140
			if self.gender is "female":
141
				rel = "daughter"
142
			parent.addChild(self, rel)
143
144
	
145
	# Adds sibling
146
	def addSibling(self, sibling):
147
		sibling.parent["mother"] = self.parent["mother"] = self.parent["mother"] or sibling.parent["mother"]
148
		sibling.parent["father"] = self.parent["father"] = self.parent["father"] or sibling.parent["father"]
149
		self.siblings.push( sibling )
150
		sibling.siblings.push( self )
151
	
152
	# Add Cousins. .. to achieve that add Parent and then add sibling to a parent
153
	# Two virtual fathers are added here, this is ambigous
154
	# Simple case not handling paternal and maternal cases
155
	# Input : Maternal cousin brother
156
	# Input : Cousin Sister
157
	def addCousin(self, cousin, relation):
158
		# Add an uncle
159
		uncle =  Person("male")
160
161
		# Find out if the uncle is maternal or paternal
162
		# assume paternal if not present
163
		if "maternal" in relation:
164
			# Add a sibling to mom
165
			# or Add a mom and then add this cousin
166
			if self.parents["mother"] is None:
167
				self.parents["mother"] =  Person("female")
168
			self.parents["mother"].addSibling( uncle )
169
		else:
170
			if self.parents["father"] is None:
171
				self.parents["father"] =  Person("male")
172
			self.parents["father"].addSibling( uncle )
173
174
		if "brother" in relation:
175
			uncle.addChild( cousin, "son" )
176
177
		elif "sister" in relation:
178
			uncle.addChild( cousin, "daughter" )
179
		
180
		else: 
181
			throw Error("Unknown relation")
182
	
183
	
184
185
186
def feedData(sentence):
187
	sentence = sentence.lower()
188
	tokens = nltk.word_tokenize(sentence)
189
	relation = ""
190
	currentNode = None
191
	meNode = None
192
	tempNode = None
193
194
	for x in range(0, len(tokens)):
195
		relation = tokens[i]
196
		
197
		if relation is "my":
198
			meNode = tempNode =  Person("male")
199
200
		if relation in siblings:
201
			gen = "male"
202
			if relation is "sister":
203
				gen = "female"
204
			tempNode =  Person(gen)
205
			currentNode.addSibling(tempNode, relation)
206
207
		if relation in children:
208
			gen = "male"
209
			if relation is "daughter":
210
				gen = "female"
211
			tempNode =  Person(gen)
212
			currentNode.addSibling(tempNode, relation)
213
		
214
		if relation in parents:
215
			gen = "male"
216
			if relation is "mother":
217
				gen = "female"
218
			tempNode =  Person(gen)
219
			currentNode.addChild(tempNode, relation)
220
		if relation in grandparents:
221
			gen = "male"
222
			if relation is "grandma" or relation is "grandmother":
223
				gen = "female"
224
			tempNode =  Person(gen)
225
			currentNode.addChild(tempNode, relation)
226
227
		if "cousin" in relation:
228
			gen = "male"
229
			if "sister" in relation:
230
				gen = "female"
231
			tempNode =  Person(gen)
232
			currentNode.addCousin(tempNode, relation)
233
234
		currentNode = tempNode
235
236
	return (meNode, currentNode) 
237
238
#Finds relation in tuple(A, B) 
239
def digest(tree_tuple):
240
	# Find the shortest path applicable and return it as an array
241
	# Slightly modified version of the Graph traversal alogorithm
242
	# This guy goes and checks only for applicable keys
243
	relation_path = utils.NFA( tree_tuple[0], tree_tuple[1], looks_amongst = ["siblings", "kids.sons", "kids.daughters", "parent.mother", "parent.father"] )
244
	
245
	# when the list is returned visit each node
246
	# check what condition / relation the other node has
247
	# until you form a chain
248
	# first find indirect relations
249
	# then the left direct relations
250
	# name them and then print the string
251
	relation = utils.NamedRelation(
252
		direct_relations=direct_relations,
253
		indirect_relations= indirect_relations,
254
		lookup_key= "gender",
255
		relation_path)
256
	return relation
257
258
relation = "My brother's wife's son's sister"
259
tree = feedData(relation)
260
261
#output is My neice
262
print digest(tree)