Я пишу обзор литературы для своей диссертации и дошел до того, что потерял счет тому, сколько цитат я уже включил.

Так как я все еще пишу первый черновик, я ввожу цитаты вручную, в форме («reference_title», стр. номер_страницы) или просто («reference_title»). Например, («Обучающая аналитика — определения, процессы и потенциал», стр. 2) или («Разыскивается: дорожная карта для понимания интегрированных систем обучения») соответственно.

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

Таким образом, я придумал короткий скрипт Python для решения моей проблемы. Он загружает документ Word, находит все экземпляры этого формата цитирования с помощью регулярных выражений (Regex) и возвращает найденные цитирования. Скрипт использует пакет docx2txt для загрузки файла Word (файл с расширением .docx) в одну строку Python.

Поиск цитат в моем собственном формате

Чтобы показать, как работает скрипт, мы будем использовать старый добрый текст Lorem Ipsum с некоторыми цитатами (цитаты включены в начало следующего кода):

Первая часть (до строки 17) довольно проста: импортируйте стандартные библиотеки регулярных выражений docx2txt и Python, загрузите текст из файла Word в виде одной строки (строка 10) и замените любые стилизованные кавычки, которые могут быть в тексте, на обычные двойные кавычки (строки 16 и 17).

Во второй части (строки 19–23) я определил шаблон регулярного выражения для поиска цитат (строка 21) и пытался найти их в тексте (строка 23).

На картинке выше я разделил узор на три части, обозначив их цветом:

  • Красный: открывающие круглые скобки любой цитаты (предыдущий обратный слеш экранирует круглые скобки, так что он соответствует буквальным скобкам в качестве первого символа)
  • Синий: буквальные двойные кавычки (которые ограничивают название цитируемого документа)
  • Зеленый: соответствует любому символу в двойных кавычках, который не является двойной кавычкой (то есть заголовку цитируемого документа).

Другими словами, приведенный выше шаблон регулярного выражения соответствует любому заголовку документа, заключенному в кавычки, перед которым стоит открывающая скобка. Например, для цитаты ("Learning Analytics — Definitions, Processes and Potential", p.2) шаблон соответствует только от начала до второй двойной кавычки включительно, ("Learning Analytics — Definitions, Processes and Potential". Ведь имеет значение только название цитаты. Открывающая скобка помогает идентифицировать заголовки документов.

Зеленая часть с символом вставки (^) и двойной кавычкой в ​​квадратных скобках означает, что шаблон ищет одиночный символ, который не являетсядвойной кавычкой. Звездочка за скобками называется подстановочным знаком и означает, что выбор одного символа может повторяться ноль или более раз. В контексте полного шаблона эта зеленая часть отвечает за поиск заголовка документа, заключенного в двойные кавычки (те, что в синем).

Наконец, третья часть (строки 25 до конца) перебирает итерацию найденных совпадений/цитатов, чтобы сохранить их в списке. Поскольку каждое совпадение включает первый и последний индексы совпадающей подстроки относительно исходного текста/строки, мы используем эти индексы для извлечения совпадающей части. Остальное — это простой Python для печати всех найденных цитат, сначала всех, а затем только уникальных (преобразование list цитат в set удаляет повторяющиеся цитаты, а преобразование уникальных цитат в list — это просто вопрос предпочтения) .

Наконец, вывод для этого скрипта и примера файла .docx:

All citations found: 3
("Wanted: A road map for understanding Integrated Learning Systems"
("Wanted: A road map for understanding Integrated Learning Systems"
("Learning Analytics - Definitions, Processes and Potential"
Unique citations: 2
("Wanted: A road map for understanding Integrated Learning Systems"
("Learning Analytics - Definitions, Processes and Potential"

Я мог бы убрать открывающую скобку из цитат, но можно и оставить. Даже если бы я хотел отсортировать результаты, я мог бы просто вызвать функцию sorted() в списке уникальных цитат.

Обобщенное решение для цитат APA

Хотя приведенное выше решение решает мою конкретную проблему, я решил сделать шаг вперед и создать регулярное выражение, которое работает для реальных цитат, особенно для тех, которые написаны в стиле APA. Как вы можете видеть в этом втором коде, единственное, что меняется в коде, — это шаблон регулярного выражения (ну, если быть точным, примеры цитирования в начале и имя загруженного файла .docx также различаются). .

Прежде чем объяснять регулярное выражение, позвольте мне объяснить, что оно на самом деле ищет: все, что заключено в круглые скобки, включительно. Цитаты APA не включают название документа, вместо этого они включают автора(ов) и дату/год, поэтому я посчитал, что полное цитирование является уместным. Кроме того, эти (ложные) примеры цитирования имеют некоторые вариации в соответствии с некоторыми возможными сценариями цитирования в стиле APA:

  • Автор может быть одним или несколькими авторами, анонимными (идентифицированными как Anonymous) или фактически названием документа, заключенным в двойные кавычки (для онлайн-сообщений/статей без автора).
  • Датой может быть один год, отсутствующая дата (обозначается как nd) или одна из нескольких публикаций для этого автора в этом году (который обозначается как год с буквенным суффиксом).

А теперь о монстре регулярного выражения:

То, что осталось черным (круглые скобки цитат), — это единственное, что не входит в группу регулярных выражений. Группы регулярных выражений заключены в круглые скобки, поэтому эта пара, выделенная черным, имеет предшествующую обратную косую черту, чтобы шаблон мог соответствовать буквальным закрывающим скобкам для цитирования.

Три группы в этом шаблоне имеют цветовую кодировку:

  • Красный: группа, соответствующая автору цитирования, независимо от типа автора.
  • Зеленый: группа, соответствующая запятой и пробелу, разделяющим автора и год.
  • Синий: группа, соответствующая году, независимо от типа года.

А теперь, поскольку группы, соответствующие автору и году, имеют несколько шаблонов внутри, позвольте мне объяснить каждую группу более подробно. Первая авторская группа.

Чтобы облегчить чтение, я изменил скобки группы на черные, а также вертикальные полосы. Как видно по цветам, у этой единственной группы для поиска самого автора есть три альтернативы, в соответствии с возможными альтернативами авторов, упомянутыми ранее. На простом английском языке и зная, что вертикальные полосы означают альтернативную возможность сопоставления, эта первая группа регулярных выражений соответствует авторам цитат как: «любое количество символов, которые не являются двойной кавычкой или закрывающей скобкой ИЛИ словом Anonymous ИЛИ онлайн-публикацией/статьей заголовок, если он не содержит вложенных двойных кавычек или закрывающей скобки». Теперь по одному:

  • Первый вариант (красный) ищет наиболее распространенный вариант с одним автором, двумя авторами или более; логика очень похожа на то, что вы видели в шаблоне регулярного выражения для стиля цитирования, который я использую
  • Второй вариант (зеленый) просто ищет слово Anonymous. Чтобы слово Anonymous было сопоставлено с автором цитирования, вы можете подумать, что \bs гарантируют, что слово будет найдено как целое слово, и, к счастью, запятая между автором и датой и открывающая скобка цитирования работают как разделители для подтвердите, что это целое слово
  • Третий вариант (синий) идентичен первому варианту, но на этот раз включает закрывающие двойные кавычки, потому что так пишется третий вариант автора, заголовок поста/статьи заключен в двойные кавычки.

Вторая группа шаблона обеспечивает буквальное соответствие запятой и пробелу, разделяющим автора и дату цитирования. Очень просто, к счастью, то, что вы видите, это то, что вы получаете.

Хорошо, еще одно объяснение, и я обещаю, что это конец этой ерунды с регулярными выражениями. Опять же, как это случилось с группой авторов, группа даты имеет три варианта, разделенных вертикальными чертами. Во-первых, в английском языке это то, как эта группа соответствует датам цитирования: «любые цифры, которые появляются более одного раза подряд (например, год) ИЛИ n.d. выражение ИЛИ год, за которым следует буква). Это относительно простой шаблон после всего остального, но вот более конкретное объяснение для каждой альтернативы:

  • Первый вариант (красный) соответствует одной или нескольким последовательным цифрам (\d соответствует цифрам, то есть от 0 до 9). Знак «плюс» за скобками — это еще один подстановочный знак, означающий, что шаблон ищет одну или несколько последовательных цифр (невозможно найти год, хотя я мог бы указать, чтобы он находил 4 последовательных цифры вместо поиска одной или нескольких).
  • Второй вариант (зеленый) просто ищет буквальное значение n.d. (без даты) тип даты. Каждая точка экранируется, потому что в регулярном выражении точка соответствует любому символу, и нам нужны буквальные точки здесь
  • Последний вариант (синий) выглядит как красный год, но на этот раз он должен иметь дополнительную букву в конце (\w соответствует любой букве, a-z)

Наконец, вывод для этого второго скрипта:

All citations found: 21
(Anonymous, 2010)
("Barcelona to Ban Burqa", 2010)
(Sabbagh, n.d.)
(Sabbagh, 2009)
(Qianyi Gu & Sumner, 2006)
(Anonymous, n.d.)
(Sabbagh, n.d.)
(Sabbagh, 2010a)
(Sabbagh, 2010b)
(Anonymous, 2010)
("Barcelona to Ban Burqa", 2010)
(Qianyi Gu & Sumner, 2006)
(Sabbagh, 2009)
(Anonymous, n.d.)
(Qianyi Gu & Sumner, 2006)
(Anonymous, n.d.)
(Despotovic-Zrakic et al., 2012)
(Despotovic-Zrakic et al., 2012)
("Barcelona to Ban Burqa", 2010)
(Anonymous, 2010)
("Barcelona to Ban Burqa", 2010)
Unique citations: 9
(Qianyi Gu & Sumner, 2006)
(Sabbagh, 2009)
(Sabbagh, 2010b)
("Barcelona to Ban Burqa", 2010)
(Sabbagh, n.d.)
(Anonymous, 2010)
(Sabbagh, 2010a)
(Anonymous, n.d.)
(Despotovic-Zrakic et al., 2012)

Выводы

Написание этих двух скриптов и этой статьи, которую вы читаете, было забавным способом провести воскресный день вместо того, чтобы возобновлять обзор литературы :) Написание кода было чрезвычайно простым, много времени ушло на придумывание этих регулярных выражений, чтобы найти цитаты.

Кстати, необходимость замены стилизованных двойных кавычек на кавычки по умолчанию была вызвана тем, что в файлах Word/.docx использовались первые, а не вторые, а значит, регулярные выражения не находили результатов. Да, я мог бы вместо этого поискать стилизованные кавычки, но почему бы не сделать эти замены в Python.

И последнее замечание: использование функции finditer() для выполнения совпадений предназначено для экономии памяти. Вместо того, чтобы создавать список совпадений непосредственно в памяти с помощью функции findall(), предыдущая функция возвращает итератор, то есть после сопоставления вы можете просто перебирать этот итератор по одному совпадению за раз вместо того, чтобы помещать их все в память сразу с помощью список. Однако в конце сценариев я проигнорировал эту проблему с памятью ради демонстрации.

Если вы хотите запустить эти скрипты самостоятельно, интерактивная демонстрация для формата моя цитата доступна здесь, а другая для цитат APA — здесь. Скрипты и соответствующие файлы примеров .docx также доступны на GitHub.