在Mathematica中用文字表达一个数字

4

我听说在Mathematica中可以使用英文单词来表示数字,比如使用One hundred来表示100。哪个函数可以实现这个功能?


1
你是指如何读取单词并获得数字,还是将数字转换为单词? - Pillsy
4个回答

5

一个基本等同于dreeves的解决方案(但在他回答时不可用)的解决方案是直接从Mathematica调用WolframAlpha[](这需要互联网连接)。例如,

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"],并在每个“pod”右侧按下⨁符号时探索可用选项。还值得探索文档,在其中您可以找到有用的输出“格式”,例如"MathematicaParse""PodIDs"
我们也可以反过来做:
numberToText[num_Integer] := WolframAlpha[ToString[num], 
                               {{"NumberName", 1}, "Plaintext"}]

我找不到适合非整数的口语表达形式的正确咒语。如果有人知道正确的咒语,或者如果 W|A 获得了这种能力,请随时更新这个答案。遗憾的是,SpokenString 没有将数字读作其口语短语的选项。


所有基于W|A的解决方案的问题在于每天允许调用W|A的次数有限。因此,它并不是一个很好的自动化方法。我以前有一种方法用于某些应用程序,我要看看能否找到它。 - Eli Lansey
@Eli:没错,我从未打算让这些解决方案经常使用。你的方法是采用简单的数字转文本还是反过来?数字转文本可以通过字典和递归来解决。而反过来则需要更加灵活的方式,例如一些巧妙的字符串模式等等... - Simon

2
我看到 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:现在他们有了一个API,但价格很贵:http://products.wolframalpha.com/api/

PPS:我注意到wolframalpha结果页面有些变化,我的爬虫不再起作用。使用某种变体的正则表达式应该可以解决问题。


我可能应该做一个真正的url_encode,而不仅仅是用加号代替空格,但对于英语中的数字似乎已经足够了。 - dreeves

1
这是代码:

IntegerName[78372112345]

我是输出结果:

78372112345


0

在09年还没有可用...

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

或者

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*)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接