当前位置: 首页 > 知识库问答 >
问题:

是否有可能发现spaCy POS标签的不确定性?

巫马欣嘉
2023-03-14

我正在尝试构建一个非英语拼写检查器,它依赖于spaCy对句子的分类,这使我的算法能够使用POS标记和单个标记的语法依赖性来确定拼写错误(在我的例子中,更具体地说:荷兰语复合词中的错误拆分)。

然而,如果句子包含语法错误,spaCy似乎会错误地对句子进行分类,例如,将名词归类为动词,即使分类的单词看起来根本不像动词。

正因为如此,我想知道是否有可能获得斯帕西分类的不确定性,从而有可能判断斯帕西是否在与一个句子作斗争。毕竟,如果spaCy正在努力进行分类,这将使我的拼写检查器对句子中包含错误有更多信心。

有没有办法知道斯帕西是否认为一个句子在语法上是正确的(而不必指定我语言中所有正确句子结构的模式),或者获得分类的确定性?

根据@Sergey Bushmanov评论中的建议进行编辑:

我找到了https://spacy.io/api/tagger#predict,这可能有助于获取标签的概率。但是,我不太确定我在看什么,我也不太明白文档对输出的含义。我使用以下代码:

import spacy

nlp = spacy.load('en_core_web_sm')
text = "This is an example sentence for the Spacy tagger."
doc = nlp(text)

docs = nlp(text, disable=['tagger'])
scores, tensors = nlp.tagger.predict([docs])

print(scores)
probs = tensors[0]
for p in probs:
    print(p, max(p), p.tolist().index(max(p)))

我猜这是预测的一些整数表示(考虑到“integer”和“representation”得到相同的分数),然后对句子中的每个单词使用96个浮点数组。它还列出了最高分数和最高分数的位置,但似乎对于大多数单词来说,p数组中有多个项得到了类似的值。现在我想知道这些数组意味着什么,以及如何从中提取每个分类的概率。

问题是:我如何解释这个输出,以获得spaCy的tagger找到的特定标记的特定概率?或者用另一种方式来回答同样的问题:上面代码生成的输出意味着什么?

共有1个答案

陈夜洛
2023-03-14
>>> nlp = spacy.load("en_core_web_sm")
>>> tagger = nlp.get_pipe("tagger")
>>> doc = nlp("Turn left")
>>> tagger.model.predict([doc])[0][1]
array([2.4706091e-07, 9.5889463e-06, 7.8214543e-07, 1.0063847e-06,
       1.4711081e-07, 8.9995199e-05, 1.3229882e-05, 1.7524673e-07,
       1.8464769e-05, 2.4248957e-06, 1.2176755e-06, 3.3774859e-07,
       1.3199920e-06, 1.2011193e-06, 9.4455345e-06, 2.1991875e-05,
       1.6732251e-02, 1.3964747e-07, 2.0764594e-07, 7.0467541e-07,
       1.4303426e-07, 3.7962508e-07, 1.2130551e-03, 3.1479198e-07,
       4.8646534e-08, 6.1310317e-07, 1.0607551e-05, 3.7493783e-06,
       2.7809198e-08, 1.2118652e-05, 9.9081490e-03, 1.8219554e-06,
       4.7322575e-07, 1.8754436e-05, 6.2416703e-08, 9.5453437e-08,
       1.8937490e-05, 6.3916352e-03, 3.7999314e-01, 1.5741379e-03,
       5.8360571e-01, 9.6441705e-05, 1.7456010e-04, 5.1820080e-06,
       1.2672864e-06, 9.7453121e-06, 2.4000105e-05, 5.1192428e-06,
       2.4821245e-05], dtype=float32)
>>> r = [*enumerate(tagger.model.predict([doc])[0][1])]
>>> r.sort(key=lambda x: x[1])
>>> r
[(28, 2.7809198e-08), (24, 4.8646534e-08), (34, 6.24167e-08), (35, 9.545344e-08), (17, 1.3964747e-07), (20, 1.4303426e-07), (4, 1.4711081e-07), (7, 1.7524673e-07), (18, 2.0764594e-07), (0, 2.470609e-07), (23, 3.1479198e-07), (11, 3.377486e-07), (21, 3.7962508e-07), (32, 4.7322575e-07), (25, 6.1310317e-07), (19, 7.046754e-07), (2, 7.8214543e-07), (3, 1.0063847e-06), (13, 1.2011193e-06), (10, 1.2176755e-06), (44, 1.2672864e-06), (12, 1.319992e-06), (31, 1.8219554e-06), (9, 2.4248957e-06), (27, 3.7493783e-06), (47, 5.119243e-06), (43, 5.182008e-06), (14, 9.4455345e-06), (1, 9.588946e-06), (45, 9.745312e-06), (26, 1.0607551e-05), (29, 1.2118652e-05), (6, 1.3229882e-05), (8, 1.8464769e-05), (33, 1.8754436e-05), (36, 1.893749e-05), (15, 2.1991875e-05), (46, 2.4000105e-05), (48, 2.4821245e-05), (5, 8.99952e-05), (41, 9.6441705e-05), (42, 0.0001745601), (22, 0.0012130551), (39, 0.001574138), (37, 0.006391635), (30, 0.009908149), (16, 0.016732251), (38, 0.37999314), (40, 0.5836057)]

在这里,你可以看到前两个匹配项(在列表的末尾)(38,0.37999314),(40,0.5836057)没有很高的可信度(~50%),所以你有一些模糊性的迹象。

>>> tagger.labels
('$', "''", ',', '-LRB-', '-RRB-', '.', ':', 'ADD', 'AFX', 'CC', 'CD', 'DT', 'EX', 'FW', 'HYPH', 'IN', 'JJ', 'JJR', 'JJS', 'LS', 'MD', 'NFP', 'NN', 'NNP', 'NNPS', 'NNS', 'PDT', 'POS', 'PRP', 'PRP$', 'RB', 'RBR', 'RBS', 'RP', 'SYM', 'TO', 'UH', 'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ', 'WDT', 'WP', 'WP$', 'WRB', 'XX', '``')
>>> tagger.labels[40]
'VBN'
>>> tagger.labels[38]
'VBD'

看起来有一些特定于语言的标记,需要一些映射才能获得通用的词性标记。

 类似资料:
  • 问题内容: 因此,我在大学期间正在学习有关HTML列表的知识,这位教授说与其他标记(如和)一起没有结尾标记。那是正确的吗?因为最后我看到了很多使用tag的模板/主题,还有许多网站也教您存在,所以我不确定该相信谁以及正确的使用方式是什么? 我问这个问题的原因是因为上次我们了解了标记,他说,当您将鼠标悬停在该属性上时,该属性会为您提供一个显示在图像上方的文本,当我在此处询问该属性时,它仅是替换图像的替

  • 问题内容: gotoPython中是否有一个或任何等效版本能够跳转到特定的代码行? 问题答案: Python使你能够使用一流的功能来完成goto可以完成的一些操作。例如: } 可以这样在python中完成: 当然,这不是替代goto的最佳方法。但是,如果不确切知道你要使用goto做什么,很难给出具体的建议。 最好的选择是将其包含在函数中或使用异常。对于功能: 例外情况: 如果你来自另一种编程语言,

  • 问题内容: 我正在尝试确定给定类型()是否为可选类型,我正在使用此测试 但它始终返回false。 那么有什么办法可以做到这一点? 问题答案: 假设您要执行的操作是这样的: 可悲的是,swift当前(从Swift 2开始)不支持协方差和协变,并且不能直接针对类型进行类型检查: 一种替代方法是使特定协议扩展,并检查该类型:

  • 问题内容: 如果我们查看Java标准 §14.7,就会发现语句可能带有标签前缀,例如: LabeledStatement: 标识符:声明 从理论上讲,标签应该能够标记任何后续的语句。因此,例如,以下内容将相应地进行编译: 直观地,这也可以编译为: 但是以下内容 无法 编译: 即使这样做(请注意范围括号): 因此,问题取决于声明是否为语句。根据标准(和在线文档): 除了表达式语句,还有两种其他类型的

  • 我使用的是SDN3.1.0.发行版。我尝试danamic标签查询,比如 我可以在@Query中使用动态标签吗?

  • 问题内容: 我一直在使用TwitterBootstrap构建网站,其许多功能都依赖于将内容包装在中,即使它们只是执行Javascript也是如此。我在Bootstrap文档所建议的策略上遇到了问题,因此我试图寻找其他解决方案。 但是后来我尝试完全删除该属性。我一直在使用,并让Javascript处理其余部分。而且有效。 但是有件事告诉我我不应该这样做。对?我的意思是,从技术上讲,它应该是某事的链接