|
版本12.0中的一个示例是ImagePyramid框架,用于执行多尺度图像处理:
2 b* Y# U3 N, r- d: l! g
6 o( @; U- _/ P0 A/ I/ P
9 L5 N. i6 P0 Z: a9 f" e6 H
版本12.0中有几个与颜色计算有关的新函数。一个关键的想法是ColorsNear,它代表感知色彩空间中的一个邻域,这里的颜色为Pink:
3 O/ E* ~! u2 s* L8 E
% `2 I P# {3 Z, U* S! B. U8 R
例如,可以在新的ImageRecolor函数中使用颜色邻域的概念:
8 P% P) G- c9 t$ B语音识别及更多音频功能
* d+ a9 d' t6 r- t2 }当我坐在电脑前写这篇文章的时候,让我对电脑随便说句话,然后记录它:
% y7 v( d& @- [4 d# v: h j* N
# S' F x) E5 A! x这是我获得的音频频谱图:
2 \4 _( `2 Z! i; y! D6 D" D& ^
# o7 q+ ~ f8 d l8 m+ U- Z6 d
此操作在版本11.3中即可执行(但在12.0中Spectrogram的速度提高了10倍)。而新功能是:
/ x) h* N0 Z9 M A) L7 G, `5 r, V$ F5 {
我们正在使用最先进的神经网络技术,实现从语音到文字的转变!它流线型的工作效果好得令我吃惊,并且完全能够处理很长的音频片段。在典型的计算机上,转录速度大约等于实际的语音速度,因此一小时的语音将需要大约一个小时来转录。 1 i6 q& t3 j# c5 |
现在我们认为SpeechRecognize仍是实验性的,我们将继续增强它。但有趣的是看到另一个重要的计算任务现在变成了Wolfram语言的一个单个函数。
5 z4 n0 ~/ a# B6 E, j2 c$ g在12.0版中,还有其他增强功能。SpeechSynthesize支持新语言和新语音(由VoiceStyleData[]列出)。
* c. L9 S/ m% e, | m7 ~& R" F有WebAudioSearch——WebImageSearch的对照版,可以让你在网上搜索音频:
( L- J+ U/ f+ D) h: V
/ `& H, T/ [7 k8 \& O' A0 W可以提取实际的音频对象:
& f9 ^- r- s( J5 l9 i! X {
% R4 y# }: N2 Z' x& g
然后制作光谱图或其他测量结果的图形:
, G: f) V4 N- {7 f1 ?
8 F8 D, N7 c- w$ s' k; {
版本12.0中的新功能在此:可以使用AudioIdentify来尝试识别声音的类别(这是一只会说话的公鸡吗?):
5 j/ i" L- ]4 R _& y
" }7 w, `/ p" y" r/ f我们认为AudioIdentify仍在试验阶段。这只是一个有趣的开始,还不像ImageIdentify那样好用。
9 H, F7 q& ]( s更成功的音频函数是PitchRecognize,它试图识别音频信号中的主导频率(它使用“经典”和神经网络方法)。虽然它还不能处理“和弦”,但它对“单音符”非常有效。
) ^5 c* m' \0 M% _' Z1 Q) \7 I- g- X在处理音频时,人们通常不仅要识别音频中的内容,还要添加注释。版本12.0开始引入了大规模音频架构。现在AudioAnnotate可以标记静音的位置,或者有大声的地方。将来,我们将添加说话人识别和单词边界,以及其他许多内容。除此之外,我们还有像AudioAnnotationLookup这样的函数,用于挑选以特定方式注释的音频对象的部分。 4 [& V2 H1 |4 l7 i- Y5 D, y5 ?
所有上述高级音频功能都建立在一个完整的低级音频处理基础之上。版本12.0大大增强了AudioBlockMap(用于将滤波器应用于音频信号),并引入了ShortTimeFourier等函数。 9 w' G3 l# K; s9 K: W
频谱图看起来有点像乐谱的连续模拟,其中音高被绘制为时间的函数。在版本12.0中,现在有InverseSpectrogram,将一系列频谱图数据转成音频。从1991年的第2版开始就有了Play,根据一个函数生成声音(比如Sin[100 t])。现在使用InverseSpectrogram,我们可以将“频率-时间位图”转变为声音。(并且必须承认,当只有振幅信息时,关于相位的最佳猜测仍是棘手的问题。) 1 @( G8 ?1 N+ e1 h9 J: s3 z1 K
自然语言处理 ' o5 [/ |% X" n* v5 u9 f9 X
从Wolfram|Alpha开始,我们长期以来拥有非常强大的自然语言理解(NLU)功能。这意味着,给定一种自然语言,我们擅长将其理解为Wolfram语言,然后由此进行计算: ( V- v1 U1 w. |
1 U1 F4 v& c% O# r但是在自然语言处理(NLP)方面,如果我们输入一大段自然语言,但不试图完全理解它们,而只是找到或处理它们的一些特定功能,又怎样呢?一段时间以来,像TextSentences,TextStructure,TextCases和 WordCounts这样的函数已经在这个方面为我们提供了基本功能。在版本12.0中,通过利用最新的机器学习技术,以及我们长期的NLU和知识库功能,强大的NLP功能已经开始崭露头角。
$ \) z8 N, y8 ~& C9 x0 c核心是TextCases的显著增强版本。TextCases的基本目标是在一段文本中查找不同类型内容的实例。一个例子是“实体识别”的经典NLP任务,在这里TextCases找到哪些国家名称出现在关于ocelots的维基百科文章中: / ?9 j2 S, V# Q, ]: m
. S5 p. B" M1 k
我们也可以问一下提到哪些岛屿,但现在我们不会要求Wolfram语言解释:/ H1 x% @! Q5 R' [* g- Q$ v
; A& A( I$ M1 W6 _" T' T& g* Q0 f- ZTextCases并不完美,但它确实表现出色:
2 m4 a7 |* _* M9 K' `* s5 r, U
( t3 K5 n( w/ `) P$ N. k它也支持许多不同的内容类型(https://reference.wolfram.com/la ... xtContentTypes.html)$ B8 g3 s1 R3 e# q" j; I
: [/ A0 L' c1 [, ~$ b
您可以要它查找代词或简化关系从句,量词,电子邮件地址,或150种实体(如公司、植物或电影)中出现的任何一种。您还可以要求它挑选出特定人类语言或计算机语言的文本,或者关于特定主题(如旅行或健康)或具有正面或负面情绪的文本。您可以使用像Containing这样的结构要求这些东西的组合(如包含河流名称的名词短语):) X0 I3 M. i/ j" F
) }; n- P$ v0 G( ?) f/ j5 h( M _
例如,TextContents可以让您查看在特定文本中检测到的所有实体的详细信息:
, l& E2 j8 x7 ~
3 d" Q3 q" t5 N" e( V0 G" y* w并且,是的,原则上可以通过FindTextualAnswer使用这些功能来尝试回答文本中的问题。但在这种情况下,结果可能非常古怪:
" J1 X# Y u0 l2 |! e, I
! H$ j; C0 G9 F* i当然,您可以从我们内置的策展知识库中获得真正的答案:
; P F& e. ]3 m$ I
) z: T; X" m- c0 p. I: W
顺便说一句,在版本12.0中,我们添加了各种小的“自然语言便利功能”,如Synonyms和 Antonyms:
6 o; e) v! d8 O- s, k
: _& @# M: C; Q$ e& \2 F3 y! q7 u计算化学 ) l/ C% _" K* a; M& P
12.0版在计算化学方面带来了“惊喜”。我们的知识库中在很久以前就有了显式已知化学品数据。但是在版本12.0中,我们可以对指定为纯符号对象的分子进行计算。以下是我们如何指定最终成为水分子的方法:
. b d: l5 N2 s9 K
以下是我们如何进行3D渲染:
( W6 m/ G3 t: n8 e
+ g# L+ q. g5 C7 p$ U+ n可以处理“已知化学品”:
6 c& v) K6 a; g) |, ?+ l
/ D. `# F* `2 g; {5 ~( w, P5 N1 Z
可以使用任意IUPAC名称:
: G+ b7 ~7 J1 `1 Y0 _5 I. i
, {+ K$ ^* ~8 r2 [
或者可以“编造”一个化学品。例如通过其SMILES字符串指定它们:
. z6 b+ O0 R- R( ^. X
: \) s# T6 D7 c i但我们不仅能生成图片,还可以根据结构进行计算,如对称性:
8 z% k! _, z& X: h. \1 _: Y
3 F7 b0 A, t9 o) ]* S
给定一个分子,我们可以突出显示其碳氧键:
- D( h+ F1 R( }2 n- x9 q2 J
. r; D, i5 E1 O8 `" j) M. A, v或者突出显示结构,例如由SMARTS字符串指定(这里是任何5个成员的环):! [* j& b2 G2 ?& v, b' ^
6 J! n6 ^& N4 ^" T6 {
也可以搜索“分子模式”;结果以原子数表示:
1 R# @) V2 Q- F7 J/ l
9 i6 f3 B* Y- a* F我们在版本12.0中添加的计算化学功能颇具通用性并且功能强大(需要注意的是,到目前为止它们只涉及有机分子)。在最底层,它们将分子视为标号图,其中图的边对应于键。但他们也了解物理学,并正确地解释原子价和键配置。不用说,有很多细节(关于立体化学,对称性,芳香性,同位素等)。但最终结果是分子结构和分子计算现已成功地添加到整合到Wolfram语言的区域列表中。 : t6 a* v& _& E0 }' q
地理计算扩展
! [$ K) Q% `7 H& [9 f$ Y5 z( ~Wolfram语言已具备强大的地理计算功能,但12.0版增加了更多功能,并对已有功能进行了增强。
+ h1 C/ q+ `3 Y0 d+ f6 g- G, _例如,现在有RandomGeoPosition,它生成一个随机的维度-经度位置。这看上去似乎微不足道,但当人们不得不进行坐标变换时,就看到它的威力了,人们可以告诉它只在某个地区内选取点,这里是法国: 5 i) g% m8 R+ y' s& [5 H
3 j' o% P0 \, N0 [在版本12.0中,新地理功能的一个主题是不仅处理地理点和区域,还处理地理矢量。例如,这是当前在艾菲尔铁塔处的风矢量,表示为GeoVector,具有速度和方向(还有GeoVectorENU,它提供东,北和上分量,以及GeoGridVector和GeoVectorXYZ):
( c* m) ?% n5 L$ v8 m! R& B
+ [; _( w4 _9 A8 l- }2 C) o
像GeoGraphics这样的函数可以可视化离散的地理矢量。GeoStreamPlot是StreamPlot(或ListStreamPlot)在地理方面的对照,并显示由地理向量(此处来自WindDirectionData)形成的流线:
3 J' c. X4 @6 Q+ _, E" D5 x- ~& b& X( l
大地测量学是一个在数学上相当复杂的领域,我们为Wolfram语言在此方面的卓越性能而感到自豪。在12.0版中,我们添加了一些新功能来填充一些细节。例如,我们现在有像GeoGridUnitDistance和GeoGridUnitArea这样的函数,它们提供与地球上每个位置(或月亮,火星等)的不同地理投影相关的失真(基本上是雅可比行星的特征值)。 8 ?5 \% f6 ]7 Y, y5 `4 }
增强的可视化功能 % O: I4 T$ v0 I2 N) m5 A
我们一直在稳步发展的一个可视化方向被人们称之为“元图形”:图形化事物的标注和注释。我们在版本11.0中引入了Callout;在版本12.0中,它已经扩展到3D图形:
. v) G. u3 M4 ]- v5 y
: ~" P' |# \2 d9 d即使对于比较复杂的物体,它也能很好地确定标记其位置:
9 w- \' J0 h) v! P v; f, |) V
, t% L+ X& o* m" u' M4 v! q
为了让图形更加美观,对很多细节的改进非常重要。在版本12.0中增强的功能是确保图形各列沿边框排列,而不管其刻度标签的长度如何。我们还添加了LabelVisibility,它允许您指定不同标签应该可见的相对优先级。
# q, k' _; J/ J) w8 F, U4 i版本12.0的另一个新功能是多面板绘图布局,其中不同的数据集显示在不同的面板中,但面板尽可能地共用坐标轴: ( ~. R$ t0 r! I, a! p' n4 G
, r2 i( `$ A" f8 ~
加强知识库集成 4 S6 M3 L6 l* a7 p# p% B/ k
我们的策展知识库非常庞大且不断增长,它驱动着Wolfram|Alpha。随着Wolfram语言的每次版本发布,我们逐渐将其融入语言的核心。
7 Q. O2 X a6 o, h% K7 a, Y* e在版本12.0中,我们直接在语言中公开了数百种类型的实体: / X2 ~, T! k9 H- l: G
) L/ f; b( S8 K7 {# B1 z& e
) }1 ]! g q0 N/ H, z$ B在12.0版之前,许多类型实体记录在Wolfram|Alpha的示例页面。但现在所有这些都收录在Wolfram语言参考文档中心: s, N$ H3 q* P9 s: T
2 Z( ~1 j- J- U1 y9 Q e& a仍有像SatelliteData,WeatherData和FinancialData这样的函数来处理通常需要复杂选择或计算的实体类型。但在版本12.0中,可以使用自然语言(“control+ =”)输入和“黄色框”实体和属性以相同方式访问每个实体类型:
' p# P" \. ]3 Y+ w
$ P. K& n+ j; k! i
顺便说一句,人们也可以隐性使用实体,比如这里求具有最高已知熔点的5个元素:) D% m0 W/ y" O$ E; c
) q6 B( w$ y. D( L+ v3 _并且可以使用Dated获取时间序列值:' m2 `$ |) \' @" |4 a# R
8 U7 N0 j7 m2 S9 E" e& d& A( o
与外部数据库的大数据集成
9 J4 r& ~# N: F1 f使用Wolfram知识库中的内置数据非常方便。查询实体的相关属性非常方便: 1 a1 K: N! a: X1 J2 S
7 l: q* L% E! V
6 E% Q- A* R9 {
但是如果你有自己的数据怎么办?能否对它进行设置,使其可以像这样轻松地使用吗?版本11的一个主要新功能是添加了EntityStore,可以定义一个自己的实体类型,然后指定实体、属性和值。 / Y' F( {3 _. q0 N4 b* ^6 q
WolframData Repository 包含了一堆实体范例。这是其中一个: 1 V: t; k5 a& |3 t
( M& n9 ^" W }4 k5 v7 N# z2 }
5 D2 M+ L2 }$ v; v$ b! m
它描述了单个实体类型:“SWLibraryBook”。为了能够像内置实体一样使用这种类型的实体,我们“注册”实体存储:
2 g2 p# Z; W7 J5 T$ }$ E; y
现在我们可以做一些事情,比如要求10个类型为“SWLibraryBook”的随机实体:; s I3 y6 R) H
' x: @ Y' W) d+ V! o" A
实体存储中的每个实体都具有各种属性。这是一个特定实体的属性值数据集:% u: I( ^" X X% o5 {/ z; e
9 C9 U& w$ S1 q0 j通过这种设置,我们基本上是将实体存储的全部内容读入内存,这使得执行Wolfram语言运算非常有效。但是,对于大量数据而言,它并不是一个很好的可扩展解决方案- 例如数据太大而无法容纳在内存中。 # k# A+ f2 G D8 [# ]8 r
但什么是大数据的典型来源?通常它是一个数据库,通常是一个可以使用SQL访问的关系数据库。我们使用DatabaseLink软件包对SQL数据库进行低级读写访问已有十多年。但是在版本12.0中,我们添加了一些主要的内置功能,允许在Wolfram语言中处理外部关系数据库,就像实体存储或Wolfram知识库的内置部分一样。
# \+ l0 U7 X) z# Z `让我们从玩具示例开始吧。这是一个恰好存储在文件中的小型关系数据库的符号表示:
& G$ z* F* ?- m* i
我们立即得到一个汇总数据库内容的框,并告诉我们这个数据库有8个表。如果我们打开框体,可以开始检查这些表的结构:$ Z# V1 G: Q; G+ f$ @ ^1 V
2 \0 Q3 { j0 J( Y' j
1 K( H0 a" u8 I I! u' N5 k2 C然后,我们可以将此关系数据库设置为Wolfram语言中的实体存储。它看起来与上面的库实体商店非常相似,但现在实际的数据没有被放内存;相反,它仍然在外部关系数据库中,我们只是在Wolfram语言中定义一个(“类ORM”)映射到实体:
0 J3 c6 J! O+ G* M4 l7 J& d
9 h" U! v V6 m) Q, g
( e. b* a0 k! J: S现在我们可以注册这个实体存储,它设置了一堆实体类型(至少在默认情况下),以数据库中表的名称命名:
2 H) r' {& \6 c) f5 d% Z
- k/ B* ^% t1 r6 y& Y/ ~现在我们可以对这些实体进行“实体计算”,就像我们在Wolfram知识库中的内置实体一样。这里的每个实体都对应于数据库中“employees”表中的一行:5 @! F! B! p6 \ j( z
: d/ ^# y3 ]: ]/ I0 o
对于给定的实体类型,我们可以询问它具有哪些属性。这些“属性”对应于底层数据库中表的列:
: G K+ l+ e: M% x* u+ n* l
! [/ p+ C) G& Q. z' ~
现在我们可以询问特定实体的特定属性值:
; m1 T# V) P9 H( |9 B) K
4 U/ F- I- L) p% B+ Q
我们也可以通过给定标准来挑选实体; 在这里,我们要求“payments”实体具有“amount”(金额)属性的4个最大值:
; @2 A8 l9 v' x& j8 ^! D7 G# L* A# c" \( s
6 U x+ i$ X: G$ }, f# M
我们同样可以询问最大金额值:
5 j! J9 Q* t- G4 T
; G) b. F8 @% w, J9 v! ^但是在这里它变得更加有趣了:到目前为止,我们看见的是一个文件支持的小数据库。但我们也可以对外部服务器上的巨型数据库做同样的事情。 ; F$ }( S' _$ ~" T2 t4 ~2 ?
例如,让我们连接到TB级的OpenStreetMap PostgreSQL数据库,该数据库包含几乎全部世界街道地图的数据:
/ R* l V) K. ]3 x: c
- D5 k6 ~% i, W/ M K
和以前一样,让我们将这个数据库中的表注册为实体类型。像大多数野外数据库一样,结构中存在一些小故障,这些故障已被绕过,但会产生警告:
9 p* ?: T0 ], O7 w' h, r! w; [
9 \3 u; h/ `2 {; d1 ]7 u* l ?6 n但现在我们可以询问有关数据库的问题,比如世界上所有街道上有多少个地理点或“节点”(是的,这是一个很大的数字,这正是数据库很大的原因):
" s/ \# K+ K; Q7 ~2 _
' Y. l1 @7 M' O* `
在这里,我们要求(101 GB)的planet_osm_polygon表中具有10个最大(投影)区域的对象的名称(是的,只需不到一秒):
# l0 p; Y- S- K+ u
7 M. u0 p. {. g3 W% d+ D' e" C' s+ E这一切是如何运作的?过程基本是这样,我们的Wolfram语言表示被编译成低级SQL查询,然后将其发送以直接在数据库服务器上执行。
6 j6 P8 L' B; L: g! y9 |" _, I# |有时您需要的只是最终值(例如,上面的“amounts”)。但其他情况下,一些中间值也是需要的,比如以特定方式选择的实体集合。当然,这个系列可能有十亿个条目。因此,我们在版本12.0中引入的一个非常重要的功能是,我们可以纯符号式地表示和运算这些事物,仅在最后将它们解析为特定的事物。 ; G8 V# G7 d9 M2 N) t
回到我们的玩具数据库。下面这个例子可以说明我们如何通过聚合具有给定国家值的所有客户的总creditLimit来获得实体类别:
* X J/ e- u; m+ i5 @+ d
, B2 ^6 K! A% E8 z5 h$ c4 y
起初,这只是符号表示。但如果我们要求具体值,则执行实际的数据库查询,这样我们得到了具体的结果:
; _+ B* }$ r3 \& s t% ]有一系列新功能可用于设置不同类型的查询。这些函数不仅适用于关系数据库,还适用于实体存储以及内置的Wolfram知识库。因此,我们可以在元素周期表中询问给定周期的平均原子质量:
1 x# N6 q5 X3 o6 D' M
: k Q. E( Z1 q$ p
一个重要的新结构是EntityFunction。EntityFunction与Function类似,不同之处在于其变量表示实体(或实体类),并描述可以直接在外部数据库上执行的操作。这是一个内置数据的例子,我们在其中定义一个“筛选”实体类,其中筛选标准是一个检验总体值的函数。该FilteredEntityClass本身只是符号表示,但EntityList实际执行查询,并解析(这里为未排序)实体的显式列表:
/ I; s; R' F* o$ ]2 r! o! E
% a! M8 y; t; f+ p @' b' x$ D$ c( q
. d8 _( O5 J- c1 g除了EntityFunction、AggregatedEntityClass和SortedEntityClass之外,版本12.0还包括SampledEntityClass(用于从类中获取一些实体),ExtendedEntityClass(用于添加计算属性)和CombinedEntityClass(用于组合来自不同类的属性)。通过这些原语,可以构建“关系代数”的所有标准运算。 - u0 A. s' | S: M a6 C' P
在标准数据库编程中,人们通常最终会得到一整片由“joins”和“foreign keys”等组成的丛林。我们的Wolfram语言表示允许您进行更高级别的操作,其中“joins”(连接)变为函数组合,而“foreignkeys”(外键)只是不同的实体类型。(但如果要进行显式连接,则可以使用CombinedEntityClass。) $ z' A7 l7 n3 E. D9 ?! i/ u
所有这些Wolfram语言结构都被编译成SQL,或者更准确地说,是与您正在使用的特定数据库相匹配的SQL的特定方言(我们目前支持SQLite、MySQL、PostgreSQL和MS-SQL,对OracleSQL的支持即将推出)。当我们进行编译时,会自动检查类型,以确保您获得有意义的查询。即使是相当简单的Wolfram语言规范也可能最终变成许多SQL行。例如,
/ l5 b3 ~( ?0 a6 E; z
) H6 {) \! R1 \& n: d将生成以下中间SQL(此处用于查询SQLite数据库):' p1 o) c3 t; A* q3 T# E1 O/ `
, b$ v0 C0 U* b" H, A. P12.0版的数据库集成系统非常复杂,为此我们已经奋斗多年。这是朝Wolfram语言直接处理大数据中的“大”迈出的重要一步,并让Wolfram语言直接在TB级别的数据集上进行数据科学研究。比如查找世界上哪些街头实体的名字中有“Wolfram”:. k6 p5 c# p i; y* b# _* K3 T
0 P+ H: p9 k7 l8 j# H
4 l# B: M( u: [* o" g
+ C0 ]9 y* U( {
, Z8 ^; \6 K% p1 {; O! ~6 @+ o
|