代码之家  ›  专栏  ›  技术社区  ›  twhale

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

  •  2
  • twhale  · 技术社区  · 7 年前

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

    1. 找到动词。我使用spaCy进行词性标注。SpaCy输出我调用的POS标签列表 pos ,其中句子中的每个单词都表示为一个标记。
    2. 把句子也转换成一个列表 L .
    3. 确定指数 x 动词标记(例如。 "VBZ" )在POS列表中。
    4. 在索引处插入所需的“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."
    

    我的问题有两个:

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

    2. 如果不可能,我应该如何更改我的功能,以便可以指定POS标签列表 ['-LRB-', '-RRB-', etc.] 从中删除的 销售时点情报系统 所以词组列表的长度和句子列表的长度相同?

    1 回复  |  直到 7 年前
        1
  •  2
  •   emulbreh    7 年前

    标记化比拆分更复杂。即使丢弃代币也不会使split对应于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."))