Выразите число словами в Mathematica

Я слышал, что мы можем использовать английские слова, чтобы выразить число в Mathematica. Например, используя Сто, чтобы выразить 100. Какая функция может это сделать?


person Yongwei Xing    schedule 09.09.2009    source источник
comment
Вы имеете в виду, как читать слова и получать число, или взять число и сгенерировать слова?   -  person Pillsy    schedule 10.09.2009


Ответы (4)


Решение, в основном эквивалентное решению Дривса (но недоступное во время его ответа), состояло бы в том, чтобы вызвать WolframAlpha[] непосредственно из Mathematica (для этого требуется подключение к Интернету). Например,

WolframAlpha["6 million 2 hundred and 12 thousand and fifty two", 
             {{"Input", 1}, "Plaintext"}]

возвращает строку

"6212052"

Итак, мы можем построить следующую функцию, которая возвращает фактическое число

textToNumber[num_String] := 
 Module[{in = WolframAlpha[num, {{"Input", 1}, "Plaintext"}]},
  If[StringMatchQ[in, NumberString], ToExpression[in], $Failed]]

Он также работает с десятичными и отрицательными числами, например, textToNumber["minus one point one"].

Обратите внимание, что мы можем запросить что-то еще, кроме "Plaintext" вывода. Самый простой способ узнать, что доступно, — это ввести какое-нибудь число, например, WolframAlpha["twelve"], и изучить варианты, доступные при нажатии знаков ⨁ справа от каждого «модуля». Также стоит изучить документацию, где вы найдете полезные выходные "форматы", такие как "MathematicaParse" и "PodIDs".

Мы также можем пойти в другом направлении:

numberToText[num_Integer] := WolframAlpha[ToString[num], 
                               {{"NumberName", 1}, "Plaintext"}]

Я не мог найти правильные заклинания, чтобы получить форму устной фразы для нецелых чисел. Если кто-то знает правильное заклинание или если W|A получает эту способность, не стесняйтесь обновлять этот ответ. Жаль, что в SpokenString нет возможности читать числа как произносимые ими фразы.

person Simon    schedule 09.09.2011
comment
Проблема со всеми решениями на основе W|A заключается в том, что разрешено ограниченное количество вызовов W|A в день. Таким образом, это не очень хороший автоматизированный метод. У меня был метод, который я использовал для некоторого приложения некоторое время назад, я собираюсь посмотреть, смогу ли я его выкопать. - person Eli Lansey; 09.09.2011
comment
@Eli: Правда, я никогда не предназначал решения для более чем случайного использования. Является ли ваш метод простым путем — числа в текст — или наоборот? Числа в текст можно преобразовать с помощью словаря и рекурсии. Реверс должен быть намного более гибким, с некоторыми умными паттернами струн и т. д. - person Simon; 09.09.2011

Я вижу, что Wolfram Alpha может это сделать, поэтому вот небольшая неуклюжая функция, которая отправляет английскую строку в Wolfram Alpha и анализирует результат:

w2n[s_String] := ToExpression[StringCases[
  Import["http://www.wolframalpha.com/input/?i=" <> StringReplace[s, " "->"+"],
        "String"], 
  RegularExpression["Hold\\[([^\\]]*)\\]"] -> "$1"][[1]]]

Пример:

w2n["two million six hundred sixty-six"]

> 2000666

Предоставляет ли Wolfram Alpha настоящий API? Это было бы действительно здорово!

PS: у них есть один сейчас, но он дорогой: http://products.wolframalpha.com/api/

PPS: Я заметил, что страница результатов wolframalpha немного изменилась, и мой парсинг больше не работает. Однако какой-то вариант этого регулярного выражения должен работать.

person dreeves    schedule 09.09.2009
comment
Вероятно, мне следует сделать фактический url_encode вместо того, чтобы просто заменять пробелы плюсами, но для чисел на английском языке этого, кажется, достаточно. - person dreeves; 10.09.2009

Это код:

IntegerName[78372112345]

Это результат:

78 миллиардов 372 миллиона 112 тысяч 345

person Manjunath    schedule 19.11.2016

в 09 году не было...

SemanticInterpretation["one hundred fifty thousand three hunded and six"]

or

Interpreter["SemanticNumber"]["one hundred fifty thousand three hunded and six"]

150306

(обратите внимание, что моя орфографическая ошибка не повлияла на это..)

Между прочим, эти две функции не совпадают,

SemanticInterpretation["six and forty two thousandths"]//N  (* 6.042 *)
Interpreter["SemanticNumber"]["six and forty two thousandths"] (*fails*)
person agentp    schedule 20.11.2016