Определите цитаты в тексте (в APA, MLA, Гарварде, Ванкувере и др. c.) С Python - PullRequest
2 голосов
/ 06 января 2020

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

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

Сначала я разложил текст по тексту в предложения:

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

enter image description here Это делает список типов (ss), поэтому я преобразовал список в str в используйте re findall:

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

Затем моя идея состояла в том, чтобы определить предложения, которые содержали четыре числа git:

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

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

Ответы [ 2 ]

1 голос
/ 07 января 2020

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

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

A Пример 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)
1 голос
/ 06 января 2020
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
...