我想通过在动词前添加'X'来标记动词在句子中的位置。我的功能采取以下步骤来实现这一目标。
pos
的POS标签列表,其中句子中的每个单词都表示为标签。 L
。 x
(例如"VBZ"
)。x
处插入所需的'X'标记到句子列表中。 步骤4假设列表pos
的长度与句子列表L
的长度相同。通常就是这种情况,除非spaCy将标签分配给Python不单独索引的句子元素。在这种情况下,POS列表比句子列表长。例如,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
比句子列表L
长,所以结果是:
x = "Dr. John (a fictional chartacter) never shakes hands. X"
但我想要这个:
x = "Dr. John (a fictional chartacter) never X shakes hands."
我的问题是双重的:
是否可以在spaCy中排除某些POS标签?例如,我可以排除['-LRB - ',' - RRB - '等]吗?这将使长度为pos == length L
如果无法做到这一点,我应该如何更改我的功能,以便可以指定从['-LRB-', '-RRB-', etc.]
删除的POS标记列表pos
,以便list与句子列表的长度相同?
答案 0 :(得分:2)
标记化比分割更复杂。即使丢弃令牌也不会使分割对应于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."))