ped*_*rum 6 python nlp token spacy
我想知道是什么样的区别标记和跨度在spaCy。
另外,我们必须使用跨度的主要原因是什么?为什么我们不能简单地使用令牌来做任何 NLP?特别是当我们使用spaCy 匹配器时?
简要背景:当我想在使用返回“ match_id ”、“ start ”和“ end ”等的spaCy 匹配器后获取 span 索引(它在字符串 doc 中的确切索引而不是在 spaCy doc 中的有序索引)时出现了我的问题我可以从这些信息中获得 span,而不是令牌。然后我需要创建一个training_data,它需要一个句子中单词的精确索引。如果我可以访问令牌,我可以简单地使用 token.idx 但 span 没有!所以我必须写额外的代码来找到它的句子中单词的索引(与span相同)!
Kur*_*ica 10
Token 对比 Span在 spaCy 的文档中,aToken表示文档中的单个单词、标点符号、空格等,而 aSpan表示文档中的一个切片。换句话说,aSpan是Tokens的有序序列。
Span是?spaCy'sMatcher给出了一个-levelSpan信息而不是-level Token,因为它允许Token匹配一系列s。就像 aSpan可以只由 1 组成一样Token,情况也不一定如此。
考虑以下示例。我们在这里匹配Token "hello"单独的、Token "world"单独的以及Span由Tokens "hello"&组成的"world"。
>>> import spacy
>>> nlp = spacy.load("en")
>>> from spacy.matcher import Matcher
>>> matcher = Matcher(nlp.vocab)
>>> matcher.add(1, None, [{"LOWER": "hello"}])
>>> matcher.add(2, None, [{"LOWER": "world"}])
>>> matcher.add(3, None, [{"LOWER": "hello"}, {"LOWER": "world"}])
Run Code Online (Sandbox Code Playgroud)
对于"Hello world!"所有这些模式匹配:
>>> document = nlp("Hello world!")
>>> [(token.idx, token) for token in document]
[(0, Hello), (6, world), (11, !)]
>>> matcher(document)
[(1, 0, 1), (3, 0, 2), (2, 1, 2)]
Run Code Online (Sandbox Code Playgroud)
但是,第三个模式与 不匹配"Hello, world!",因为"Hello"&"world"不是连续的Tokens(因为"," Token),所以它们不会形成Span:
>>> document = nlp("Hello, world!")
>>> [(token.idx, token) for token in document]
[(0, Hello), (5, ,), (7, world), (12, !)]
>>> matcher(document)
[(1, 0, 1), (2, 2, 3)]
Run Code Online (Sandbox Code Playgroud)
Token从Spans访问s尽管如此,您应该能够Token通过遍历 来从跨度中获取级别信息Span,就像您可以Token在 a 中遍历s 一样Doc。
>>> document = nlp("Hello, world!")
>>> span, type(span)
(Hello, world, <class 'spacy.tokens.span.Span'>)
>>> [(token.idx, token, type(token)) for token in span]
[(0, Hello, <class 'spacy.tokens.token.Token'>), (5, ,, <class 'spacy.tokens.token.Token'>), (7, world, <class 'spacy.tokens.token.Token'>)]
Run Code Online (Sandbox Code Playgroud)