Python SpaCy пересечение кусков и токенов - PullRequest
1 голос
/ 08 июля 2019

Я и пишу код для извлечения определенной информации из текстов, и я использую spaCy.

Цель состоит в том, чтобы ЕСЛИ конкретный токен текста содержать строку «refstart», тогда я хочу получить кусок существительногопредшествующий этому токену.просто для информации: этот токен, содержащий «refstart» и «refend», генерируется с помощью регулярного выражения ранее для создания объекта nlp в spacy.

Пока я использую этот код:

import spacy
nlp = spacy.load('en_core_web_sm')
raw_text='Figure 1 shows a cross-sectional view refstart10,20,30refend of a 
refrigerator refstart41,43refend that uses a new cooling technology  refstart10,23a,45refend including a retrofitting pump including high density fluid refstart10refend.'

doc3=nlp(raw_text)

list_of_references=[]
for token in doc3:
    # look if the token is a ref. sign
    # in order to see the functioning of the loops uncomment the prints
    # print('looking for:', token.text)
    if 'refstart' in token.text:
        #print('yes it is in')
        ref_token_text     = token.text
        ref_token_position = token.i
        # print('token text:',ref_token_text)
        for chunk in doc3.noun_chunks:
             if chunk.end == ref_token_position:
                 # we have a chunck and a ref. sign
                 list_of_references.append((chunk.text, chunk.start, chunk.end, ref_token_text))
                 break

Thisработает, я получаю список с кортежами, включающими в себя существительные chunck, начало конца и текст токена, следующий за существительным chunck, который включает в себя строку refstart.

результат этого кода должен быть:

  • вид в поперечном сечении, refstart10,20,30refend
  • холодильник, refstart41,43refend
  • новая технология охлаждения, refstart10,23a,45refend
  • жидкость высокой плотности, refstart10refend

Посмотрите, как «модифицирующий насос» не входит в список, потому что за ним не следует токен, включающий «refstart»

Это, тем не менее, очень неэффективно для циклов над текстом, которыеочень большое значение может сильно замедлить конвейер данных.

Решение 2: Я думал о создании списка токенов с их позициями и списка существительных кусков

# built the list with all the noun chunks, start and end in the text
list_chunks=[]
print("chuncks")
for chunk in doc3.noun_chunks:
   list_chunks.append((chunk.text,chunk.start,chunk.end))
   try:
       print(f'start:{chunk.start},end:{chunk.end} \t \t {chunk.text} \t following text:{doc3[chunk.end+1]}')
   except:
       # this is done just to avoid error breaking in the last chunk
       print(f'start:{chunk.start},end:{chunk.end} \t \t {chunk.text} \t following text:last on')

 print("refs------------------")  
 # build the list with all the tokens and their position
 list_ref_tokens=[]
 for token in doc3:
     if 'refstart' in token.text:
          list_ref_tokens.append((token.text,token.i))
          print(token.text,token.i)

, но теперь я хотел бынадо сравнить Тупels внутри list_chunks и list_ref_tokens, что тоже сложно.

любые другие предложения?

спасибо.

...