Идентифицируйте цитаты в тексте (в APA, MLA, Harvard, Vancouver и т. д.) с помощью Python

Я пытаюсь определить все предложения, содержащие цитаты в тексте в журнальной статье в формате pdf. Я преобразовал .pdf в .txt и хотел найти все предложения, содержащие цитату, возможно, в одном из следующих форматов:

  1. Смит (1990) заявил, что....
  2. Было заключено соглашение о... (Смит, 1990).
  3. Было заключено соглашение о... (апрель 2005 г.; Смит, 1990 г.)
  4. Смеси вышеперечисленных

Сначала я разбил txt на предложения:

import nltk
from nltk.tokenize import sent_tokenize
ss = sent_tokenize(text)

введите описание изображения здесь Получается список type(ss), поэтому я преобразовал список в str, чтобы использовать re findall:

def listtostring(s):
    str1 = ' '
    return (str1. join(s))
ee = listtostring(ss)

Затем моя идея заключалась в том, чтобы идентифицировать предложения, содержащие четырехзначное число:

import re
for sentence in ee:
    zz = re.findall(r'\d{4}', ee)
    if zz:
        print (zz)

Однако при этом извлекаются только годы, но не предложения, содержащие годы.


person gzhang7    schedule 06.01.2020    source источник
comment
Отвечает ли это на ваш вопрос? Регулярное выражение для распознавания цитат в тексте   -  person Davide Fiocco    schedule 13.11.2020


Ответы (2)


import re
l = ['This is 1234','Hello','Also 1234']

for sentence in l:
    if re.findall(r'\d{4}',sentence):
        print(sentence)

Выход

This is 1234
Also 1234
person Chris    schedule 06.01.2020

Используя регулярное выражение, что-то (попробуйте), что может иметь достойный отзыв, пытаясь избежать неуместных спичек (\d{4} может дать вам несколько)

\(([^)]+)?(?:19|20)\d{2}?([^)]+)?\)

Пример python (с использованием spaCy вместо NLTK) будет тогда

import re
import spacy

nlp = spacy.load('en_core_web_sm')

doc = nlp("One statement. Then according to (Smith, 1990) everything will be all right. Or maybe not.")

l = [sent.text for sent in doc.sents]

for sentence in l:
    if re.findall(r'\(([^)]+)?(?:19|20)\d{2}?([^)]+)?\)', sentence):
        print(sentence)
person Davide Fiocco    schedule 06.01.2020