Пространство, определяющее пустые пространства как объекты

Я только начинаю работать со Spacy и вставил текст, чтобы проверить, как он работает с PDF-файлом, который я распознал с помощью AntFileConverter.

Файл txt (образец ниже - будет прикреплен, но не знаю, как) выглядит нормально, находится в UTF-8. Однако, когда я вывожу файл в формате CONLL, по какой-то причине появляются различные очевидные пробелы, в которых нет исходного слова, но, похоже, они были идентифицированы. Это происходит как в конце, так и внутри предложений.

"вид во многих водах в северном полушарии. В большинстве стран региона щука имеет как коммерческую, так и рекреационную ценность (Crossman & Casselman 1987; Raat 1988). Щука - типичный хищник, сидящий и выжидающий, который обычно охотится на добычу, устраивая засады ( Webb & Skadsen 1980) ".

Вывод получился так:

        GPE 24  
26  species specie  NNS     20  attr
27  in  in  IN      26  prep
28  many    many    JJ      29  amod
29  waters  water   NNS     27  pobj
30  in  in  IN      29  prep
31  the the DT      33  det
32  northern    northern    JJ      33  amod
33  hemisphere  hemisphere  NN      30  pobj
34  .   .   .       20  punct
1   In  in  IN      9   prep
2   

        GPE 1   
3   most    most    JJS     4   amod
4   countries   country NNS     9   nsubj
5   in  in  IN      4   prep
6   the the DT      8   det
7   region  region  NN      8   compound
8   pike    pike    NN      5   pobj
9   has have    VBZ     0   ROOT
10  both    both    DT      11  preconj
11  commercial  commercial  JJ      9   dobj
12  

        GPE 11  
13  and and CC      11  cc
14  recreational    recreational    JJ      15  amod
15  value   value   NN      11  conj
16  (   (   -LRB-       15  punct
17  Crossman    crossman    NNP ORG 15  appos
18  &   &   CC  ORG 17  cc
19  Casselman   casselman   NNP ORG 17  conj
20  1987    1987    CD  DATE    17  nummod
21  ;   ;   :       15  punct
22  

        GPE 21  
23  Raat    raat    NNP     15  appos
24  1988    1988    CD  DATE    23  nummod
25  )   )   -RRB-       15  punct
26  .   .   .       9   punct
1   Pike    pike    NNP     2   nsubj
2   is  be  VBZ     0   ROOT
3   a   a   DT      10  det
4   typical typical JJ      10  amod
5   sit sit NN      10  nmod
6   -   -   HYPH        5   punct
7   and and CC      5   cc
8   -   -   HYPH        9   punct
9   wait    wait    VB      5   conj
10  predator    predator    NN      2   attr
11  

        GPE 10  
12  which   which   WDT     14  nsubj
13  usually usually RB      14  advmod
14  hunts   hunt    VBZ     10  relcl
15  prey    prey    NN      14  dobj
16  by  by  IN      14  prep
17  ambushing   ambush  VBG     16  pcomp
18  (   (   -LRB-       17  punct
19  Webb    webb    NNP     17  conj
20  &   &   CC      19  cc
21  

Я также пробовал без распечатки NER, но эти пробелы продолжают отмечаться. Я подумал, что это может быть связано с разрывами строк, поэтому я также попытался использовать EOL в стиле Linux, но это не имело никакого значения.

Это код, который я использую:

import spacy
import en_core_web_sm
nlp_en = en_core_web_sm.load()
input = open('./input/55_linux.txt', 'r').read()
doc = nlp_en(input)
for sent in doc.sents:
        for i, word in enumerate(sent):
              if word.head == word:
                 head_idx = 0
              else:
                 head_idx = word.head.i - sent[0].i + 1
              output = open('CONLL_output.txt', 'a')
              output.write("%d\t%s\t%s\t%s\t%s\t%s\t%s\n"%(
                 i+1, # There's a word.i attr that's position in *doc*
                  word,
                  word.lemma_,
                  word.tag_, # Fine-grained tag
                  word.ent_type_,
                  str(head_idx),
                  word.dep_ # Relation
                 ))

У кого еще возникла эта проблема? Если да, то знаете, как я могу это решить?


person Sandra Young    schedule 17.10.2018    source источник


Ответы (1)


Это известная ошибка в spaCy.

Пока это не будет исправлено, вам придется провести некоторую пост-обработку, чтобы избавиться от этих "пустых" сущностей. К счастью, это достаточно просто. Этот фрагмент, опубликованный автором библиотеки, показывает, как:

def remove_whitespace_entities(doc):
    doc.ents = [e for e in doc.ents if not e.text.isspace()]
    return doc

nlp_en.add_pipe(remove_whitespace_entities, after='ner')

Итак, вы сначала определяете конвейер постобработки, который фильтрует все сущности с text, состоящим исключительно из символов пробела (используя _ 3_).

Затем вы добавляете этот канал в конвейер NLP, настроенный на запуск после NER. Тогда каждый раз, когда вы после этого используете nlp_en, он не вернет эти сущности.

person O.O.Balance    schedule 19.10.2018