是否可以在spaCy中排除某些POS标签?蟒

时间:2018-06-02 16:42:31

标签: python-3.x pandas spacy

我想通过在动词前添加'X'来标记动词在句子中的位置。我的功能采取以下步骤来实现这一目标。

  1. 找到动词。我使用spaCy进行POS标记。 SpaCy输出我称之为pos的POS标签列表,其中句子中的每个单词都表示为标签。
  2. 将句子转换为列表L
  3. 确定POS列表中动词标记的索引x(例如"VBZ")。
  4. 在索引x处插入所需的'X'标记到句子列表中。
  5. 步骤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."
    

    我的问题是双重的:

    1. 是否可以在spaCy中排除某些POS标签?例如,我可以排除['-LRB - ',' - RRB - '等]吗?这将使长度为pos == length L

    2. 如果无法做到这一点,我应该如何更改我的功能,以便可以指定从['-LRB-', '-RRB-', etc.]删除的POS标记列表pos,以便list与句子列表的长度相同?

1 个答案:

答案 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."))