核心内容摘要
聚焦光伏核心环节!并网逆变器测试方案出炉,9.62亿元市场规模释放行业潜力
Introducing spaCyspaCy 是一个用于 Python 和 Cython 文本处理的新库。
之所以开发它是因为我认为小公司在自然语言处理方面表现得很糟糕。
或者更准确地说小公司正在使用糟糕的 NLP 技术。
更新2016年10月3日这篇文章展示了 spaCy 最初的发布公告其中包含一些使用示例和基准测试。
这些基准测试现已相当过时但令人欣慰的是其使用方式变化相对较小。
在发布此公告之前我在 spaCy 的初始设计上花了很长时间。
其回报是 API 一直保持相当稳定。
要做好 NLP你需要懂一点语言学懂很多机器学习并且几乎要了解最新的所有研究。
符合这种描述的人很少加入小公司。
他们中的大多数都刚毕业囊中羞涩。
如果他们不想留在学术界就会加入某中心、某机构等。
最终结果是除了科技巨头之外商业 NLP 在过去十年中变化甚微。
而在学术界它已经完全改变了。
质量有了惊人的提升速度快了几个数量级。
但学术代码总是 GPL 许可、缺乏文档、无法使用或者三者兼具。
你可以自己实现这些想法但论文很难读懂而且训练数据极其昂贵。
那么你还剩下什么一个常见的答案是 NLTK它主要是作为教育资源编写的。
除了分词器之外其他部分都不适合生产环境使用。
我曾经认为 NLP 社区只需要做更多工作将其发现传达给软件工程师。
所以我写了两篇博客文章解释如何编写一个词性标注器和解析器。
两篇文章都反响不错并且我的研究软件也引起了一些兴趣——尽管它完全没有文档除了我之外对大多数人来说几乎无法使用。
于是六个月前我辞去了博士后的工作从那以后一直夜以继日地开发 spaCy。
现在我很高兴地宣布一个 alpha 版本。
如果你是一家从事 NLP 的小公司我认为 spaCy 会像是一个小奇迹。
它是迄今为止发布的最快的 NLP 软件。
完整的处理流水线每份文档只需 20 毫秒包括准确的标注和解析。
所有字符串都映射为整数 ID词元链接到嵌入的词表示一系列有用的特征被预先计算并缓存。
计算机不理解文本。
这很不幸因为网络主要由文本构成。
如果上述内容对你来说毫无意义那么要点是计算机不理解文本。
这很不幸因为网络几乎完全由文本构成。
我们希望根据人们喜欢的其他文本来推荐文本。
我们想缩短文本以在移动屏幕上显示。
我们想要聚合、链接、过滤、分类、生成和纠正它。
spaCy 提供了一个实用函数库帮助程序员构建此类产品。
它是商业开源软件你可以选择在 AGPL 下使用它或者以慷慨的条款购买商业许可证。
功能示例假设你正在开发一个校对工具或者可能是一个面向作家的 IDE。
你被斯蒂芬·金的建议说服了他认为副词不是你的朋友所以你想高亮显示所有副词。
我们将使用一个他认为特别糟糕的例子importspacy.enfromspacy.parts_of_speechimportADV# 加载流水线并用一些文本调用它。
nlpspacy.en.English()tokensnlp(u‘Give it back,’ he pleaded abjectly, ‘it’s mine.’,tagTrue,parseFalse)printu.join(tok.string.upper()iftok.posADVelsetok.stringfortokintokens)u‘Give it BACK,’ he pleaded ABJECTLY,‘it’s mine.’这很简单——但问题是我们也高亮了“back”。
虽然“back”无疑是副词但我们可能不想高亮它。
如果我们的目标是标记可疑的文体选择我们需要完善我们的逻辑。
事实证明只有特定类型的副词才是我们感兴趣的。
根据我们想要标记的确切词语我们有很多方法可以做到这一点。
排除像“back”和“not”这类副词的最简单方法是根据词频这些词比典型的、文体指南所担心的方式副词要常见得多。
Lexeme.prob和Token.prob属性给出了该词的对数概率估计nlp.vocab[uback].prob-
403977394104004nlp.vocab[unot].prob-
407193660736084nlp.vocab[uquietly].prob-
1
07155704498291概率估计基于一个 30 亿词语料库的计数并使用 Simple Good-Turing 方法平滑。
因此我们可以轻松地从我们的副词标记器中排除英语中最常见的 N 个词。
现在让我们试试 N1000importspacy.enfromspacy.parts_of_speechimportADVnlpspacy.en.English()# 查找第 N 个最常见词的对数概率probs[lex.probforlexinnlp.vocab]probs.sort()is_adverblambdatok:tok.posADVandtok.probprobs[-1000]tokensnlp(u‘Give it back,’ he pleaded abjectly,‘it’s mine.”)printu.join(tok.string.upper()ifis_adverb(tok)elsetok.stringfortokintokens)‘Give it back,’ he pleaded ABJECTLY,‘it’s mine.’根据我们想要标记的确切词语我们还有许多其他方法可以完善逻辑。
假设我们只想标记修饰类似于“pleaded”的词的副词。
这很容易做到因为 spaCy 为每个词加载了一个向量空间表示默认是 Levy 和 Goldberg (
生成的向量。
自然地该向量以 numpy 数组的形式提供pleadedtokens[7]pleaded.vector.shape(300,)pleaded.vector[:5]array([
04229792,
07459262,
00820188,-
02181299,
07519238],dtypefloat
我们想根据词汇表中单词与“pleaded”的相似度对它们进行排序。
测量两个向量相似度的方法有很多。
我们将使用余弦度量fromnumpyimportdotfromnumpy.linalgimportnormcosinelambdav1,v2:dot(v1,v
/(norm(v
*norm(v
)words[wforwinnlp.vocabifw.has_vector]words.sort(keylambdaw:cosine(w.vector,pleaded.vector))words.reverse()print(
,, .join(w.orth_forwinwords[0:20]))
pleaded,pled,plead,confessed,interceded,pleads,testified,conspired,motioned,demurred,countersued,remonstrated,begged,apologised,consented,acquiesced,petitioned,quarreled,appealed,pleadingprint(
,, .join(w.orth_forwinwords[50:60]))
counselled,bragged,backtracked,caucused,refiled,dueled,mused,dissented,yearned,confessesprint(
,, .join(w.orth_forwinwords[100:110]))
cabled,ducked,sentenced,perjured,absconded,bargained,overstayed,clerked,confided,sympathizesprint(
,, .join(w.orth_forwinwords[1000:1010]))
scorned,baled,righted,requested,swindled,posited,firebombed,slimed,deferred,saggedprint(
,, .join(w.orth_forwinwords[50000:50010]))
,fb,ford,systems,puck,anglers,ik,tabloid,dirty,rims,artists如你所见这些向量提供的相似性模型非常出色——仅凭一个原型词我们在 1000 个词处仍然能得到有意义的结果唯一的问题是列表中确实包含两个词簇一个与“pleaded”的法律含义相关另一个则指更一般的意义。
理清这些簇是当前的一个活跃研究领域。
一个简单的解决方法是取几个词向量的平均值并将其作为我们的目标say_verbs[pleaded,confessed,remonstrated,begged,bragged,confided,requested]say_vectorsum(nlp.vocab[verb].vectorforverbinsay_verbs)/len(say_verbs)words.sort(keylambdaw:cosine(w.vector*say_vector))words.reverse()print(
,, .join(w.orth_forwinwords[0:20]))
bragged,remonstrated,enquired,demurred,sighed,mused,intimated,retorted,entreated,motioned,ranted,confided,countersued,gestured,implored,interceded,muttered,marvelled,bickered,despairedprint(
,, .join(w.orth_forwinwords[50:60]))
flaunted,quarrelled,ingratiated,vouched,agonized,apologised,lunched,joked,chafed,schemedprint(
,, .join(w.orth_forwinwords[1000:1010]))
hoarded,waded,ensnared,clamoring,abided,deploring,shriveled,endeared,rethought,berate这些词看起来确实像是金可能会因为作家为其添加副词而加以训斥的。
回想一下我们最初的副词高亮函数是这样的importspacy.enfromspacy.parts_of_speechimportADV# 加载流水线并用一些文本调用它。
nlpspacy.en.English()tokensnlp(‘Give it back,’ he pleaded abjectly, ‘it’s mine.’,tagTrue,parseFalse)print(.join(tok.string.upper()iftok.posADVelsetok.stringfortokintokens))‘Give it BACK,’ he pleaded ABJECTLY,‘it’s mine.’我们想完善逻辑以便只高亮修饰像“pleaded”这样富有表现力的沟通动词的副词。
我们现在已经构建了一个代表这类词的向量因此现在我们可以基于微妙的逻辑来高亮副词根据我们的初始假设聚焦于那些看起来在文体上最有问题的副词importnumpyfromnumpyimportdotfromnumpy.linalgimportnormimportspacy.enfromspacy.parts_of_speechimportADV,VERBcosinelambdav1,v2:dot(v1,v
/(norm(v
*norm(v
)defis_bad_adverb(token,target_verb,tol):...iftoken.pos!ADV:...returnFalse...eliftoken.head.pos!VERB:...returnFalse...elifcosine(token.head.vector,target_verb)tol:...returnFalse...else:...returnTrue这个例子有些刻意——而且说实话我从来没有真正接受过副词是严重的文体罪过这个观点。
但希望它能传达一个信息最先进的 NLP 技术非常强大。
spaCy 让你能够轻松高效地使用它们从而构建各种以前不可能实现的有用产品和功能。
独立评估某机构和某机构的独立评估将在 ACL 2015 上发表。
数值越高越好。
准确度是未标记弧正确的百分比速度是每秒处理的词元数。
系统语言准确度速度spaCy v
86Cython
9
913,963ClearNLPJava
9
710,271spaCy v
84Cython
9
913,963CoreNLPJava
8
68,602MATEJava
9
5550TurboC
9
4349YaraJava
9
3340某机构的多位研究者和某机构的一位教授对现有最佳解析器进行了详细比较。
以上所有数字均取自他们慷慨提供给我的预印本除了 spaCy v
86 的数据。
我特别感谢作者们对结果的讨论这促成了 v
84 到 v
86 之间准确度的提升。
来自 Jin-hoClearNLP 的开发者的一个建议尤其有用。
详细速度对比每文档处理时间。
越低越好。
设置10 万份纯文本文档从 SQLite3 数据库流式传输并用 NLP 库处理到三个细节级别之一——分词、标注或解析。
这些任务是累加的要解析文本你必须先对其进行分词和标注。
预处理时间未从总时间中减去——我报告的是流水线完成所需的时间。
我报告的是每文档的平均时间单位为毫秒。
硬件Intel i
(
绝对每文档毫秒系统分词标注解析spaCy
2ms1ms19msCoreNLP2ms10ms49msZPar1ms8ms850msNLTK4ms443msn/a相对相对于 spaCy系统分词标注解析spaCy1x1x1xCoreNLP10x10x
6xZPar5x8x
4
7xNLTK20x443xn/a效率是 NLP 应用的一个主要关注点。
经常听到人们说他们无法承担更详细的处理因为他们的数据集太大了。
这是一个糟糕的处境。
如果你不能应用详细处理通常不得不拼凑各种启发式方法。
这通常需要多次迭代而且你想出来的东西通常是脆弱的难以推理。
spaCy 的解析器比大多数标注器都快其分词器对于任何工作负载来说都足够快。
而且分词器不仅仅给你一个字符串列表。
spaCy 的词元是一个指向 Lexeme 结构体的指针从中你可以访问一系列预先计算的特征包括嵌入的词表示。
关于作者Matthew Honnibal首席技术官创始人Matthew 是 AI 技术领域的领先专家。
他于 2009 年获得博士学位随后又花了 5 年时间发表关于最先进 NLP 系统的研究。
他于 2014 年离开学术界编写 spaCy 并创立了 Explosion。
FINISHED更多精彩内容 请关注我的个人公众号 公众号办公AI智能小助手或者 我的个人博客 https://blog.qife