我正在使用 spaCy(一个很棒的 Python NLP 库)来处理许多非常大的文档,但是,我的语料库中有许多我想在文档处理管道中消除的常用词。有没有办法从管道组件内的文档中删除令牌?
Ine*_*ani 16
spaCy 的标记化是非破坏性的,因此它始终代表原始输入文本,从不添加或删除任何内容。这是Doc对象的一个核心原则:您应该始终能够重建和再现原始输入文本。
虽然您可以解决这个问题,但通常有更好的方法可以在不破坏输入文本的情况下实现相同的目标?Doc文本一致性。一个解决办法是增加一个自定义扩展属性,就像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)
Run Code Online (Sandbox Code Playgroud)
在处理 a 时Doc,您现在可以对其进行过滤以仅获取未排除的标记:
doc = nlp("Test that tokens are excluded")
print([token.text for token if not token._.is_excluded])
# ['Test', 'that', 'tokens', 'are']
Run Code Online (Sandbox Code Playgroud)
您还可以通过使用Matcher或PhraseMatcher在上下文中查找标记序列并将它们标记为排除来使这更加复杂。
此外,为了完整性:如果您确实想更改 a 中的标记Doc,您可以通过构造一个Doc具有words(字符串列表)和可选spaces(指示标记后跟空格或不是)。要构造Doc具有诸如词性标记或依赖项标签Doc.from_array之类的属性的方法,您可以调用具有要设置的属性和值(所有 ID)的 numpy 数组的方法。