是否可以在 spaCy 中排除某些 POS 标签? Python

Is it possible to exclude certain POS tags in spaCy? Python

我想通过在动词前添加 'X' 来标记动词在句子中的位置。我的函数采用以下步骤来实现这一点。

  1. 找到动词。我使用 spaCy 进行 POS 标记。 SpaCy 输出一个 POS 标签列表,我称之为 pos,其中句子中的每个单词都表示为一个标签。
  2. 将句子也转换成列表L
  3. 确定动词标签(例如"VBZ")在词性列表中的索引x
  4. 将索引 x 处所需的 'X' 标记插入句子列表。

第 4 步假设列表的长度 pos 与句子列表的长度 L 相同。通常情况下是这样,除非 spaCy 将标签分配给 Python 不单独索引的句子元素。在那种情况下,词性列表比句子列表长。例如,spaCy 将括号“(”或单词“.”后面的句号视为单独的位置,而 Python 则不会。因此,'X' 在句子中放错了位置。

如何解决这个问题?

下面是一个例子。

import pandas as pd
import spacy
nlp = spacy.load('en')

s = "Dr. John (a fictional chartacter) never shakes hands."
df = pd.DataFrame({'sentence':[s]})
k = df['sentence']

def marking(row):
    L = row
    sentence_spacy = nlp(L)
    pos = [] # store the pos tags in a list 'pos'
    for token in sentence_spacy:
        pos.append(token.tag_)
        print(pos)
    if "VBZ" in pos:
        x = pos.index("VBZ")
        L = L.split()
        L.insert(x, "X")
        L = " ".join(L) # split the sentence also in a list
        print(L)
        return L
x = k.apply(marking)
print(x)    

这给出:

pos = ['NNP', 'NNP', '-LRB-', 'DT', 'JJ', 'NN', '-RRB-', 'RB', 'VBZ', 'NNS', '.']
L = ['Dr.', 'John', '(a', 'fictional', 'chartacter)', 'never', 'shakes', 'hands.']

并且因为 pos-list pos 比 sentence 列表 L 长,结果是:

 x = "Dr. John (a fictional chartacter) never shakes hands. X"

但我想要这个:

x = "Dr. John (a fictional chartacter) never X shakes hands."

我的问题有两个:

  1. 是否可以在 spaCy 中排除某些 POS 标签?例如,我可以排除 ['-LRB-', '-RRB-', etc.] 吗?这将使 length pos == length L

  2. 如果这不可能,我应该如何更改我的函数,以便可以指定从 pos 中删除的 POS 标签列表 ['-LRB-', '-RRB-', etc.],以便长度pos-list的长度与句子列表的长度相同?

标记化比拆分更复杂。即使丢弃令牌也不会使拆分对应于 spaCy 的令牌(尝试 nlp('non-trivial'))。幸运的是,有更好的方法:您可以从标记中重建句子并在所需位置插入您的标记:

def marking(row):
    chunks = []
    for token in nlp(row):
        if token.tag_ == 'VBZ':
            chunks.append('X')
        chunks.append(token.text_with_ws)
    return ' '.join(chunks)

print(marking("Dr. John (a fictional chartacter) never shakes hands."))