我想通过在动词前加一个“X”来标记动词在句子中的位置。我的函数采取以下步骤来实现这一点。
-
找到动词。我使用spaCy进行词性标注。SpaCy输出我调用的POS标签列表
pos
,其中句子中的每个单词都表示为一个标记。
-
把句子也转换成一个列表
L
.
-
确定指数
x
动词标记(例如。
"VBZ"
)在POS列表中。
-
在索引处插入所需的“X”标记
十、
进入句子列表。
第4步假设列表的长度
销售时点情报系统
与句子列表的长度相同
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列表
销售时点情报系统
比句子列表要长
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==长度L
-
如果不可能,我应该如何更改我的功能,以便可以指定POS标签列表
['-LRB-', '-RRB-', etc.]
从中删除的
销售时点情报系统
所以词组列表的长度和句子列表的长度相同?