是否可以在 spaCy 中排除某些 POS 标签? Python
Is it possible to exclude certain POS tags in spaCy? Python
我想通过在动词前添加 'X' 来标记动词在句子中的位置。我的函数采用以下步骤来实现这一点。
- 找到动词。我使用 spaCy 进行 POS 标记。 SpaCy 输出一个 POS 标签列表,我称之为
pos
,其中句子中的每个单词都表示为一个标签。
- 将句子也转换成列表
L
。
- 确定动词标签(例如
"VBZ"
)在词性列表中的索引x
。
- 将索引
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."
我的问题有两个:
是否可以在 spaCy 中排除某些 POS 标签?例如,我可以排除 ['-LRB-', '-RRB-', etc.] 吗?这将使 length pos == length L
如果这不可能,我应该如何更改我的函数,以便可以指定从 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."))
我想通过在动词前添加 'X' 来标记动词在句子中的位置。我的函数采用以下步骤来实现这一点。
- 找到动词。我使用 spaCy 进行 POS 标记。 SpaCy 输出一个 POS 标签列表,我称之为
pos
,其中句子中的每个单词都表示为一个标签。 - 将句子也转换成列表
L
。 - 确定动词标签(例如
"VBZ"
)在词性列表中的索引x
。 - 将索引
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."
我的问题有两个:
是否可以在 spaCy 中排除某些 POS 标签?例如,我可以排除 ['-LRB-', '-RRB-', etc.] 吗?这将使 length pos == length L
如果这不可能,我应该如何更改我的函数,以便可以指定从
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."))