Я и пишу код для извлечения определенной информации из текстов, и я использую 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
, что тоже сложно.
любые другие предложения?
спасибо.