Я слышал, что мы можем использовать английские слова, чтобы выразить число в Mathematica. Например, используя Сто, чтобы выразить 100. Какая функция может это сделать?
Выразите число словами в Mathematica
Ответы (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
нет возможности читать числа как произносимые ими фразы.
Я вижу, что 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 немного изменилась, и мой парсинг больше не работает. Однако какой-то вариант этого регулярного выражения должен работать.
Это код:
IntegerName[78372112345]
Это результат:
78 миллиардов 372 миллиона 112 тысяч 345
в 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*)