首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否有可能在spaCy中排除某些POS机标签?Python

是否有可能在spaCy中排除某些POS机标签?Python
EN

Stack Overflow用户
提问于 2018-06-03 00:42:31
回答 1查看 881关注 0票数 2

我想通过在动词前加一个“X”来标记动词在句子中的位置。我的函数执行以下步骤来实现这一点。

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

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

如何解决这个问题?

下面是一个例子。

代码语言:javascript
复制
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)    

这提供了:

代码语言:javascript
复制
pos = ['NNP', 'NNP', '-LRB-', 'DT', 'JJ', 'NN', '-RRB-', 'RB', 'VBZ', 'NNS', '.']
L = ['Dr.', 'John', '(a', 'fictional', 'chartacter)', 'never', 'shakes', 'hands.']

因为词表pos比句子列表L长,所以结果是:

代码语言:javascript
复制
 x = "Dr. John (a fictional chartacter) never shakes hands. X"

但我想要的是:

代码语言:javascript
复制
x = "Dr. John (a fictional chartacter) never X shakes hands."

我的问题有两个:

  1. 是否可以在spaCy中排除某些POS机标签?例如,我可以排除'-LRB-','-RRB-‘等吗?这将使length pos == length L
  2. 如果这是不可能的,我应该如何更改我的函数,以便可以指定从pos中删除的词性标签列表,以便pos-list的长度与句子列表的长度相同?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-03 01:20:59

标记化比拆分更复杂。即使删除标记,也不会使split与spaCy的标记相对应(尝试nlp('non-trivial'))。幸运的是,有一种更好的方法:你可以从标记中重构句子,并在所需的位置插入标记:

代码语言:javascript
复制
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."))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50659061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档