|  | @@ -0,0 +1,121 @@
 | 
	
		
			
				|  |  | +# -*- coding: utf-8 -*-
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import re, math
 | 
	
		
			
				|  |  | +from collections import Counter
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +# user_said = "maman je voudrais ecouter ACDC"
 | 
	
		
			
				|  |  | +# order = "je voudrais ecouter {{ artist_name }}"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +user_said = "s'il te plait regle le reveil pour dix huit heures et dix neuf  minutes trente trois  secondes cent quatre vingt dix "
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +user_said_list = [" regle le reveil pour neuf  heures et quinze minutes trente trois secondes ",
 | 
	
		
			
				|  |  | +                 "s'il te plait regle le reveil pour dix huit huf  minutes trente trois  secondes cent quatre vingt dix ",
 | 
	
		
			
				|  |  | +                 "regle pour dix huit heures et   trente trois  secondes cent quatre vingt dix ",
 | 
	
		
			
				|  |  | +                 "s'il te plait regle le reveil poutes trente trois  secondes cent quatre vingt dix ",
 | 
	
		
			
				|  |  | +                 "RIEN A VOIR",
 | 
	
		
			
				|  |  | +                " minutes neuf trente reveil regle secondes  quinze  le heures et    trois  pour "
 | 
	
		
			
				|  |  | +                  ]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +order = "{{ politesse }} regle le reveil pour {{ hour}} heures et {{minute }} minutes {{ seconde  }} secondes {{mili}}"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +order_list = ["regle le reveil pour  heures et  minutes  secondes ",
 | 
	
		
			
				|  |  | +              "{{ politesse }} regle le reveil pour {{ hour}} heures et {{minute }} minutes {{ seconde  }} secondes {{mili}}",
 | 
	
		
			
				|  |  | +              "politesse  regle le reveil pour  hour heures et minute  minutes  seconde   secondes mili",
 | 
	
		
			
				|  |  | +              " reveil pour {{ hour}}  et {{minute }} minutes  secondes {{mili}}",
 | 
	
		
			
				|  |  | +              "{{ politesse }} regle le reveil pour "
 | 
	
		
			
				|  |  | +              ]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +# take a look to each order
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +WORD = re.compile(r'\w+')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def get_cosine(vec1, vec2):
 | 
	
		
			
				|  |  | +     intersection = set(vec1.keys()) & set(vec2.keys())
 | 
	
		
			
				|  |  | +     numerator = sum([vec1[x] * vec2[x] for x in intersection])
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +     sum1 = sum([vec1[x]**2 for x in vec1.keys()])
 | 
	
		
			
				|  |  | +     sum2 = sum([vec2[x]**2 for x in vec2.keys()])
 | 
	
		
			
				|  |  | +     denominator = math.sqrt(sum1) * math.sqrt(sum2)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +     if not denominator:
 | 
	
		
			
				|  |  | +        return 0.0
 | 
	
		
			
				|  |  | +     else:
 | 
	
		
			
				|  |  | +        return float(numerator) / denominator
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def text_to_vector(text):
 | 
	
		
			
				|  |  | +     words = WORD.findall(text)
 | 
	
		
			
				|  |  | +     return Counter(words)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def _is_containing_bracket(sentence):
 | 
	
		
			
				|  |  | +    # print "sentence to test %s" % sentence
 | 
	
		
			
				|  |  | +    pattern = r"{{|}}"
 | 
	
		
			
				|  |  | +    # prog = re.compile(pattern)
 | 
	
		
			
				|  |  | +    bool = re.search(pattern, sentence)
 | 
	
		
			
				|  |  | +    if bool is not None:
 | 
	
		
			
				|  |  | +        return True
 | 
	
		
			
				|  |  | +    return False
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def _get_next_value_list(list):
 | 
	
		
			
				|  |  | +    ite = list.__iter__()
 | 
	
		
			
				|  |  | +    next(ite, None)
 | 
	
		
			
				|  |  | +    return next(ite, None)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +# check if the order contain bracket
 | 
	
		
			
				|  |  | +if _is_containing_bracket(order):
 | 
	
		
			
				|  |  | +    # remove white space between {{ and }}
 | 
	
		
			
				|  |  | +    # get a table of word said
 | 
	
		
			
				|  |  | +    list_word_in_order = re.sub('\s+(?=[^\{\{\}\}]*\}\})', '',order).split()
 | 
	
		
			
				|  |  | +    print "order matched: %s" % list_word_in_order
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # get the order, defined by the first words before {{
 | 
	
		
			
				|  |  | +    the_order = order[:order.find('{{')]
 | 
	
		
			
				|  |  | +    print "the order catched %s" % the_order
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # remove sentence before order
 | 
	
		
			
				|  |  | +    nb = user_said[user_said.find(the_order):]
 | 
	
		
			
				|  |  | +    truncate_list_word_said = nb.split()
 | 
	
		
			
				|  |  | +    print "truncate_list_word_said : %s" % truncate_list_word_said
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # make dict var:value
 | 
	
		
			
				|  |  | +    dictVar = {}
 | 
	
		
			
				|  |  | +    for idx, ow in enumerate(list_word_in_order):
 | 
	
		
			
				|  |  | +        if _is_containing_bracket(ow):
 | 
	
		
			
				|  |  | +            # remove bracket et key dict
 | 
	
		
			
				|  |  | +            varname = ow.replace("{{","").replace("}}", "")
 | 
	
		
			
				|  |  | +            stopValue = _get_next_value_list(list_word_in_order[idx:])
 | 
	
		
			
				|  |  | +            if stopValue is None:
 | 
	
		
			
				|  |  | +                dictVar[varname] = " ".join(truncate_list_word_said)
 | 
	
		
			
				|  |  | +                break
 | 
	
		
			
				|  |  | +            for word_said in truncate_list_word_said:
 | 
	
		
			
				|  |  | +                if word_said == stopValue: break
 | 
	
		
			
				|  |  | +                if varname in dictVar:
 | 
	
		
			
				|  |  | +                    dictVar[varname] += " " + word_said
 | 
	
		
			
				|  |  | +                    truncate_list_word_said = truncate_list_word_said[1:]
 | 
	
		
			
				|  |  | +                else:
 | 
	
		
			
				|  |  | +                    dictVar[varname] = word_said
 | 
	
		
			
				|  |  | +        truncate_list_word_said = truncate_list_word_said[1:]
 | 
	
		
			
				|  |  | +    print "The dict Var : %s" % dictVar
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +for us in user_said_list:
 | 
	
		
			
				|  |  | +    for od in order_list:
 | 
	
		
			
				|  |  | +        vector1 = text_to_vector(us)
 | 
	
		
			
				|  |  | +        vector2 = text_to_vector(od)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        cosine = get_cosine(vector1, vector2)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        print "Cosine -> ", cosine, " for usersaid: ",us, " ,order:", od
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 |