Я хочу отметить положение глаголов в предложениях, добавив «X» перед глаголом.Моя функция предпринимает следующие шаги для достижения этой цели.
- Найдите глагол.Я использую spaCy для маркировки POS.SpaCy выводит список POS-тегов, которые я называю
pos
, где каждое слово в предложении представлено в виде тега. - Преобразование предложения также в список
L
. - Определите индекс
x
тега глагола (например, "VBZ"
) в списке POS. - Вставьте нужную метку '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."
У меня вопрос двоякий:
Можно ли исключить определенные POS-теги в spaCy? Например, могу ли я исключить ['-LRB-', '-RRB-' и т. Д.]? Это даст длину pos == длина L
Если это невозможно, как мне изменить мою функцию, чтобы можно было указать список POS-тегов ['-LRB-', '-RRB-', etc.]
, которые удаляются из pos
, чтобы длина pos-списка была равнадлина списка предложений?