def extract_number_context(text, ): """ Extract number words in a text within context. Example: >>> extract_number_context(u"وجدت خمسمئة وثلاثة وعشرين دينارا فاشتريت ثلاثة عشر دفترا") وجدت، خمسمئة وثلاثة وعشرين، دينارا فاشتريت، ثلاثة عشر ، دفتر @param text: input text @type text: unicode @return: number words extracted from text @rtype: integer """ phrases = [] wordlist = araby.tokenize(text) positions = detect_number_phrases_position(wordlist) for pos in positions: if len(pos) >= 2: if pos[0] <= len(wordlist) and pos[1] <= len(wordlist): if pos[0] - 1 >= 0: prev = wordlist[pos[0] - 1] else: prev = u'' if pos[1] + 1 < len(wordlist): nextword = wordlist[pos[1] + 1] else: nextword = u'' phrases.append( \ (prev, u' '.join(wordlist[pos[0]:pos[1] + 1]), nextword)) return phrases
def detectNumberWords(text): """ Detect number words in a text. @param text: input text @type text: unicode @return : number words extracted from text @rtype: integer >>> text2number(u"وجدت خمسمئة وثلاثة وعشرين دينارا"); خمسمئة وثلاثة وعشرين """ words=araby.tokenize(text) #print words; phrasesContext=extractNumberPhrasesWithinContext(text); for phCon in phrasesContext: if len(phCon)>=3: previous=phCon[0]; phrase=phCon[1]; next=phCon[2]; numberedwords=phrase; numeric = text2number(numberedwords); tags = getPreviousTag(previous); vocalized = vocalizeNumber(araby.stripTashkeel(numberedwords).split(' '), tags); #calcul vocalization similarity : sim = araby.vocalizedSimilarity(numberedwords, vocalized); vocUnit=vocalizeUnit(numeric, next); simUnit = araby.vocalizedSimilarity(vocUnit, next); if sim<0: print(u'\t'.join([str(sim), numberedwords, vocalized, str(numeric), u' '.join([previous,phrase, next]), next, vocUnit, str(simUnit)]).encode('utf8'));
def detectNumberWords(text): """ Detect number words in a text. @param text: input text @type text: unicode @return : number words extracted from text @rtype: integer >>> text2number(u"وجدت خمسمئة وثلاثة وعشرين دينارا"); خمسمئة وثلاثة وعشرين """ words=araby.tokenize(text) #print words; phrasesContext=extractNumberPhrasesWithinContext(text); for phCon in phrasesContext: if len(phCon)>=3: previous=phCon[0]; phrase=phCon[1]; next=phCon[2]; numberedwords=phrase; numeric = text2number(numberedwords); tags = getPreviousTag(previous); vocalized = vocalizeNumber(araby.stripTashkeel(numberedwords).split(' '), tags); #calcul vocalization similarity : sim = araby.vocalizedSimilarity(numberedwords, vocalized); vocUnit=vocalizeUnit(numeric, next); simUnit = araby.vocalizedSimilarity(vocUnit, next); if sim<0: print u'\t'.join([str(sim), numberedwords, vocalized, str(numeric), u' '.join([previous,phrase, next]), next, vocUnit, str(simUnit)]).encode('utf8');
def extractNumberPhrasesWithinContext(text): """ Extract number words in a text. @param text: input text @type text: unicode @return : number words extracted from text @rtype: integer >>> extractNumberPhrasesWithinContext(u"وجدت خمسمئة وثلاثة وعشرين دينارا فاشتريت ثلاثة عشر دفترا"); وجدت، خمسمئة وثلاثة وعشرين، دينارا فاشتريت، ثلاثة عشر ، دفترا """ phrases=[]; wordlist = araby.tokenize(text); positions= detectNumberPhrasesPosition(wordlist); for pos in positions: if len(pos)>=2: if pos[0]<=len(wordlist) and pos[1]<=len(wordlist): if pos[0]-1>=0: previous= wordlist[pos[0]-1]; else: previous=u''; if pos[1]+1<len(wordlist): next= wordlist[pos[1]+1]; else: next=u''; phrases.append((previous, u' '.join(wordlist[pos[0]: pos[1]+1]), next)) return phrases;
def extractNumberPhrases(text): """ Extract number words in a text. @param text: input text @type text: unicode @return : number words extracted from text @rtype: integer >>> extractNumberPhrases(u"وجدت خمسمئة وثلاثة وعشرين دينارا فاشتريت ثلاثة عشر دفترا"); خمسمئة وثلاثة وعشرين ثلاثة عشر """ phrases=[]; wordlist = araby.tokenize(text)#text.split(' '); positions= detectNumberPhrasesPosition(wordlist); for pos in positions: if len(pos)>=2: if pos[0]<=len(wordlist) and pos[1]<=len(wordlist): phrases.append(u' '.join(wordlist[pos[0]: pos[1]+1])) return phrases;
def test_tokenize(self): """Test tokenize function ?""" text1 = u"العربية: لغة جميلة." wordlist = [u'العربية', u":", u"لغة", u"جميلة", u"."] self.assertEqual(ar.tokenize(text1), wordlist)
# import number as ArabicNumberToLetters TEXTS = [u"مليونان وألفان وإثنا عشر", u"جاء مليونان وألفان وإثنا عشر", u"وجدت خمسمئة وثلاث وعشرون دينارا", u"خمسمئة وثلاث وعشرون دينارا", u"وجدت خمسمئة وثلاثة وعشرين دينارا فاشتريت ثلاثة عشر دفترا", u"لم أجد شيئا", u"وجدت خمسمئة وثلاثة وعشرين دينارا فاشتريت ثلاثة عشر دفترا", u'من ثلاثمئة وخمسين بلدا ', u'من ثلاثمئة وخمسين بلدا ', u'من أربعمئة وخمسين بلدا ', u'السلام عليكم 2014', ] # ~ arepr = arabrepr.ArabicRepr() for txt in TEXTS: word_list = araby.tokenize(txt) positions_phrases = detect_number_phrases_position(word_list) print(positions_phrases) nb_phrases = extract_number_phrases(txt) tag_list = detect_numbers(word_list) print(tag_list) print(u" ".join(word_list)) print(zip(tag_list, word_list)) print('tashkeel') tashkeel = u" ".join(pre_tashkeel_number(word_list)) if sys.version_info < (3, 0): print(tashkeel.encode('utf8')) else: print(tashkeel) print(u'\t'.join(nb_phrases)) print("detect number word")
# get the context of current number phrase if startPos-1>=0: previous= wordlist[startPos-1]; else: previous=u''; if endPos+1<len(wordlist): next= wordlist[endPos+1]; else: next=u''; #get the tag of previous word tags = getPreviousTag(previous); vocalized = vocalizeNumber(wordlist[startPos: endPos+1], tags); wordlist = wordlist[:startPos] + vocalized +wordlist[endPos+1:] return wordlist; if __name__ == '__main__': #import number as ArabicNumberToLetters texts=[u"مليونان وألفان وإثنا عشر", u"جاء مليونان وألفان وإثنا عشر", u"وجدت خمسمئة وثلاث وعشرون دينارا", u"خمسمئة وثلاث وعشرون دينارا", u"وجدت خمسمئة وثلاثة وعشرين دينارا فاشتريت ثلاثة عشر دفترا", u"لم أجد شيئا", u'من ثلائمئة وخمسين بلدا ', u'من ثلاثمئة وخمسين بلدا ', u'من أربعمئة وخمسين بلدا ', ]; for text in texts: # result = detectNumberWords(text); # print u";".join(result).encode('utf8'); positions= detectNumberPhrasesPosition(araby.tokenize(text)); print(positions); phrases = extractNumberPhrases(text); print(text.encode('utf8')); print(u'\t'.join(phrases).encode('utf8'));
# get the context of current number phrase if startPos-1>=0: previous= wordlist[startPos-1]; else: previous=u''; if endPos+1<len(wordlist): next= wordlist[endPos+1]; else: next=u''; #get the tag of previous word tags = getPreviousTag(previous); vocalized = vocalizeNumber(wordlist[startPos: endPos+1], tags); wordlist = wordlist[:startPos] + vocalized +wordlist[endPos+1:] return wordlist; if __name__ == '__main__': #import number as ArabicNumberToLetters texts=[u"مليونان وألفان وإثنا عشر", u"جاء مليونان وألفان وإثنا عشر", u"وجدت خمسمئة وثلاث وعشرون دينارا", u"خمسمئة وثلاث وعشرون دينارا", u"وجدت خمسمئة وثلاثة وعشرين دينارا فاشتريت ثلاثة عشر دفترا", u"لم أجد شيئا", u'من ثلائمئة وخمسين بلدا ', u'من ثلاثمئة وخمسين بلدا ', u'من أربعمئة وخمسين بلدا ', ]; for text in texts: # result = detectNumberWords(text); # print u";".join(result).encode('utf8'); positions= detectNumberPhrasesPosition(araby.tokenize(text)); print positions; phrases = extractNumberPhrases(text); print text.encode('utf8'); print u'\t'.join(phrases).encode('utf8');