Научная статья на тему 'Как язык Python помогает лексикографам'

Как язык Python помогает лексикографам Текст научной статьи по специальности «Языкознание и литературоведение»

CC BY
200
57
Читать
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
компьютерная лингвистика / лексикография / компьютерная лексикография / автоматизированная лексикография / компьютерная терминография / автоматическое извлечение терминологии / обработка текстов на естественном языке / прикладная лингвистика / Python / computational linguistics / lexicography / computational lexicology / terminology extraction / natural language processing / Python

Аннотация научной статьи по языкознанию и литературоведению, автор научной работы — Ладушина Мария Игоревна

Современные средства компьютерной обработки текста позволили автоматизировать многие рутинные задачи лексикографов и терминологов. Помимо привычных программных средств, применяемых для вспомогательных задач прикладной лексикографии специалистами по составлению терминологических и других словарей, в решении таких задач может помочь язык программирования Python и его библиотеки, такие как NLTK (Natural Language Toolkit), pymorphy2, mystem и др. Python — один из самых распространенных и доступных в изучении языков программирования, который все шире применяется в прикладной лингвистике. Статья продолжает цикл публикаций, знакомящих практикующих лингвистов и лексикографов с Python и его возможностями для обработки текстов на естественном языке (natural language processing). Описываются техники, которые можно использовать для предварительной обработки текстов с целью последующего извлечения из них терминологии и составления терминологических словарей, в том числе для нужд письменного перевода. В настоящее время эта задача пересекается с использованием систем машинного перевода, в ряде которых реализована функция приоритетного использования пользовательского терминологического двуязычного словаря. Кроме того, некоторые из описанных приемов помогут извлечь информацию из больших корпусов текстов и проанализировать их содержание. В статье описывается порядок выполнения токенизации и лемматизации текста или корпуса текстов, приемы для выделения наиболее частотных лемм, рассматриваются разные подходы к поиску в тексте частотных словосочетаний методом нахождения n-грамм. Техники для автоматического нахождения потенциальных узкоспециальных терминов проиллюстрированы примерами из научно-технического текста. На материале художественного текста показаны методы анализа содержания, например, подсчет частотности определенных лемм в корпусе. Все приведенные примеры кода можно скопировать и запустить в облачной среде Google Colab без установки каких-либо программ на компьютер. Надеемся, что эти приемы облегчат повседневную работу лексикографов, а может быть, и побудят лингвистов к изучению языка Python.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
Предварительный просмотрDOI: 10.33910/2687-0215-2022-4-2-107-121
i Надоели баннеры? Вы всегда можете отключить рекламу.

How Python helps lexicographers

Modern computer text processing tools have made it possible to automate many routine tasks of lexicographers and terminologists. In addition to the usual software used by terminologists for auxiliary tasks in composing terminological and other dictionaries, the Python programming language and its libraries (such as NLTK, pymorphy2, mystem and others) can help to solve such tasks. Python is one of the most widespread and accessible programming languages, more and more widely used in applied linguistics. This article continues the series of publications introducing practicing linguists and lexicographers to Python and its natural language processing capabilities. Techniques are presented that can be used to preprocess texts for the purpose of extracting terminology and compiling terminological dictionaries, including those for the needs of translation. Currently, this task intersects with the use of machine translation systems, some of which implemented the priority usage of a user’s terminological bilingual dictionary. In addition, some of the described techniques can help in the analysis of large corpora content. The article describes the tokenization and lemmatization of texts or corpora, methods of singling out the most frequent lemmas; different approaches to searching for frequent word combinations in a text by means of the n-gram finding are also discussed. Techniques for automatic finding of potential terms are illustrated by examples from a scientific news text. Content analysis techniques, such as frequency counting of specific lemmas in a corpus, are shown on the evidence taken from a fiction text. All the code examples can be copied and run in the Google Colab cloud environment without installing any software on the computer. We hope that these techniques will facilitate the everyday work of lexicographers and, perhaps, motivate linguists to learn Python.

Текст научной работы на тему «Как язык Python помогает лексикографам»

Просто о сложном

Я Check for updates

https://doi.org/10.33910/2687-0215-2022-4-2-107-121

Как язык Python помогает лексикографам

М. И. Ладушина ш

1 Национальный исследовательский технологический университет, 119049, Россия, г. Москва, Ленинский пр., д. 4, стр. 1

Сведения об авторе

Ладушина Мария Игоревна, e-mail: maria.ladushina@gmail.com

Для цитирования: Ладушина, М. И. (2022) Как язык Python помогает лексикографам. Journal of Applied Linguistics and

Lexicography, т. 4, № 2, с. 107-121. https://doi.org/10.33910/2687-0215-2022-4-2-107-121

Получена 2 сентября 2022; принята 8 сентября 2022.

Финансирование: Исследование не имело финансовой поддержки.

Права: © М. И. Ладушина (2022). Опубликовано Российским государственным педагогическим университетом

им. А. И. Герцена. Открытый доступ на условиях лицензии CC BY-NC 4.0.

Аннотация. Современные средства компьютерной обработки текста позволили автоматизировать многие рутинные задачи лексикографов и терминологов. Помимо привычных программных средств, применяемых для вспомогательных задач прикладной лексикографии специалистами по составлению терминологических и других словарей, в решении таких задач может помочь язык программирования Python и его библиотеки, такие как NLTK (NaturalLanguage Toolkit), pymorphy2, mystem и др. Python — один из самых распространенных и доступных в изучении языков программирования, который все шире применяется в прикладной лингвистике. Статья продолжает цикл публикаций, знакомящих практикующих лингвистов и лексикографов с Python и его возможностями для обработки текстов на естественном языке (natural language processing). Описываются техники, которые можно использовать для предварительной обработки текстов с целью последующего извлечения из них терминологии и составления терминологических словарей, в том числе для нужд письменного перевода. В настоящее время эта задача пересекается с использованием систем машинного перевода, в ряде которых реализована функция приоритетного использования пользовательского терминологического двуязычного словаря. Кроме того, некоторые из описанных приемов помогут извлечь информацию из больших корпусов текстов и проанализировать их содержание.

В статье описывается порядок выполнения токенизации и лемматизации текста или корпуса текстов, приемы для выделения наиболее частотных лемм, рассматриваются разные подходы к поиску в тексте частотных словосочетаний методом нахождения n-грамм. Техники для автоматического нахождения потенциальных узкоспециальных терминов проиллюстрированы примерами из научно-технического текста. На материале художественного текста показаны методы анализа содержания, например, подсчет частотности определенных лемм в корпусе. Все приведенные примеры кода можно скопировать и запустить в облачной среде Google Colab без установки каких-либо программ на компьютер. Надеемся, что эти приемы облегчат повседневную работу лексикографов, а может быть, и побудят лингвистов к изучению языка Python.

Ключевые слова: компьютерная лингвистика, лексикография, компьютерная лексикография, автоматизированная лексикография, компьютерная терминография, автоматическое извлечение терминологии, обработка текстов на естественном языке, прикладная лингвистика, Python

УДК 8Г33

How Python helps lexicographers

M. I. Ladushina ш

1 National University of Science and Technology "MISIS", Bld. 1 4 Leninskiy Ave., Moscow 119049, Russia Author

Maria I. Ladushina, e-mail: maria.ladushina@gmail.com

For citation: Ladushina, M. I. (2022) How Python helps lexicographers. Journal of Applied Linguistics and Lexicography, vol. 4, no. 2, pp. 107-121. https://doi.org/10.33910/2687-0215-2022-4-2-107-121

Received 2 September 2022; accepted 8 September 2022.

Funding: The study did not receive any funding.

Copyright: © M. I. Ladushina (2022). Published by Herzen State Pedagogical University of Russia. Open access under CC BY-NC License 4.0.

Abstract. Modern computer text processing tools have made it possible to automate many routine tasks of lexicographers and terminologists. In addition to the usual software used by terminologists for auxiliary tasks in composing terminological and other dictionaries, the Python programming language and its libraries (such as NLTK, pymorphy2, mystem and others) can help to solve such tasks.

Python is one of the most widespread and accessible programming languages, more and more widely used in applied linguistics. This article continues the series of publications introducing practicing linguists and lexicographers to Python and its natural language processing capabilities. Techniques are presented that can be used to preprocess texts for the purpose of extracting terminology and compiling terminological dictionaries, including those for the needs of translation. Currently, this task intersects with the use of machine translation systems, some of which implemented the priority usage of a user's terminological bilingual dictionary. In addition, some of the described techniques can help in the analysis of large corpora content. The article describes the tokenization and lemmatization of texts or corpora, methods of singling out the most frequent lemmas; different approaches to searching for frequent word combinations in a text by means of the n-gram finding are also discussed. Techniques for automatic finding of potential terms are illustrated by examples from a scientific news text. Content analysis techniques, such as frequency counting of specific lemmas in a corpus, are shown on the evidence taken from a fiction text. All the code examples can be copied and run in the Google Colab cloud environment without installing any software on the computer. We hope that these techniques will facilitate the everyday work of lexicographers and, perhaps, motivate linguists to learn Python.

Keywords: computational linguistics, lexicography, computational lexicology, terminology extraction, natural language processing, Python

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

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

с иностранных языков. Так, при подготовке к проекту по переводу технической документации проводится следующая предварительная работа: выделяются все термины из текста, подлежащего переводу, подбираются к этим терминам эквиваленты на целевом языке, и таким образом составляется терминологическая база для переводчиков. Данная база затем используется в системах автоматизированного перевода (CAT-системах1) и особенно ценна тогда, когда над проектом работают несколько переводчиков: без нее гораздо сложнее соблюсти единообразие в переводе терминов, а значит, и целостность (consistency) перевода.

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

Максимальная автоматизация составления терминологических списков из текстов — задача, над которой интенсивно работают разработчики переводческого и другого лингвистического ПО. Идеальным было бы не только автоматически вычленять терминологию из текста оригинала, но и при наличии параллельных корпусов на двух и более языках осуществлять выделение соответствий из текста перевода. В этом случае лексикографу не пришлось бы подбирать соответствия для терминов, выделенных из исходного текста. Однако «двуязычное», полностью автоматическое извлечение терминологии пока до конца не реализовано в связи со специфическими сложностями этой задачи. Для извлечения терминов-«кандидатов» из текста на одном языке уже существует ряд решений, но все они по-прежнему требуют «ручного» труда терминолога — проверки и редактирования полученного списка лексических единиц.

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

Python — один из самых популярных, понятных и доступных для изучения языков программирования (Любанович 2021; Митренина 2019). Кроме того, он снискал особую популярность среди компьютерных лингвистов благодаря множеству разработанных библиотек для работы с текстовыми данными. Для английского и в меньшей степени для других языков это в первую очередь NLTK (Natural Language Toolkit) и SpaCy, для русского — pymorphy2 и mystem. Некоторые из этих библиотек будут использованы в коде, приведенном далее.

Статья рассчитана на тех, кто никогда не программировал на Python, поэтому код будет запускаться и выполняться в облачном блокноте Google Colab — удобной и бесплатной среде, не требующей установки языка Python и его библиотек на компьютер пользователя. Для запуска алгоритма достаточно перейти на сервис по ссылке https://colab.research.google. com/ и выбрать пункт меню Файл ^ Создать блокнот. На начальной странице проекта также приводится краткая инструкция по работе со средой.

1 Computer Assisted Translation Tools (CAT tools) — программы, основанные на технологии Translation Memory и позволяющие частично автоматизировать работу над письменным переводом. Это не то же самое, что системы машинного перевода.

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

В первых операциях для более наглядной иллюстрации работы кода будут использованы два предложения из художественного текста. Затем с целью поиска узкоспециальных терминов мы обратимся к небольшой новости о научных разработках одного из университетов. На ее примере будет показана предобработка текста для последующего составления терминологического мини-словаря на материале конкретного текста.

Для выполнения описываемых операций вам понадобится текст без посторонних ссылок и изображений. Лучше предварительно скопировать его в файл .txt. Однако, чтобы избежать сложностей с обращением к файлу по имени, а также для облегчения работы в облачной среде, программа не будет взаимодействовать с самим файлом. Код реализован так, чтобы текст можно было просто вставить в соответствующее окно:

jj^j ' ~ Текст^для обработки: Однажды весною, в час небывало жаркого заката, в Москве, на Патриарших прудах, появились два гражданина.

Рис. 1. Начало работы в Google Colab Fig. 1. Getting Started in Google Colab

Код для вставки в первую ячейку блокнота может быть таким:

text = input(«TeKCT для обработки: «)

Или же можно вставить имеющийся у вас текст непосредственно в переменную text, взяв его в кавычки:

text = «Однажды весною, в час небывало жаркого заката, в Москве, на Патриарших прудах, появились два гражданина. Первый из них, одетый в летнюю серенькую пару, был маленького роста, упитан, лыс, свою приличную шляпу пирожком нес в руке, а на хорошо выбритом лице его помещались сверхъестественных размеров очки в черной роговой оправе.»

При этом можно использовать и тексты гораздо большего объема: например, все описанные ниже процедуры можно применить к полному тексту романа М. А. Булгакова почти без потерь в производительности. Результат обработки, также выводимый в блокноте Colab, можно будет скопировать для дальнейшего использования. Важно отметить, что программный код в ячейки блокнота должен быть скопирован с сохранением всех отступов.

Перед началом работы необходимо загрузить все необходимые библиотеки. Для этого вставляем в ячейку 2 следующий код и запускаем ее:

import nltk

nltk.download('punkt')

nltk.download(«stopwords»)

from nltk.corpus import stopwords

russian stopwords = stopwords.words(«russian»)

from pymystem3 import Mystem

mystem = Mystem()

!pip install pymorphy2 import pymorphy2

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

# токены по порядку следования в тексте, без знаков препинания и букв в верхнем регистре

import re

cleaned = re.sub('\W+', ' ', text.lower())

tokens = cleaned.split()

print(cleaned)

print(tokens)

Получим результат:

['однажды', 'весною', 'в', 'час', 'небывало', 'жаркого', 'заката', 'в', 'москве', 'на', 'патриарших', 'прудах', 'появились', 'два', 'гражданина', 'первый', 'из', 'них', 'одетый', ...].

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

# токены по порядку следования в тексте после удаления стоп-слов tokens minus stopwords = [token for token in tokens if token not in russian stopwords and len(token) >= 2]

print(tokens minus stopwords)

Результат:

['однажды', 'весною', 'час', 'небывало', 'жаркого', 'заката', 'москве', 'патриарших', 'прудах', 'появились', 'гражданина', 'первый', 'одетый', 'летнюю', 'серенькую', 'пару'.].

Этот список (из переменной tokens_minus_stopwords) нам пригодится в дальнейшем. Однако для задач компьютерной лексикографии и терминографии удобнее работать с начальными формами слов. Для этого выполним лемматизацию (приведение к начальной форме), причем используем две библиотеки и сравним результат. С каждой из библиотек выполним лемматизацию как со стоп-словами, так и без них. Как будет показано далее, для поиска часто встречаемых в тексте словосочетаний списки лемм со стоп-словами использовать эффективнее, поэтому выполним алгоритм по всем четырем ячейкам:

# лемматизация с помощью библиотеки mystem, стоп-слова не удалены lemmatized = mystem.lemmatize(cleaned)

lemmatized with stopw = [lemma for lemma in lemmatized if lemma not in(' \n', ' ')]" print(lemmatized with stopw)

# лемматизация с помощью библиотеки mystem, стоп-слова удалены lemmatized = mystem.lemmatize(cleaned)

lemmatized = [lemma for lemma in lemmatized if lemma not in russian stop-

words and lemma != ' \n' and len(lemma) >= 2]

print(lemmatized)

# лемматизация с помощью библиотеки pymorphy2, стоп-слова не удалены morph = pymorphy2.MorphAnalyzer()

lemmatized 2 with stopw = [morph.parse(tok)[0].normal form for tok in tokens]

print(lemmatized 2 with stopw)

# лемматизация с помощью библиотеки pymorphy2, стоп-слова удалены morph = pymorphy2.MorphAnalyzer()

lemmatized 2 = [morph.parse(tok)[0].normal form for tok in tokens if tok not in russian stopwords and len(tok) >= 2] print(lemmatized 2)

Если сравнить результаты, можно увидеть, что лемматизации библиотек отличается.

Mystem: ['однажды', 'весна', 'час', 'небывалый', 'жаркий', 'закат', 'москва', 'патриарший', 'пруд', 'появляться', 'гражданин', 'первый', 'одевать', 'летний', 'серенький', 'пара', 'маленький', 'рост', 'упитывать', 'лысый' ...]

Pymorphy2: ['однажды' , 'весною', 'час', 'небывалый', 'жаркий', 'закат', 'москва', 'патриарший', 'пруд', 'появиться', 'гражданин', 'первый', 'одетый', 'летний', 'серенький', 'пара', 'маленький', 'рост', 'упитанный', 'лысый' ...]

Так, первая библиотека привела причастия «одетый» и «упитанный» к глаголам «одевать» и «упитывать», вторая же не распознала лемму «весна» в форме «весною». У обеих библиотек «серенький» не приведено к лемме «серый». Тем не менее, при необходимости совместив результаты лемматизации разными библиотеками с полученным списком, можно работать далее.

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

# уникальные леммы, отсортированные в алфавитном порядке, после удаления стоп-слов

unique lemmas = list(set(lemmatized)) sorted unique lemmas = sorted(unique lemmas)

unique lemmas cleaned = [lemma for lemma in sorted unique lemmas if lemma not in russian stopwords and len(lemma) > 2] for i in unique lemmas cleaned: print(i)

Получим:

весна

выбривать

гражданин

жаркий

закат

летний

лицо

лысый

маленький

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

москва

небывалый

нести

одевать

однажды

оправа

очки пара

патриарший

первый

пирожок

помещаться

появляться

приличный

пруд

размер

роговой

рост

рука

сверхъестественный свой

серенький упитывать час

черный шляпа

Теперь перейдем к другому тексту — новости о научных разработках в области лабораторной медицинской диагностики под заголовком «Машинное зрение повысит качество лабораторных исследований». Для экономии места мы не приводим текст новости целиком, он доступен на сайте МИСиС (Машинное зрение... 2022). На его примере посмотрим, как обсуждаемые техники предобработки текста могут помочь дальнейшему выделению из него терминов. Для этого предварительно выполним с ним все описанные выше операции.

Важным как для извлечения терминологии, так и для анализа содержания текстов может быть получение списка всех слов с указанием их частотности (так называемый bag of words, с англ. «мешок слов»). Мы выполним эту операцию для уже лемматизированного текста, очищенного от стоп-слов:

# bag of words

from collections import Counter

bag of words = Counter(sorted(lemmatized 2))

print(bag of words)

Результат выполнения для лемм с частотностью вхождений выше 2:

Counter({'исследование': 10, 'кровь': 6, 'пробирка': 6, 'забор': 5, 'который': 5, 'фракция': 5, 'граница': 4, 'зрение': 4, 'качество': 4, 'машинный': 4, 'алгоритм': 3, 'лабораторный': 3, 'необходимо': 3, 'основа': 3, 'плазма': 3, 'подготовка': 3, 'робот': 3, 'система': 3, 'сыворотка': 3, 'уровень': 3, 'учёный': 3, 'этап': 3, 'аликвота': 2, 'аликвотирова-ние': 2, 'анализ': 2, 'глубина': 2, 'должный': 2, 'изображение': 2, 'количество': 2, 'материал': 2, 'мисис': 2, 'модель': 2, 'нейронный': 2, 'низкий': 2, 'ошибка': 2, 'пипетка': 2, 'предварительный': 2, 'разработать': 2, 'разработка': 2, 'роботизированный': 2, 'сеть': 2, 'управление': 2, 'установить': 2, 'штатив': 2 ...

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

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

# Получение списка токенов с указанием частей речи. morph = pymorphy2.MorphAnalyzer()

for token in tokens: l = []

p = morph.parse(token)[0] l.append(token) l.append(p.tag.POS) print(l)

Начало полученного списка будет выглядеть так:

['машинное', 'ADJF'] ['зрение', 'NOUN'] ['повысит', 'VERB'] ['качество', 'NOUN'] ['лабораторных', 'ADJF'] ['исследований', 'NOUN'] ['ученые', 'NOUN'] ['университета', 'NOUN'] ['мисис', 'NOUN'] ['совместно', 'ADVB'] ['с', 'PREP'] ['коллегами', 'NOUN']

Теперь воспользуемся списком уникальных лемм для данного текста и дополним его указанием части речи для каждой из них, сохранив сортировку в алфавитном порядке (напоминаем о важности сохранения отступов в коде программы):

# Список уникальных лемм с указанием частей речи (без служебных ЧР). morph = pymorphy2.MorphAnalyzer()

all pos list = []

for lemma in sorted unique lemmas: all pos item = [] p = morph.parse(lemma)[0] all pos item.append(lemma) all pos item.append(p.tag.POS) print(*all pos item) all pos list.append(all pos item)

Начало полученного списка:

автоматизированный ADJF автоматически ADVB алгоритм NOUN аликвота NOUN аликвотирование NOUN анализ NOUN архитектура NOUN бгту NOUN биоматериал NOUN вероятность NOUN вести INFN весь ADJF

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

# Получение списка лемм одной части речи, например, имен существительных one pos list = [item[0] for item in all pos list if item[1] == 'NOUN'] for i in one pos list: print(i)

Полный результат для текста новости:

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

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

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

В этом может помочь выделение наиболее частотных n-грамм (последовательностей слов) — в первую очередь биграмм и триграмм. Очевидно, что не все полученные коллока-ции будут терминами (в список могут попасть сочетания служебных слов «такой как», «в то же время» и др.), а значимые термины, наоборот, могут встречаться недостаточно часто и не попасть в выборку. Однако среди автоматически выделенных частотных n-грамм будет присутствовать и некоторая доля дву- и трехсоставных терминов, релевантных для данного

текста. Наша задача сделать так, чтобы «шума» в списки попало как можно меньше, а релевантных коллокаций — больше. Для этого рассмотрим три способа выделения n-грамм.

Сначала проверим, что произойдет при выделении n-грамм из необработанного текста. Вставим в новую ячейку код:

# Получение n-грамм для токенов с указанием частотности import nltk, re

from nltk.tokenize import word tokenize

from nltk.util import ngrams

from collections import Counter

cleaned = re.sub('\W+', ' ', text.lower())

tokenized = word tokenize(cleaned)

bigrams = ngrams(tokenized, 2) bigrams frequency = Counter(bigrams)

trigrams = ngrams(tokenized, 3) trigrams frequency = Counter(trigrams)

bigrams list = bigrams frequency.most common(20)

print('\n-----bigrams-------')

for i in bigrams list: if i[1] > 1: print(f'{i[0][0]} {i[0][1]}: {i[1]}')

trigrams list = trigrams frequency.most common(10)

print('\n-----trigrams-------')

for i in trigrams list: if i[1] > 1:

print(f'{i[0][0]} {i[0][1]} {i[0][2]}: {i[1]}') Получим следующие списки для текста новости:

----- bigrams -------

границ между: 3 между фракциями: 3 на основе: 2 машинного зрения: 2 подготовки материала: 2 в пробирке: 2 один из: 2

предварительной подготовки: 2

при этом: 2

пипетку для: 2

для забора: 2

забора крови: 2

уровня границ: 2

и установить: 2

-----trigrams-------

границ между фракциями: 3 пипетку для забора: 2 уровня границ между: 2

Можно заметить, что в них мало полноценных по смыслу коллокаций, зато много предложных словосочетаний. Кроме того, частотность коллокаций в полученном списке не превышает трех. Очевидно, что употребление словосочетаний в разных грамматических формах без приведения к лемме затрудняет подсчет их частотности, поэтому мы попробуем использовать другой подход и применим операцию поиска n-грамм к лемматизированному

тексту, не удаляя из него «стоп-слова» для сохранения предложных словосочетаний. Выделенные пары слов не будут грамматически согласованы между собой и потребуют дополнительного редактирования, однако такой подход кажется оправданным, особенно при работе с объемными текстами, в которых поиск частотных терминов-словосочетаний «вручную» сильно затруднен. Выполним код:

# Получение n-грамм из лемматизированного текста без удаления стоп-слов

bigrams = sorted(ngrams(lemmatized with stopw, 2)) bigrams frequency = Counter(bigrams)

trigrams = sorted(ngrams(lemmatized with stopw, 3)) trigrams frequency = Counter(trigrams)

bigrams list = bigrams frequency.most common(30)

print('\n-----bigrams-------')

for i in bigrams list: if i[1] > 1:

print(f'{i[0][0]} {i[0][1]}: {i[1]}')

trigrams list = trigrams frequency.most common(10)

print('\n-----trigrams-------')

for i in trigrams list: if i[1] > 1:

print(f'{i[0][0]} {i[0][1]} {i[0][2]}: {i[1]}')

Получим:

----- bigrams -------

машинный зрение: 4

граница между: 3

лабораторный исследование: 3

между фракция: 3

уровень граница: 3

анализ кровь: 2

в пробирка: 2

для забор: 2

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

забор кровь: 2

забор плазма: 2

и устанавливать: 2

качество лабораторный: 2

на основа: 2

нейронный сеть: 2

-----trigrams-------

граница между фракция: 3 уровень граница между: 3 качество лабораторный исследование: 2 пипетка для забор: 2

После обработки лемм видно, что частотность пары «машинный зрение» составляет четыре, а не два: добавилось еще два вхождения, употребленных в другой форме. Несомненно, это словосочетание нужно включить в терминологический мини-словарь по данному тексту. Из полученного списка мы также можем извлечь такие значимые термины, как «анализ крови», «забор крови», «забор плазмы», «нейронная сеть», «граница между фракциями», «пипетка для забора», — они составили бы качественную терминологическую мини-базу при подготовке к возможному переводческому проекту.

Также стоит проверить, какой результат даст выделение n-грамм без стоп-слов, — это полезно для более качественного поиска словосочетаний без предлога. Запустим:

# Получение n-грамм из лемматизированного текста, стоп-слова удалены

bigrams = sorted(ngrams(lemmatized, 2)) bigrams frequency = Counter(bigrams)

trigrams = ngrams(lemmatized, 3) trigrams frequency = Counter(trigrams)

bigrams list = bigrams frequency.most common(20)

print('\n-----bigrams-------')

for i in bigrams list: if i[1] > 1: print(f'{i[0][0]} {i[0][1]}: {i[1]}')

trigrams list = trigrams frequency.most common(10)

print('\n-----trigrams-------')

for i in trigrams list: if i[1] > 1:

print(f'{i[0][0]} {i[0][1]} {i[0][2]}: {i[1]}') Результат:

-----bigrams-------

машинный зрение: 4 граница фракция: 3 лабораторный исследование: 3 уровень граница: 3 анализ кровь: 2 забор кровь: 2 забор плазма: 2 качество лабораторный: 2 нейронный сеть: 2 необходимо погружать: 2 пипетка забор: 2 подготовка материал: 2 предварительный подготовка: 2

----- trigrams -------

уровень граница фракция: 3

качество лабораторный исследование: 2

Вы можете выбрать любой из описанных трех вариантов выделения n-грамм: код в ячейках не зависит один от другого. При недостатке времени и работе с текстами (корпусами большого объема) все три метода, на наш взгляд, могут помочь лексикографу достаточно результативно вычленить ключевые словосочетания и термины.

Выделение наиболее частотных биграмм и триграмм может быть эффективным инструментом не только при поиске терминов, но и при анализе содержания больших текстов. Вот, например, списки, полученные на материале романа М. Булгакова, — по ним можно не только угадать произведение, но и получить некий перечень персонажей, значимых мест и событий («сеанс черной магии», дом «302-бис по Садовой улице», «ненавидимый прокуратором город»).

-----bigrams-------

никанор иванович: 132 иван николаевич: 7 6

маргарита николаевна: 64 аркадий аполлонович: 3 6 понтий пилат: 36 сказать воланд: 31 некоторый время: 2 8 га ноцри: 2 7 левий матвей: 25 черт знать: 25

-----trigrams-------

иешуа га ноцри: 8 никанор иванович босой: 7 дом 302 бис: 7 начальник тайный служба: 6 спрашивать никанор иванович: 6 сеанс черный магия: 5 пятый прокуратор иудея: 5 ненавидеть прокуратор город: 5

Бывает также необходимо найти более длинные словосочетания. Для этого можно выполнить поиск n-грамм с n, отличным от 2 и 3 (потребуется ввести значение n):

# Получение n-грамм с n, задаваемым пользователем user input = int(input('Введите n для n-грамм: ')) n grams = sorted(ngrams(tokenized, user input)) n grams frequency = Counter(n grams)

n grams list = n grams frequency.most common(20)

print('\n-----user-defined n-grams-------')

for i in n grams list: if i[1] > 1: print(f'{i[0]}: {i[1]}')

Например, для полного текста романа «Мастер и Маргарита» список n-грамм с n = 5 будет выглядеть так:

Введите n для n-грамм: 5

-----user-defined n-grams-------

('и', 'в', 'то', 'же', 'время'): 10

('белом', 'плаще', 'с', 'кровавым', 'подбоем'): 4 ('в', 'белом', 'плаще', 'с', 'кровавым'): 4 ('до', 'тех', 'пор', 'пока', 'не'): 4 ('302', 'бис', 'по', 'садовой', 'улице'): 3

Перейдем к простым методам поиска и подсчета отдельных слов, которые могут дать важную количественную информацию о тексте и тем самым помогают сделать вывод о его содержании.

Часто необходимо проверить наличие в корпусе определенного слова (например, в новостных текстах). Удобнее искать сразу начальную форму слова — для этого воспользуемся заранее составленным списком лемм. Вводим в ячейку слово для поиска и выполняем код:

lemma in question = input('Введите слово для поиска: ') if lemma in question in lemmatized with stopw:

print('Лемма найдена') else:

print('Лемма не найдена')

Пример:

Введите слово для поиска: война Лемма не найдена

Интересные данные можно получить при подсчете встречаемости в тексте определенных слов и фраз. Для подсчета точных вхождений выполните код:

# Подсчет встречаемости точного вхождения (например, словосочетания в определенной форме)

word count = input('Введите слово для подсчета: ') print(cleaned.count(word count))

Примеры из полного текста романа М. Булгакова:

Введите текст для подсчета: мастер и маргарита 4

Введите слово для подсчета: прокуратор иудеи 10

Чтобы точнее вычислить встречаемость определенного слова в тексте, как и ранее воспользуемся поиском по начальной форме слова. Код для выполнения:

# Подсчет встречаемости леммы в корпусе

lemma count = input('Введите текст для подсчета: ') print(lemmatized with stopw.count(lemma count))

Примеры:

Введите слово для подсчета: зло 8

Введите слово для подсчета: добро 3

Введите слово для подсчета: злой 10

Введите слово для подсчета: добрый 28

Таким образом можно количественно доказать победу добра над злом на пространстве отдельно взятого текста.

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

Конфликт интересов

Автор заявляет об отсутствии потенциального или явного конфликта интересов.

Conflict of interests

The author declares that there is no conflict of interest, either existing or potential.

Источники

Булгаков, М. А. (1980) Мастер и Маргарита. М.: Художественная литература, 368 с.

Машинное зрение повысит качество лабораторных исследований. (2022) МИСИС. Университет науки и технологий, 9 июня. [Электронный ресурс]. URL.: https://misis.ru/university/news/science/2023-06/8562/ (дата обращения 12.02.2022).

Pymorphy2: Документация. (2022) [Электронный ресурс]. URL: https://pymorphy2.readthedocs.io/en/ stable/user/ (дата обращения 12.02.2022).

Литература

Любанович, Б. (2021) Простой Python. Современный стиль программирования. 2-е изд. СПб.: Питер, 592 с.

Митренина, О. В. (2019) Python для тех, кто никогда не программировал. Journal of Applied Linguistics and Lexicography, т. 1, № 1, с. 127-135. https://doi.org/10.33910/2687-0215-2019-1-1

Sources

Bulgakov, M. A. (1980) Master i Margarita [The Master and Margarita]. Moscow: Khudozhestvennaya literatura Publ., 386 p. (In Russian)

Mashinnoe zrenie povysit kachestvo laboratornykh issledovanij. (2022) MISIS. Universitet nauki i tekhnologij [MISIS. National University of Science and Technology], 9 June. [Online]. Available at: https://misis.ru/ university/news/science/2023-06/8562/ (accessed 12.02.2022). (In Russian)

Pymorphy2: Dokumentatsiya [Pymorphy2: Documentation]. (2022) [Online]. Available at: https://pymorphy2. readthedocs.io/en/stable/user/ (accessed 12.02.2022). (In Russian)

References

Lubanovic, B. (2021) ProstojPython. Sovremennyjstil'programmirovaniya[IntroducingPython: Modern Computing in Simple Packages]. 2nd ed. Saint Petersburg: Piter Publ., 592 p. (In Russian)

Mitrenina, O. V. (2019) Python dlya tekh, kto nikogda ne programmiroval [Python for non-programmers]. Journal of Applied Linguistics and Lexicography, vol. 1, no. 1, pp. 127-135. https://doi.org/10.33910/2687-0215-2019-1-1 (In Russian)

i Надоели баннеры? Вы всегда можете отключить рекламу.