【发布时间】:2019-02-10 14:21:16
【问题描述】:
我正在使用 spaCy(一个很棒的 Python NLP 库)来处理许多非常大的文档,但是,我的语料库中有一些我想在文档处理管道中消除的常用词。有没有办法从管道组件中的文档中删除令牌?
【问题讨论】:
我正在使用 spaCy(一个很棒的 Python NLP 库)来处理许多非常大的文档,但是,我的语料库中有一些我想在文档处理管道中消除的常用词。有没有办法从管道组件中的文档中删除令牌?
【问题讨论】:
spaCy 的标记化是非破坏性的,因此它始终代表原始输入文本,从不添加或删除任何内容。这是Doc 对象的一种核心原则:您应该始终能够重构和再现原始输入文本。
虽然您可以解决这个问题,但通常有更好的方法可以在不破坏输入文本 ↔ Doc 文本一致性的情况下实现相同的目标。一种解决方案是根据您要使用的任何目标,将custom extension attribute(如is_excluded)添加到令牌中:
from spacy.tokens import Token
def get_is_excluded(token):
# Getter function to determine the value of token._.is_excluded
return token.text in ['some', 'excluded', 'words']
Token.set_extension('is_excluded', getter=get_is_excluded)
在处理Doc 时,您现在可以过滤它以仅获取未排除的令牌:
doc = nlp("Test that tokens are excluded")
print([token.text for token if not token._.is_excluded])
# ['Test', 'that', 'tokens', 'are']
您还可以通过使用Matcher or PhraseMatcher 在上下文中查找标记序列并将它们标记为已排除,从而使这更加复杂。
另外,为了完整性:如果您确实想更改 Doc 中的标记,您可以通过使用 words(字符串列表)和可选的 spaces(一个布尔值列表,指示标记是否后跟空格)。要构造一个带有诸如词性标签或依赖标签等属性的Doc,您可以调用Doc.from_array 方法,并使用要设置的属性和一个numpy 值数组(所有ID)。
【讨论】: