2016-12-28 5 views
0

Я хочу преобразовать числовые, которые представлены в словах в числа.Как преобразовать числовые слова в числовые в python

например, thirty four thousand four fifty в соответствующее числовое значение 34450. Также есть некоторые нечеткие преобразования, такие как "Please pay thirty-four thousand four fifty dollars", тогда выход будет 34450.

+0

Вот глупая реализация: http://pastebin.com/WwFCjYtt =) – alvas

ответ

2

Для чисел в слова, попробуйте "num2words" пакет: https://pypi.python.org/pypi/num2words

Для слов в NUM, я слегка подправил код из кода здесь: Is there a way to convert number words to Integers?

from num2words import num2words 

def text2int(textnum, numwords={}): 
    if not numwords: 
     units = [ 
     "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", 
     "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", 
     "sixteen", "seventeen", "eighteen", "nineteen", 
     ] 

     tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"] 

     scales = ["hundred", "thousand", "million", "billion", "trillion"] 

     numwords["and"] = (1, 0) 
     for idx, word in enumerate(units): numwords[word] = (1, idx) 
     for idx, word in enumerate(tens):  numwords[word] = (1, idx * 10) 
     for idx, word in enumerate(scales): numwords[word] = (10 ** (idx * 3 or 2), 0) 

    current = result = 0 
    for word in textnum.split(): 
     if word not in numwords: 
      raise Exception("Illegal word: " + word) 

     scale, increment = numwords[word] 
     current = current * scale + increment 
     if scale > 100: 
      result += current 
      current = 0 

    return result + current 

#### My update to incorporate decimals 
num = 5000222223.28 
fullText = num2words(num).replace('-',' ').replace(',',' ') 
print fullText 

decimalSplit = fullText.split('point ') 

if len(decimalSplit) > 1: 
    decimalSplit2 = decimalSplit[1].split(' ') 
    decPart = sum([float(text2int(decimalSplit2[x]))/(10)**(x+1) for x in range(len(decimalSplit2))]) 
else: 
    decPart = 0 

intPart = float(text2int(decimalSplit[0])) 

Value = intPart + decPart 

print Value 

-> пяти миллиардов два сто двадцать две тысячи двести двадцать три пункта две восемь

-> 5000222223.28

+0

Я попросил слово на номер, а не число на слова –

+0

Я обновил ответ – Oxymoron88

+0

Я не думаю, что он сможет конвертировать десятичные точки @ Oxymoron88 –