Форум программистов, компьютерный форум, киберфорум
py-thonny
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Обработка естественного языка в Python с помощью spaCy

Запись от py-thonny размещена 16.04.2025 в 12:11
Показов 10161 Комментарии 0

Нажмите на изображение для увеличения
Название: 4a6a59a0-3688-4cc9-b057-340efe2e3f39.jpg
Просмотров: 331
Размер:	164.2 Кб
ID:	10599
Обработка естественного языка (Natural Language Processing, NLP) — одна из самых быстрорастущих областей искусственного интеллекта, которая позволяет компьютерам понимать, интерпретировать и генерировать человеческий язык. В эпоху, когда ежедневно создаются петабайты неструктурированных текстовых данных, умение автоматически извлекать из них смысл становится критическим навыком для любого специалиста по данным. Python, благодаря своей гибкости, читаемости и обширной экосистеме библиотек стал языком первого выбора для задач NLP. Среди множества инструментов выделяется spaCy — современная библиотека, созданная с фокусом на производительность и практическое применение. В отличие от академически ориентированной NLTK, spaCy предлагает более интуитивный API и оптимизированный код на Cython, что делает её незаменимой в промышленных решениях.

Возможности Python в обработке естественного языка: практическое руководство по spaCy



Ключевая особенность spaCy — её декларативный подход к обработке текста. Вместо того чтобы заставлять разработчика вручную выстраивать сложные цепочки преобразований, библиотека предлагает готовые конвейеры обработки. Достаточно загрузить языковую модель и передать ей текст — spaCy автоматически выполнит токенизацию, присвоит части речи, распознает именованные сущности и построит синтаксическое дерево зависимостей.

Python
1
2
3
4
5
6
7
8
9
10
11
12
import spacy
 
nlp = spacy.load("en_core_web_sm")
doc = nlp("Gus Proto разрабатывает на Python и интересуется NLP")
 
# Получаем именованные сущности
for entity in doc.ents:
    print(f"{entity.text}: {entity.label_}")
 
# Анализируем синтаксические зависимости
for token in doc:
    print(f"{token.text} --> {token.dep_}")
При выборе инструмента для NLP задач стоит учитывать конкретные требования проекта. SpaCy лучше подходит, когда:
  • Требуется высокая производительность на больших объемах текста.
  • Нужны готовые предобученные модели с хорошей точностью.
  • Важна интеграция с промышленными системами.
  • Необходима поддержка современных нейросетевых моделей.

С другой стороны, NLTK может быть предпочтительнее для исследовательских проектов и обучения, а Gensim — для анализа тематик и семантического моделирования. Трансформеры от Hugging Face обеспечат максимальную точность за счет вычислительных ресурсов.

SpaCy с 2015 года непрерывно развивается и сейчас поддерживает более 60 языков, включая русский. Версия 3.0, выпущенная в 2021 году, добавила поддержку трансформеров, что позволило библиотеке оставаться конкурентоспособной в эпоху BERT и GPT моделей. Это делает её универсальным инструментом для широкого спектра задач — от простой классификации текстов до сложных систем извлечения информации. В отличие от традиционного статистического подхода к NLP, современные методы, реализованные в spaCy, позволяют улавливать тонкие семантические нюансы языка, что критично для высокоточных систем анализа текстов. При этом библиотека сохраняет интуитивно понятный интерфейс, что сокращает время от идеи до рабочего прототипа.

Архитектура spaCy: от токенизации до нейросетей



Ядро spaCy построено вокруг концепции конвейера обработки — последовательности компонентов, через которые проходит текст. Этот конвейер трансформирует сырые строки в структурированные объекты Doc, богатые лингвистическими атрибутами. Понимание внутреннего устройства библиотеки поможет эффективнее решать практические задачи NLP. Обработка начинается с токенизатора — компонента, разбивающего текст на элементарные единицы (токены). Токенизатор spaCy учитывает не только пробелы, но и сложные правила сегментации, характерные для каждого языка. Например, он корректно обрабатывает сокращения, сложные числа и даже эмодзи.

Python
1
2
3
4
# Токенизация в spaCy
doc = nlp("Цена акции упала на 4.5% в период с 2018-2020гг.")
print([token.text for token in doc])
# ['Цена', 'акции', 'упала', 'на', '4.5', '%', 'в', 'период', 'с', '2018', '-', '2020', 'гг', '.']
После токенизации текст проходит через морфологический анализатор и тэггер частей речи. Эти компоненты определяют грамматические характеристики каждого токена — часть речи, падеж, число и прочие морфологические признаки. spaCy использует статистические модели, обученные на больших корпусах текстов, чтобы с высокой точностью определять эти атрибуты.

Синтаксический парсер — следующий ключевой элемент. Он строит дерево зависимостей, отражающее грамматическую структуру предложения. Каждый токен связывается со своим "головным" словом определенным типом синтаксической связи. Этот компонент критичен для понимания отношений между сущностями в тексте. Система распознавания именованных сущностей (NER) идентифицирует и классифицирует текстовые фрагменты, относящиеся к определенным категориям: имена людей, организации, локации, даты и т.д. В последних версиях spaCy эта задача решается нейросетевыми моделями с предварительным обучением. Архитектурно spaCy реализует векторные представления слов, которые кодируют семантический смысл в многомерном пространстве. Это позволяет вычислять "близость" слов по значению, что критично для многих приложений NLP.

Критически важной особенностью spaCy является интеграция с трансформерами — современными нейросетевыми архитектурами. Начиная с версии 3.0, библиотека позволяет использовать модели, подобные BERT, для повышения точности всех компонентов конвейера без изменения привычного API.

Установка и настройка spaCy



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

Системные требования и совместимость



SpaCy работает на всех основных операционных системах (Windows, macOS, Linux) и требует Python версии 3.6 и выше. Для базовой функциональности достаточно скромных ресурсов, но при использовании крупных нейросетевых моделей рекомендуется иметь не менее 4 ГБ оперативной памяти. Важно отметить, что некоторые компоненты, написанные на Cython, требуют компилятора C/C++ для установки из исходников.

Python
1
2
3
# Проверка версии Python перед установкой
import sys
print(f"Версия Python: {sys.version}")
Библиотека совместима с большинством популярных фреймворков машинного обучения, включая TensorFlow, PyTorch и scikit-learn. Это обеспечивает гибкость в построении комплексных решений, где spaCy может выступать как часть более крупной системы.

Базовая установка через pip



Самый простой способ установки — использование pip, стандартного менеджера пакетов Python. Рекомендуется работать в виртуальном окружении, чтобы избежать конфликтов зависимостей.

Python
1
2
3
4
5
6
7
8
9
# Создание виртуального окружения
python -m venv venv
source venv/bin/activate  # На Windows: venv\Scripts\activate
 
# Установка spaCy
pip install spacy
 
# Проверка установки
python -c "import spacy; print(spacy.__version__)"
Для пользователей Anaconda существует альтернативный способ:

Bash
1
conda install -c conda-forge spacy

Установка через Git для разработчиков



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

Bash
1
2
3
git clone https://github.com/explosion/spaCy
cd spaCy
pip install -e .
Этот метод создаёт редактируемую установку, где изменения в локальном коде немедленно отражаются в работе библиотеки.

Загрузка языковых моделей



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

sm: малые модели (~10-15 МБ), подходят для базового анализа и систем с ограниченными ресурсами.
md: средние модели (~40-50 МБ), обеспечивают баланс между точностью и потреблением ресурсов.
lg: большие модели (~140-150 МБ), максимальная точность для сложных задач.
trf: модели на базе трансформеров (~50 МБ + размер трансформера), наивысшая точность за счет вычислительных ресурсов.

Модели устанавливаются командой:

Bash
1
2
3
4
5
# Установка английской маленькой модели
python -m spacy download en_core_web_sm
 
# Установка русской средней модели
python -m spacy download ru_core_news_md
При работе с русским языком стоит учитывать его морфологическую сложность — для качественного анализа рекомендуется использовать модели не меньше средних.

Python
1
2
3
4
5
6
7
# Проверка установленной модели
import spacy
# Загрузка русской модели
nlp = spacy.load("ru_core_news_md")
doc = nlp("SpaCy обрабатывает русские тексты с учетом морфологии")
for token in doc:
    print(f"{token.text}: {token.pos_} ({token.lemma_})")

Решение типичных проблем установки



На Windows часто возникают проблемы с компиляцией компонентов на Cython. Решение — установка колесных файлов (wheels) вместо сборки из исходников:

Bash
1
pip install --upgrade pip setuptools wheel
На macOS с M1/M2 процессорами могут возникать проблемы совместимости с некоторыми зависимостями. В этом случае рекомендуется использовать miniforge вместо стандартного Anaconda:

Bash
1
2
# Установка с оптимизацией под arm64
ARCHFLAGS="-arch arm64" pip install spacy
При недостатке памяти во время установки крупных моделей можно использовать частичную загрузку:

Python
1
2
3
# Частичная загрузка только нужных компонентов
import spacy
nlp = spacy.load("en_core_web_lg", exclude=["parser", "ner"])

Проверка корректности установки



После завершения установки рекомендуется провести базовую проверку функциональности:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import spacy
 
# Проверка загрузки модели
try:
    nlp = spacy.load("en_core_web_sm")
    test_text = "spaCy correctly processes this sentence."
    doc = nlp(test_text)
    
    # Проверка токенизации
    tokens = [token.text for token in doc]
    assert len(tokens) > 3, "Ошибка токенизации"
    
    # Проверка частей речи
    pos_tags = [token.pos_ for token in doc]
    assert all(tag for tag in pos_tags), "Ошибка определения частей речи"
    
    print("Установка выполнена успешно!")
except Exception as e:
    print(f"Возникла проблема при проверке: {e}")
Такая проверка поможет убедиться, что все компоненты работают корректно. В следующем разделе мы рассмотрим интеграцию spaCy с интерактивными средами разработки и настройку для работы с GPU.

Интеграция spaCy с JupyterLab для интерактивной работы с текстом



Jupyter notebooks значительно упрощают экспериментирование с NLP, позволяя визуализировать промежуточные результаты обработки. SpaCy отлично интегрируется с JupyterLab и предоставляет специальные возможности для интерактивной работы с текстом. Для начала установите Jupyter:

Bash
1
pip install jupyterlab
В Jupyter notebooks можно использовать встроенную визуализацию spaCy через модуль displaCy:

Python
1
2
3
4
5
6
7
8
9
10
11
12
import spacy
from spacy import displacy
 
nlp = spacy.load("ru_core_news_md")
text = "Компания OpenAI разработала модель GPT-4, которая превосходит предыдущие версии."
doc = nlp(text)
 
# Визуализация синтаксического анализа прямо в ячейке Jupyter
displacy.render(doc, style="dep", jupyter=True, options={"distance": 90})
 
# Визуализация именованных сущностей
displacy.render(doc, style="ent", jupyter=True)
При работе в JupyterLab рекомендуется использовать расширение spacy-jupyter, которое добавляет поддержку интерактивных виджетов и улучшает отображение объектов spaCy:

Bash
1
pip install spacy-jupyter
После установки расширения объекты Doc, Token и Span будут автоматически отображаться с подсветкой синтаксиса и интерактивными элементами.

Работа с GPU для ускорения обработки текста



SpaCy поддерживает ускорение на GPU для нейросетевых компонентов, что особенно актуально при обработке больших объемов текста или использовании моделей-трансформеров. Для этого требуется установка дополнительных зависимостей.
Для работы с CUDA (NVIDIA GPU):

Bash
1
2
pip install cupy
pip install thinc[cuda]
Для процессоров Apple M1/M2:

Bash
1
2
pip install tensorflow-macos
pip install spacy[apple]
После установки необходимых зависимостей можно активировать использование GPU в spaCy:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import spacy
 
# Проверка доступности GPU
spacy.prefer_gpu()
print(f"GPU доступен: {spacy.require_gpu()}")
 
# Настройка использования GPU для определенных компонентов
nlp = spacy.load("en_core_web_trf")
nlp.to_disk("model_with_gpu_config")
 
config = {
    "nlp": {"batch_size": 128},
    "components": {
        "transformer": {"model": {"@architectures": "spacy-transformers.TransformerModel.v1"}}
    }
}
 
# Применение конфигурации
nlp.config.update(config)
При обработке больших корпусов текста ускорение может быть значительным:

Python
1
2
3
4
5
6
7
8
import time
 
texts = ["Пример текста для обработки"] * 1000  # 1000 документов
 
start = time.time()
for doc in nlp.pipe(texts, batch_size=50):
    pass
print(f"Время обработки: {time.time() - start:.2f} сек")

Оптимизация потребления памяти



При работе с большими текстовыми коллекциями важно оптимизировать использование памяти. SpaCy предлагает несколько подходов:

1. Выборочное отключение компонентов конвейера:

Python
1
2
# Загрузка только необходимых компонентов
nlp = spacy.load("en_core_web_lg", disable=["ner", "textcat"])
2. Использование итераторов вместо загрузки всех документов в память:

Python
1
2
3
4
5
# Потоковая обработка из файла
with open("large_text_corpus.txt", "r", encoding="utf-8") as f:
    for line in f:
        doc = nlp(line.strip())
        # Обработка по одному документу
3. Настройка дизассемблирования неиспользуемых объектов для экономии памяти:

Python
1
2
3
4
5
6
7
8
9
# Отключение сохранения данных токенизации
nlp.max_length = 2000000  # Увеличение максимальной длины документа
docs = list(nlp.pipe(texts, disable=["parser", "ner"]))
 
# Сохранение только необходимых атрибутов
from spacy.tokens import DocBin
doc_bin = DocBin(attrs=["LEMMA", "POS"], store_user_data=False)
for doc in docs:
    doc_bin.add(doc)
При развертывании в промышленной среде иногда требуется избегать даже кратковременных пиков потребления памяти. В таких случаях поможет инкрементальная обработка:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Обработка в режиме потоковой передачи с контролем памяти
from tqdm import tqdm
 
results = []
for batch in tqdm(spacy.util.minibatch(texts, size=100)):
    docs = list(nlp.pipe(batch))
    # Извлечение только нужной информации, без сохранения полных Doc-объектов
    batch_results = [{
        "text": doc.text[:50],
        "entities": [(ent.text, ent.label_) for ent in doc.ents]
    } for doc in docs]
    results.extend(batch_results)
    # Явное освобождение памяти
    del docs, batch_results
Такая тщательная настройка позволяет обрабатывать гигабайты текста даже на машинах с ограниченными ресурсами, что критично для многих промышленных сценариев применения NLP.

Несколько ошибок в runpy.py при использовании spacy
Возникла проблема, нашел в интернете идентичную: https://github.com/explosion/spaCy/issues/4733...

Использование библиотек spacy и textacy
Всем привет, изучаем в институте NLP. Наткнулся на код в интернете, где берется текст из Википедии...

считать текст и сделать лемматизацию с spacy
считать текст и сделать лемматизацию с помощью spacy

Обработка естественного языка на Python. Задача на программирование
Здравствуйте! Помогите переписать этот код или же написать полностью новый. Так как моё чудо не...


Базовые возможности spaCy



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

Токенизация текста



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

Python
1
2
3
4
5
6
7
8
import spacy
 
nlp = spacy.load("ru_core_news_sm")
text = "SpaCy обрабатывает текст, включая числа (123) и спец-символы!"
doc = nlp(text)
 
for token in doc:
    print(f"{token.i}\t{token.text}")
Вывод:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
0   SpaCy
1   обрабатывает
2   текст
3   ,
4   включая
5   числа
6   (
7   123
8   )
9   и
10  спец
11  -
12  символы
13  !
Обратите внимание, как корректно обрабатываются пунктуация, скобки и дефисы. Каждый токен получает уникальный индекс (.i), который можо использовать для навигации по документу. Токенизатор учитывает особенности каждого языка. Например, в английском "don't" разбивается на "do" и "n't", а в русском корректно обрабатываются составные числа и инициалы.

Части речи и зависимости



После токенизации spaCy автоматически назначает каждому токену часть речи (POS-tag) и определяет синтаксические зависимости между словами. Это позволяет понять структуру предложения и роль каждого слова.

Python
1
2
3
4
5
text = "Машинное обучение трансформирует бизнес-процессы компаний."
doc = nlp(text)
 
for token in doc:
    print(f"{token.text:{15}} | {token.pos_:{10}} | {token.dep_:{10}} | {token.head.text}")
Результат:
Python
1
2
3
4
5
6
7
8
Машинное        | ADJ        | amod       | обучение
обучение        | NOUN       | nsubj      | трансформирует
трансформирует  | VERB       | ROOT       | трансформирует
бизнес          | NOUN       | compound   | процессы
              | PUNCT      | punct      | бизнес
процессы        | NOUN       | obj        | трансформирует
компаний        | NOUN       | nmod       | процессы
.               | PUNCT      | punct      | трансформирует
Здесь .pos_ указывает на часть речи в формате универсальных тегов (NOUN для существительных, VERB для глаголов и т.д.), .dep_ — тип синтаксической зависимости, а .head — родительский токен в дереве зависимостей. Особенно ценны атрибуты .is_stop (для определения стопслов) и .like_num (для идентификации числовых выражений):

Python
1
2
print([token.text for token in doc if not token.is_stop])  # Токены без стоп-слов
print([token.text for token in doc if token.like_num])     # Числовые токены

Распознавание именованных сущностей



Система распознавания именованных сущностей (NER) — один из самых полезных инструментов spaCy. Она выделяет в тексте имена людей, организаций, географические объекты, даты и другие категории.

Python
1
2
3
4
5
text = "Microsoft объявила о приобретении GitHub в июне 2018 года за 7.5 миллиардов долларов."
doc = nlp(text)
 
for ent in doc.ents:
    print(f"{ent.text} ({ent.start_char}:{ent.end_char}) — {ent.label_} — {spacy.explain(ent.label_)}")
Вывод:
Python
1
2
3
4
Microsoft (0:9) — ORG — Компании, агентства, учреждения
GitHub (34:40) — ORG — Компании, агентства, учреждения
в июне 2018 года (41:57) — DATE — Абсолютные или относительные даты
7.5 миллиардов долларов (61:84) — MONEY — Денежные значения, включая валюту
Атрибут .ents документа содержит последовательность объектов Span, которые представляют обнаруженные сущности. Для каждой сущности доступны начальная и конечная позиции в тексте, категория и пояснение к этой категории. Модели spaCy для русского языка обучены распознавать следующие типы сущностей: PER (персоны), LOC (локации), ORG (организации), DATE (даты), MONEY (денежные суммы), GPE (геополитические образования), PERCENT (проценты) и другие.

Лемматизация и анализ морфологии



Лемматизация — приведение слова к его начальной форме (лемме). В отличие от стемминга, лемматизация учитывает морфологические особенности языка и контекст. SpaCy включает продвинутые лемматизаторы для каждого поддерживаемого языка.

Python
1
2
3
4
5
text = "программисты создали алгоритмы, использующие сложные математические модели"
doc = nlp(text)
 
for token in doc:
    print(f"{token.text:{15}} -> {token.lemma_:{15}} | {token.tag_}")
Результат:
Python
1
2
3
4
программисты    -> программист     | NOUN__Animacy=Anim|Case=Nom|Number=Plur
создали         -> создать         | VERB__Aspect=Perf|Gender=Plur|Mood=Ind|Tense=Past|VerbForm=Fin
алгоритмы       -> алгоритм        | NOUN__Animacy=Inan|Case=Acc|Number=Plur
...
Атрибут .lemma_ хранит лемму токена, а .tag_ содержит подробный морфологический тег, включающий такие характеристики как падеж, число, род, время и другие грамматические признаки.
Особенно полезна лемматизация при поиске по тексту, составлении частотных словарей и анализе тональности, поскольку она позволяет объединить различные словоформы.

Python
1
2
3
4
# Подсчет частотности лемм
from collections import Counter
lemma_freq = Counter([token.lemma_ for token in doc if not token.is_stop and token.is_alpha])
print(lemma_freq.most_common(5))

Анализ предложений



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

Python
1
2
3
4
5
6
7
text = "Искусственный интеллект развивается быстрыми темпами. Многие компании внедряют его решения."
doc = nlp(text)
 
for sent in doc.sents:
    print(f"Предложение: {sent.text}")
    print(f"Корень: {sent.root.text}")
    print(f"Подлежащее: {[w for w in sent if w.dep_ == 'nsubj'][0].text if [w for w in sent if w.dep_ == 'nsubj'] else 'не найдено'}")
Атрибут .sents предоставляет итератор по объектам Span, представляющим отдельные предложения. Каждое предложение имеет корневой элемент (.root), обычно это главный глагол.

Визуализация с помощью displaCy



Модуль displaCy позволяет наглядно представить результаты анализа текста в виде интерактивных диаграмм. Это особенно полезно при отладке и презентации результатов.

Python
1
2
3
4
5
6
7
8
9
10
from spacy import displacy
 
text = "Нейронные сети анализируют большие объемы данных."
doc = nlp(text)
 
# Визуализация синтаксического дерева
displacy.serve(doc, style="dep")
 
# Визуализация именованных сущностей
displacy.serve(doc, style="ent")
При вызове displacy.serve() запускается локальный сервер, на котором отображается визуализация. Альтернативно, можно использовать displacy.render() для вывода HTML или SVG напрямую.

Python
1
2
3
html = displacy.render(doc, style="dep", page=True)
with open("dependency_tree.html", "w", encoding="utf-8") as f:
    f.write(html)
Для сохранения визуализации в виде изображения можно использовать дополнительные инструменты, например, преобразовать SVG в PNG с помощью библиотеки cairosvg:

Python
1
2
svg = displacy.render(doc, style="dep")
# Конвертация SVG в PNG с помощью cairosvg или другой библиотеки

Работа с русскоязычными текстами



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

Python
1
2
3
4
5
6
7
# Сравнение падежей в русском тексте
text = "Программа обрабатывает текст программы с помощью программы"
doc = nlp(text)
 
for token in doc:
    if token.lemma_ == "программа":
        print(f"{token.text} - {token.morph.get('Case')}")
Для точной обработки русскоязычных текстов рекомендуется использовать модели ru_core_news_md или ru_core_news_lg вместо маленькой модели, так как они содержат более обширные словари и лучше справляются с морфологической неоднозначностью. Отдельного внимания заслуживает работа со стоп-словами в spaCy. Стоп-слова — это частотные слова, которые обычно не несут смысловой нагрузки (предлоги, союзы, местоимения). Их удаление часто является первым шагом при анализе текста:

Python
1
2
3
4
5
6
7
8
9
# Просмотр стоп-слов для русского языка
from spacy.lang.ru.stop_words import STOP_WORDS
print(f"Количество стоп-слов в русском: {len(STOP_WORDS)}")
print(list(STOP_WORDS)[:10])  # Первые 10 стоп-слов
 
# Фильтрация стоп-слов при обработке
text = "Процесс обработки текста требует особого внимания к деталям"
filtered_tokens = [token.text for token in nlp(text) if not token.is_stop]
print(filtered_tokens)
Для сложных видов анализа может потребоваться игнорирование пунктуации и цифр:

Python
1
2
3
4
5
# Комплексная фильтрация токенов
meaningful_tokens = [
    token for token in doc
    if not token.is_stop and not token.is_punct and token.is_alpha
]

Извлечение словосочетаний и фраз



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

Python
1
2
3
4
5
6
7
8
9
10
11
12
# Извлечение субъектно-предикатных пар
text = "Компания разрабатывает новые алгоритмы. Инженеры тестируют систему."
doc = nlp(text)
 
subject_verb_pairs = []
for token in doc:
    if token.dep_ == "nsubj" and token.head.pos_ == "VERB":
        subject = token.text
        verb = token.head.text
        subject_verb_pairs.append((subject, verb))
 
print(subject_verb_pairs)  # [('Компания', 'разрабатывает'), ('Инженеры', 'тестируют')]
Для извлечения существительных с прилагательными:

Python
1
2
3
4
5
6
7
8
9
# Извлечение прилагательное + существительное
adj_noun_pairs = []
for token in doc:
    if token.pos_ == "NOUN":
        for child in token.children:
            if child.pos_ == "ADJ":
                adj_noun_pairs.append((child.text, token.text))
 
print(adj_noun_pairs)  # [('новые', 'алгоритмы')]

Сравнение текстов и векторные представления



spaCy предоставляет векторные представления для слов и документов, что позволяет вычислять семантическую близость:

Python
1
2
3
4
5
6
7
8
# Сравнение документов
doc1 = nlp("Машинное обучение преобразует бизнес")
doc2 = nlp("Искусственный интеллект меняет компании")
doc3 = nlp("Акции выросли на десять процентов")
 
# Косинусное сходство (от 0 до 1, где 1 = идентичные по смыслу тексты)
print(doc1.similarity(doc2))  # ~0.8 (высокое сходство)
print(doc1.similarity(doc3))  # ~0.3 (низкое сходство)
Векторные представления доступны не только для документов, но и для отдельных токенов:

Python
1
2
3
# Сравнение слов
print(nlp("кошка").similarity(nlp("собака")))  # ~0.7
print(nlp("кошка").similarity(nlp("автомобиль")))  # ~0.2

Объединение и разделение контента



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

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Работа со Span-объектами
text = "Конференция по искусственному интеллекту пройдет в Москве"
doc = nlp(text)
 
# Создание произвольного спана
ai_span = doc[3:5]  # "искусственному интеллекту"
print(f"Спан: {ai_span.text}, корень: {ai_span.root.text}")
 
# Слияние токенов с помощью retokenizer
with doc.retokenize() as retokenizer:
    retokenizer.merge(doc[3:5])  # Объединить "искусственному интеллекту" в один токен
 
# После ретокенизации
for token in doc:
    print(token.text)
Также можно извлекать определенные синтаксические структуры:

Python
1
2
3
4
5
6
7
8
9
10
11
# Извлечение глагольных фраз
verb_phrases = []
for token in doc:
    if token.pos_ == "VERB":
        phrase = [token.text]
        for child in token.children:
            if child.dep_ in ("dobj", "advmod", "prep"):
                phrase.append(child.text)
        verb_phrases.append(" ".join(phrase))
 
print(verb_phrases)
Эти базовые возможности spaCy формируют фундамент для более сложных техник обработки естественного языка, которые мы рассмотрим далее.

Кастомные правила для матчеров шаблонов в spaCy



SpaCy предлагает гибкую систему матчеров шаблонов, которая значительно превосходит возможности обычных регулярных выражений. В отличие от традиционного поиска по строкам, матчеры spaCy работают с лингвистическими структурами, позволяя создавать сложные правила на основе морфологических, синтаксических и семантических характеристик текста.
Ядром системы матчинга в spaCy выступают три класса: Matcher, PhraseMatcher и DependencyMatcher. Каждый из них решает специфические задачи поиска в тексте.

Python
1
2
3
4
5
from spacy.matcher import Matcher, PhraseMatcher, DependencyMatcher
 
nlp = spacy.load("ru_core_news_md")
# Создание экземпляра матчера
matcher = Matcher(nlp.vocab)
Базовый Matcher позволяет определять шаблоны в виде списка словарей, где каждый словарь описывает один токен. Ключи в этих словарях соответствуют атрибутам токенов:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
# Шаблон для поиска словосочетаний "прилагательное + существительное"
pattern = [
    {"POS": "ADJ"},  # Прилагательное
    {"POS": "NOUN"}  # Существительное
]
 
matcher.add("ADJ_NOUN_PATTERN", [pattern])
doc = nlp("Современные технологии меняют глобальную экономику")
matches = matcher(doc)
 
for match_id, start, end in matches:
    span = doc[start:end]
    print(span.text)  # "Современные технологии", "глобальную экономику"
Возможности кастомизации шаблонов впечатляют. Можно использовать операторы для создания более гибких паттернов:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
# Шаблон с квантификаторами
pattern_with_quantifiers = [
    {"POS": "ADJ", "OP": "*"},  # 0 или более прилагательных
    {"POS": "NOUN"},            # Существительное
    {"LEMMA": "и", "OP": "?"},  # Опциональный союз "и"
    {"POS": "NOUN", "OP": "?"}  # Опциональное существительное
]
 
# Доступные операторы:
# "!" - отрицание (не этот токен)
# "?" - опциональный (0 или 1)
# "+" - 1 или более
# "*" - 0 или более
PhraseMatcher оптимизирован для поиска конкретных фраз и терминов. Это особенно полезно при работе со словарями терминов:

Python
1
2
3
4
5
6
7
8
9
10
11
phrase_matcher = PhraseMatcher(nlp.vocab)
terms = ["искусственный интеллект", "машинное обучение", "нейронные сети"]
patterns = [nlp(term) for term in terms]
phrase_matcher.add("AI_TERMS", patterns)
 
text = "Современное машинное обучение использует глубокие нейронные сети."
doc = nlp(text)
matches = phrase_matcher(doc)
 
for match_id, start, end in matches:
    print(f"Найден термин: {doc[start:end]}")
Для поиска более сложных структур, основанных на синтаксических зависимостях, можно использовать DependencyMatcher:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
dep_matcher = DependencyMatcher(nlp.vocab)
pattern = [
    # Корневой токен-глагол
    {
        "RIGHT_ID": "verb",
        "RIGHT_ATTRS": {"POS": "VERB"}
    },
    # Прямое дополнение к глаголу
    {
        "LEFT_ID": "verb",
        "REL_OP": ">",
        "RIGHT_ID": "object",
        "RIGHT_ATTRS": {"DEP": "obj"}
    }
]
 
dep_matcher.add("VERB_OBJECT", [pattern])
При создании кастомных правил полезно комбинировать лексические, морфологические и синтаксические ограничения:

Python
1
2
3
4
5
6
complex_pattern = [
    {"LEMMA": {"IN": ["разрабатывать", "создавать", "внедрять"]}},
    {"POS": "DET", "OP": "?"},
    {"POS": "ADJ", "OP": "*"},
    {"LOWER": {"NOT_IN": ["проблему", "трудность"]}, "POS": "NOUN"}
]
Для специфических задач можно регистрировать функции обратного вызова, которые будут вызываться при обнаружении совпадений:

Python
1
2
3
4
5
6
def on_match(matcher, doc, i, matches):
    match_id, start, end = matches[i]
    span = doc[start:end]
    print(f"Обнаружен паттерн: {span.text}")
 
matcher.add("CUSTOM_PATTERN", [pattern], on_match=on_match)
Подобная гибкость матчеров делает spaCy незаменимым инструментом для извлечения структурированной информации из текста, создания специализированных аннотаторов и построения основы для систем обработки естественного языка.

Продвинутые техники



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

Векторное представление слов



Одним из ключевых преимуществ spaCy является встроенная поддержка векторных представлений слов (word embeddings). Это математические модели, преобразующие слова в многомерные векторы таким образом, что семантически близкие слова оказываются рядом в векторном пространстве.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
nlp = spacy.load("ru_core_news_md")  # Убедитесь, что используете модель с векторами
 
# Получение вектора слова
word1 = nlp("компьютер")
word2 = nlp("ноутбук")
word3 = nlp("дерево")
 
# Сравнение векторов
print(f"Сходство компьютер-ноутбук: {word1.similarity(word2):.4f}")  # ~0.8
print(f"Сходство компьютер-дерево: {word1.similarity(word3):.4f}")   # ~0.3
 
# Доступ к сырым векторам
vector = word1.vector  # numpy-массив размерности 300
print(f"Размерность вектора: {vector.shape}")
Векторные представления особенно полезны для поиска похожих документов, классификации текстов и устранения неоднозначности значений слов. В моделях spaCy векторы рассчитываются с использованием GloVe, Word2Vec или пользовательских алгоритмов. Особый интерес представляют контекстные векторные представления на основе трансформеров:

Python
1
2
3
4
5
6
7
# Использование модели на базе трансформеров
nlp = spacy.load("ru_core_news_trf")
doc = nlp("Банк принял новые меры безопасности")
 
# Векторы с учетом контекста (слово "банк" имеет вектор с учетом окружения)
for token in doc:
    print(f"{token.text}: {token.vector_norm:.2f}")

Сравнение документов и семантический анализ



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

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
docs = [
    nlp("Искусственный интеллект меняет способы ведения бизнеса"),
    nlp("Компании внедряют ИИ для автоматизации процессов"),
    nlp("Цены на нефть упали на мировых рынках")
]
 
# Матрица сходства документов
import numpy as np
similarity_matrix = np.zeros((len(docs), len(docs)))
for i, doc1 in enumerate(docs):
    for j, doc2 in enumerate(docs):
        similarity_matrix[i, j] = doc1.similarity(doc2)
 
print(similarity_matrix)
Для более продвинутого семантического анализа можно использовать тематическое моделирование. Хотя spaCy не предоставляет встроенных инструментов для этого, она отлично интегрируется с библиотеками вроде Gensim:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import gensim
from gensim import corpora
 
# Подготовка данных с помощью spaCy
processed_texts = []
for text in raw_texts:
    doc = nlp(text)
    tokens = [token.lemma_ for token in doc if not token.is_stop and token.is_alpha]
    processed_texts.append(tokens)
 
# Создание тематической модели
dictionary = corpora.Dictionary(processed_texts)
corpus = [dictionary.doc2bow(text) for text in processed_texts]
lda_model = gensim.models.LdaModel(corpus, num_topics=5, id2word=dictionary)

Настройка и обучение моделей на собственных данных



Одно из ключевых преимуществ spaCy 3.0 — упрощенная система обучения моделей. Теперь весь процесс описывается через конфигурационные файлы в формате YAML:

Python
1
2
3
4
5
6
7
8
9
# config.cfg - основной конфигурационный файл
# train.spacy - обучающий набор данных
[H2]dev.spacy - валидационный набор данных[/H2]
 
# Генерация базовой конфигурации
python -m spacy init config config.cfg --lang ru --pipeline ner,textcat
 
# Обучение модели
python -m spacy train config.cfg --output ./model --paths.train train.spacy --paths.dev dev.spacy
Для подготовки данных можно использовать встроенные конвертеры:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Конвертация размеченных данных в формат spaCy
python -m spacy convert annotations.json ./ --converter json
 
# Создание небольшого набора для тестирования концепции
import spacy
from spacy.tokens import DocBin
 
nlp = spacy.blank("ru")
db = DocBin()
 
# Создание размеченных примеров
for text, annotations in training_data:
    doc = nlp(text)
    for start, end, label in annotations:
        span = doc.char_span(start, end, label=label)
        if span:
            doc.ents = [span]
    db.add(doc)
 
db.to_disk("train.spacy")

Оптимизация производительности при обработке больших корпусов



При работе с большими объемами текста обычный последовательный подход может быть неэффективным. SpaCy предлагает несколько стратегий оптимизации:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Пакетная обработка документов
texts = ["Пример текста 1", "Пример текста 2", "Пример текста 3"] * 1000
docs = list(nlp.pipe(texts, batch_size=50))
 
# Отключение ненужных компонентов конвейера
docs = list(nlp.pipe(texts, disable=["ner", "textcat"]))
 
# Параллельная обработка с использованием multiprocessing
from joblib import Parallel, delayed
 
def process_text(text):
    doc = nlp(text)
    return [ent.text for ent in doc.ents]
 
results = Parallel(n_jobs=-1)(delayed(process_text)(text) for text in texts)
Для действительно больших корпусов полезно использовать потоковую обработку и сериализацию:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Потоковая обработка из файла
from tqdm import tqdm
 
with open("huge_corpus.txt", "r", encoding="utf-8") as f:
    for i, line in enumerate(tqdm(f)):
        if i % 1000 == 0:
            # Сохранение промежуточных результатов
            with open(f"results_{i//1000}.json", "w") as out:
                json.dump(batch_results, out)
            batch_results = []
        
        doc = nlp(line.strip())
        # Извлечение только необходимой информации
        batch_results.append({
            "entities": [(ent.text, ent.label_) for ent in doc.ents]
        })

Пользовательские компоненты конвейера



SpaCy позволяет создавать собственные компоненты конвейера для решения специфических задач. Компонент должен реализовать методы __init__, __call__ и опционально from_disk/to_disk:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@spacy.Language.factory("sentiment_analyzer")
class SentimentAnalyzer:
    def __init__(self, nlp, name):
        self.nlp = nlp
        self.name = name
        # Загрузка модели или словаря для анализа тональности
        self.lexicon = {"отлично": 1.0, "ужасно": -1.0, "неплохо": 0.5}
    
    def __call__(self, doc):
        # Вычисление тональности документа
        doc._.sentiment = sum(self.lexicon.get(token.lower_, 0) for token in doc) / len(doc)
        return doc
 
# Регистрация атрибута
spacy.tokens.Doc.set_extension("sentiment", default=None)
 
# Добавление компонента в конвейер
nlp.add_pipe("sentiment_analyzer")
 
# Использование
doc = nlp("Это отличный продукт, хотя доставка была неудобной")
print(f"Тональность: {doc._.sentiment}")
Пользовательские компоненты могут быть как статистическими (использующими ML-модели), так и основанными на правилах. Они легко интегрируются в стандартный конвейер обработки.

Техники улучшения точности распознавания на малых выборках



Одна из распространенных проблем в NLP — нехватка размеченных данных. SpaCy предлагает несколько подходов к решению этой проблемы:

1. Transfer Learning — использование предобученных моделей с доучиванием на ваших данных:

Python
1
2
3
4
5
6
7
8
9
10
11
12
# Загрузка базовой модели
base_nlp = spacy.load("ru_core_news_md")
 
# Создание пустой модели с переносом векторных представлений
nlp = spacy.blank("ru")
nlp.vocab.vectors = base_nlp.vocab.vectors
 
# Настройка конвейера с добавлением только нужных компонентов
pipe_config = {
    "token_vector": {"@architectures": "spacy.StaticVectors.v1", "width": 300},
    "update_vectors": False
}
2. Использование правил и гибридных подходов:

Python
1
2
3
4
5
6
7
# Комбинация статистического NER с правилами
ruler = nlp.add_pipe("entity_ruler", before="ner")
patterns = [
    {"label": "ORG", "pattern": "ООО Рога и Копыта"},
    {"label": "PRODUCT", "pattern": [{"LOWER": "iphone"}, {"IS_DIGIT": True}]}
]
ruler.add_patterns(patterns)
3. Активное обучение — интерактивное размечивание наиболее информативных примеров:

Python
1
2
3
4
5
6
7
8
9
10
11
from sklearn.ensemble import RandomForestClassifier
import numpy as np
 
# Обучение базового классификатора
clf = RandomForestClassifier()
clf.fit(X_labeled, y_labeled)
 
# Выбор примеров с наименьшей уверенностью для ручной разметки
proba = clf.predict_proba(X_unlabeled)
uncertainty = 1 - np.max(proba, axis=1)
idx_to_annotate = np.argsort(uncertainty)[-10:]  # 10 самых неопределенных примеров

Инкрементальный парсинг для обработки потоковых данных



Для приложений, работающих с непрерывными потоками текста (например, анализ соцсетей в реальном времени), spaCy предлагает инкрементальный парсер:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from spacy.pipeline import EntityRecognizer
import random
 
# Создание инкрементального парсера
vocab = spacy.create_vocab(vectors_name="en_core_web_md")
nlp = spacy.blank("ru", vocab=vocab)
ner = EntityRecognizer(nlp.vocab)
 
# Инкрементальное обучение
for batch in batches:
    random.shuffle(batch)
    for text, annotations in batch:
        doc = nlp(text)
        # Разметка сущностей
        for start, end, label in annotations:
            doc.ents = [(start, end, label)]
        ner.update([doc], drop=0.5)
Такой подход позволяет постепенно адаптировать модель к новым данным без переобучения с нуля.

Многоязычная обработка текста



SpaCy поддерживает более 60 языков, но качество моделей для разных языков может различаться. Для создания многоязычных приложений существует несколько стратегий:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Динамическая загрузка моделей по определенному языку
def process_multilingual(text, lang):
    if lang not in LOADED_MODELS:
        try:
            LOADED_MODELS[lang] = spacy.load(f"{lang}_core_news_md")
        except OSError:
            # Запасной вариант для неподдерживаемых языков
            LOADED_MODELS[lang] = spacy.blank(lang)
    
    return LOADED_MODELS[lang](text)
 
# Использование
result_en = process_multilingual("This is an English text", "en")
result_ru = process_multilingual("Это русский текст", "ru")
Для универсальной обработки разных языков можно использовать многоязычные трансформеры:

Python
1
2
3
4
5
6
7
8
9
10
# Установка и загрузка многоязычного трансформера
# pip install spacy-transformers
nlp = spacy.load("xx_ent_wiki_sm")  # Модель для множества языков
 
# Обработка текстов на разных языках
docs = list(nlp.pipe([
    "This is an English document.",
    "Dies ist ein deutsches Dokument.",
    "Это документ на русском языке."
]))
В последующем разделе мы рассмотрим практические примеры применения этих продвинутых техник для решения конкретных задач обработки естественного языка.

Интеграция трансформеров в рабочий процесс spaCy заслуживает отдельного внимания. Начиная с версии 3.0, библиотека предлагает полноценную поддержку моделей BERT, RoBERTa и других архитектур, позволяя использовать их мощь без необходимости менять знакомый API:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Установка необходимых компонентов
[H2]pip install spacy-transformers[/H2]
 
# Загрузка модели на основе трансформера
nlp = spacy.load("ru_core_news_trf")
 
# Или создание собственной конфигурации
config = {
    "nlp": {
        "lang": "ru",
        "pipeline": ["transformer", "tagger", "parser", "ner"]
    },
    "components": {
        "transformer": {
            "factory": "transformer",
            "model": {"@architectures": "spacy-transformers.TransformerModel.v3", 
                      "name": "DeepPavlov/rubert-base-cased"}
        }
    }
}
При работе с трансформерами важно учитывать особенности токенизации. В отличие от стандартного подхода spaCy, трансформеры используют собственные токенизаторы, которые могут разбивать слова на субтокены:

Python
1
2
3
4
5
# Получение субтокенов из трансформера
doc = nlp("Трансформеры обеспечивают глубокое понимание контекста")
# Доступ к информации о токенизации трансформера
for token in doc:
    print(f"{token.text}: {token._.trf_alignment}")
Для более глубокого анализа текстов полезна техника кластеризации документов на основе их векторных представлений:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from sklearn.cluster import KMeans
import numpy as np
 
# Подготовка корпуса документов
docs = list(nlp.pipe(text_corpus))
# Извлечение векторов документов
doc_vectors = np.array([doc.vector for doc in docs])
 
# Применение кластеризации
kmeans = KMeans(n_clusters=5)
clusters = kmeans.fit_predict(doc_vectors)
 
# Анализ кластеров
for i in range(5):
    cluster_docs = [docs[j] for j in range(len(docs)) if clusters[j] == i]
    most_central = min(cluster_docs, key=lambda d: 
                     np.linalg.norm(d.vector - kmeans.cluster_centers_[i]))
    print(f"Кластер {i}, центральный документ: {most_central.text[:100]}...")
Продвинутая визуализация может быть реализована с помощью интеграции spaCy с библиотеками визуальной аналитики:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import networkx as nx
import matplotlib.pyplot as plt
from spacy import displacy
 
# Создание графа сущностей
def build_entity_graph(docs):
    G = nx.Graph()
    for doc in docs:
        for ent in doc.ents:
            if ent.label_ in ["PERSON", "ORG", "GPE"]:
                G.add_node(ent.text, type=ent.label_)
                
        # Связь между сущностями, встречающимися в одном документе
        entities = [ent for ent in doc.ents if ent.label_ in ["PERSON", "ORG", "GPE"]]
        for i, ent1 in enumerate(entities):
            for ent2 in entities[i+1:]:
                if G.has_edge(ent1.text, ent2.text):
                    G[ent1.text][ent2.text]['weight'] += 1
                else:
                    G.add_edge(ent1.text, ent2.text, weight=1)
    return G
 
# Визуализация графа с помощью matplotlib и networkx
G = build_entity_graph(docs)
plt.figure(figsize=(12, 12))
pos = nx.spring_layout(G)
nx.draw_networkx(G, pos, with_labels=True, node_size=500)
plt.show()
Ещё одна мощная техника — использование spaCy для построения выборок на основе лингвистических характеристик текста:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Создание корпуса текстов определенного типа
def build_specialized_corpus(texts, criteria):
    nlp = spacy.load("ru_core_news_md")
    selected_texts = []
    
    for text in texts:
        doc = nlp(text)
        # Пример критерия: текст с высокой долей технических терминов
        tech_terms = sum(1 for token in doc if token.is_alpha and 
                        token.lemma_ in tech_vocabulary)
        tech_ratio = tech_terms / len([t for t in doc if t.is_alpha])
        
        if tech_ratio > criteria["min_tech_ratio"]:
            selected_texts.append(text)
    
    return selected_texts
Для задач переноса знаний между языками полезна техника кросс-лингвистического сопоставления:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def align_multilingual_entities(text_ru, text_en):
    nlp_ru = spacy.load("ru_core_news_md")
    nlp_en = spacy.load("en_core_web_md")
    
    doc_ru = nlp_ru(text_ru)
    doc_en = nlp_en(text_en)
    
    # Извлечение сущностей из обоих документов
    ents_ru = {ent.text: ent.label_ for ent in doc_ru.ents}
    ents_en = {ent.text: ent.label_ for ent in doc_en.ents}
    
    # Сопоставление сущностей (например, по словарю или нейросети)
    # В реальном сценарии здесь был бы более сложный алгоритм сопоставления
    alignment = {}
    for ru_ent, ru_label in ents_ru.items():
        for en_ent, en_label in ents_en.items():
            if ru_label == en_label and translator.translate(ru_ent, "en") == en_ent:
                alignment[ru_ent] = en_ent
    
    return alignment
Построение собственных компонентов для конвейера обработки может быть расширено с использованием внешних моделей классификации:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@spacy.Language.factory("topic_classifier")
class TopicClassifier:
    def __init__(self, nlp, name):
        self.name = name
        # Загрузка предобученного классификатора
        import joblib
        self.model = joblib.load("topic_classifier.pkl")
        
    def __call__(self, doc):
        # Подготовка признаков
        features = [token.lemma_ for token in doc if not token.is_stop and token.is_alpha]
        # Предсказание темы
        doc._.topic = self.model.predict([' '.join(features)])[0]
        return doc
 
# Регистрация пользовательского атрибута
spacy.tokens.Doc.set_extension("topic", default=None)
Для задач, требующих высокой степени персонализации, можно комбинировать статистические модели с адаптивными правилами:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Адаптивный компонент для персонализированной обработки текста
class AdaptiveProcessor:
    def __init__(self, base_model, user_preferences):
        self.nlp = spacy.load(base_model)
        self.user_prefs = user_preferences
        
        # Добавление персонализированного компонента
        @spacy.Language.component("personalize")
        def personalize(doc):
            # Пример: подстройка важности сущностей на основе интересов пользователя
            for ent in doc.ents:
                if ent.label_ in self.user_prefs["interests"]:
                    ent._.importance = 1.5
                else:
                    ent._.importance = 1.0
            return doc
        
        # Регистрация атрибута и компонента
        if not spacy.tokens.Span.has_extension("importance"):
            spacy.tokens.Span.set_extension("importance", default=1.0)
        self.nlp.add_pipe("personalize", last=True)
    
    def process(self, text):
        return self.nlp(text)
Эти продвинутые техники значительно расширяют возможности spaCy и позволяют строить сложные, высокоточные системы обработки естественного языка, адаптированные под конкретные бизнес-задачи.

Практические примеры



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

Анализ настроений



Анализ настроений (sentiment analysis) — одна из наиболее востребованных задач NLP в бизнесе. SpaCy не имеет встроенного классификатора настроений, но предоставляет отличный фундамент для его создания.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import spacy
from spacytextblob.spacytextblob import SpacyTextBlob
 
# Загрузка модели и добавление компонента анализа настроений
nlp = spacy.load("ru_core_news_md")
nlp.add_pipe("spacytextblob")
 
# Анализ примеров отзывов
reviews = [
    "Этот телефон просто восхитительный! Камера отличная, батарея держит весь день.",
    "Качество сборки хорошее, но цена слишком высокая для таких характеристик.",
    "Ужасное обслуживание, больше никогда не воспользуюсь этим сервисом."
]
 
for review in reviews:
    doc = nlp(review)
    # Получение полярности: от -1.0 (негативно) до 1.0 (позитивно)
    polarity = doc._.blob.polarity
    # Получение субъективности: от 0.0 (объективно) до 1.0 (субъективно)
    subjectivity = doc._.blob.subjectivity
    
    sentiment = "позитивный" if polarity > 0.1 else "негативный" if polarity < -0.1 else "нейтральный"
    print(f"Отзыв: {review}")
    print(f"Настроение: {sentiment} (полярность: {polarity:.2f}, субъективность: {subjectivity:.2f})\n")
Для более сложных случаев можно реализовать собственную модель анализа настроений, используя векторные представления spaCy и библиотеки машинного обучения:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from sklearn.svm import LinearSVC
import numpy as np
 
# Подготовка обучающей выборки
def preprocess_text(texts, labels):
    docs = list(nlp.pipe(texts))
    features = np.array([doc.vector for doc in docs])  # Используем векторы документов из spaCy
    return features, np.array(labels)
 
# Обучение классификатора
X_train, y_train = preprocess_text(
    ["Отличный продукт", "Ужасное качество", "Не рекомендую"],
    ["positive", "negative", "negative"]
)
classifier = LinearSVC()
classifier.fit(X_train, y_train)
 
# Классификация нового отзыва
new_review = "Продукт работает стабильно, но есть недочёты"
new_features = nlp(new_review).vector.reshape(1, -1)
prediction = classifier.predict(new_features)[0]
print(f"Предсказанное настроение: {prediction}")

Извлечение информации из текста



SpaCy особенно хорошо подходит для извлечения структурированных данных из неструктурированного текста. Рассмотрим пример извлечения информации из новостных статей:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
def extract_article_info(text):
    doc = nlp(text)
    
    # Извлечение основных тем (существительные фразы)
    topics = [chunk.text for chunk in doc.noun_chunks 
              if not any(token.is_stop for token in chunk) and len(chunk) > 1]
    
    # Извлечение ключевых действий (глаголы с дополнениями)
    actions = []
    for token in doc:
        if token.pos_ == "VERB" and not token.is_stop:
            # Ищем связанные с глаголом объекты
            objects = [child.text for child in token.children 
                       if child.dep_ in ("dobj", "obj", "iobj")]
            if objects:
                actions.append(f"{token.lemma_} {' '.join(objects)}")
    
    # Извлечение именованных сущностей
    entities = {ent.text: ent.label_ for ent in doc.ents}
    
    # Выделение временных маркеров
    dates = [ent.text for ent in doc.ents if ent.label_ == "DATE"]
    
    return {
        "topics": list(set(topics))[:5],  # Top 5 уникальных тем
        "actions": actions[:3],  # Top 3 ключевых действия
        "entities": entities,
        "dates": dates
    }
 
# Пример использования
news_text = """
Компания SpaceX успешно запустила ракету Falcon 9 с 60 спутниками Starlink на борту 
18 марта 2023 года. Запуск был осуществлен с космодрома на мысе Канаверал во Флориде. 
Это уже пятый запуск системы Starlink в этом году. Илон Маск, генеральный директор SpaceX, 
подтвердил успешное развертывание спутников на низкой околоземной орбите.
"""
 
info = extract_article_info(news_text)
print("Темы статьи:", info["topics"])
print("Ключевые действия:", info["actions"])
print("Упомянутые сущности:", info["entities"])
print("Даты:", info["dates"])

Автоматическая генерация тегов



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

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from collections import Counter
import math
 
def generate_tags(text, num_tags=5):
    doc = nlp(text)
    
    # Подсчет частотности всех значимых слов
    word_freq = Counter()
    for token in doc:
        if not token.is_stop and not token.is_punct and token.is_alpha:
            word_freq[token.lemma_] += 1
    
    # Определение ключевых фраз на основе синтаксических связей
    noun_chunks = list(doc.noun_chunks)
    chunk_counts = Counter()
    for chunk in noun_chunks:
        # Фильтрация чанков: удаление стоп-слов в начале и фильтрация коротких чанков
        filtered_chunk = ' '.join([token.lemma_ for token in chunk 
                                  if not token.is_stop or token.i != chunk.start])
        if filtered_chunk and len(filtered_chunk.split()) > 1:
            chunk_counts[filtered_chunk] += 1
    
    # Вычисление оценки для каждого потенциального тега
    tag_scores = {}
    # Оценка отдельных слов
    for word, count in word_freq.items():
        # TF (term frequency) с нормализацией по длине документа
        tf = count / len(doc)
        # Предполагаемая оценка IDF (в реальном приложении вычислялась бы по корпусу)
        presumed_idf = math.log(1000 / (count + 1)) + 1
        tag_scores[word] = tf * presumed_idf
    
    # Оценка фраз (выше, чем отдельных слов)
    for chunk, count in chunk_counts.items():
        chunk_words = chunk.split()
        if len(chunk_words) > 1:
            # Повышенный вес для многословных фраз
            tag_scores[chunk] = (count / len(noun_chunks)) * 2.5
    
    # Дополнительный бонус для именованных сущностей
    for ent in doc.ents:
        if ent.text.lower() in tag_scores:
            tag_scores[ent.text.lower()] *= 1.5
        else:
            tag_scores[ent.text.lower()] = 1.5
    
    # Выбор лучших тегов
    best_tags = sorted(tag_scores.items(), key=lambda x: x[1], reverse=True)[:num_tags]
    return [tag for tag, _ in best_tags]
 
# Пример использования
article = """
Искусственный интеллект трансформирует медицинскую диагностику. Глубокие нейронные сети 
теперь могут анализировать рентгеновские снимки с точностью, сравнимой с опытными радиологами. 
Системы машинного обучения помогают выявлять редкие заболевания на ранних стадиях, 
что критически важно для успешного лечения. Компании Google Health и IBM Watson активно 
разрабатывают алгоритмы для помощи врачам. Однако специалисты предупреждают, что ИИ 
должен дополнять работу медиков, а не заменять их полностью.
"""
 
tags = generate_tags(article)
print(f"Предлагаемые теги: {tags}")

Классификация текста



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

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
def classify_text_topic(text):
    doc = nlp(text)
    
    # Словари ключевых слов для каждой категории
    categories = {
        "технологии": ["технология", "инновация", "гаджет", "робот", "искусственный интеллект", 
                     "программное обеспечение", "алгоритм", "интернет", "компьютер"],
        "спорт": ["чемпионат", "матч", "игра", "команда", "спортсмен", "тренер", "турнир", 
                "соревнование", "победа", "медаль"],
        "экономика": ["рынок", "инвестиция", "акция", "компания", "бизнес", "экономический", 
                     "финансовый", "прибыль", "бюджет", "инфляция"]
    }
    
    # Лемматизация текста и удаление стоп-слов
    lemmas = [token.lemma_ for token in doc if not token.is_stop and token.is_alpha]
    
    # Подсчет совпадений с ключевыми словами для каждой категории
    scores = {}
    for category, keywords in categories.items():
        # Базовый скоринг: подсчет совпадений лемм
        scores[category] = sum(lemma in keywords for lemma in lemmas)
        
        # Учет именованных сущностей, релевантных для категории
        for ent in doc.ents:
            if category == "технологии" and ent.label_ == "ORG" and any(kw in ent.text.lower() for kw in ["tech", "технолог"]):
                scores[category] += 2
            elif category == "спорт" and ent.label_ == "EVENT" and any(kw in ent.text.lower() for kw in ["турнир", "чемпионат"]):
                scores[category] += 2
            elif category == "экономика" and ent.label_ == "ORG" and any(kw in ent.text.lower() for kw in ["банк", "корпорация"]):
                scores[category] += 2
                
        # Использование векторного сходства для улучшения оценки
        category_vec = nlp(category).vector
        doc_vec = doc.vector
        # Нормализованное косинусное сходство (-1 до 1) масштабируем до (0 до 2)
        similarity_boost = (doc.similarity(nlp(category)) + 1)
        scores[category] *= similarity_boost
    
    # Определение наиболее вероятной категории
    predicted_category = max(scores.items(), key=lambda x: x[1])
    
    # Если нет явного лидера, возвращаем "неопределенно"
    if predicted_category[1] == 0 or (len(scores) > 1 and 
       predicted_category[1] / sum(scores.values()) < 0.4):
        return "неопределенно", scores
    
    return predicted_category[0], scores
 
# Примеры новостей для классификации
news_samples = [
    "Apple представила новый iPhone с улучшенной камерой и процессором A16.",
    "Сборная России по футболу проиграла в матче отборочного этапа чемпионата мира.",
    "Центральный банк повысил ключевую ставку до 8% годовых для сдерживания инфляции."
]
 
for news in news_samples:
    category, scores = classify_text_topic(news)
    print(f"Новость: {news}")
    print(f"Категория: {category}")
    print(f"Оценки: {scores}\n")
В следующих разделах мы продолжим рассматривать практические примеры, включая создание чат-бота с пониманием контекста, автоматическое составление резюме текстов и разработку системы мониторинга социальных сетей с использованием spaCy.

Создание чат-бота с базовым пониманием контекста



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

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
class ContextualChatbot:
    def __init__(self):
        self.nlp = spacy.load("ru_core_news_md")
        self.product_catalog = {
            "смартфон X1": {"цена": "30000 руб.", "доступность": "в наличии", 
                          "характеристики": "8GB RAM, 128GB память, камера 48MP"},
            "ноутбук Pro": {"цена": "75000 руб.", "доступность": "предзаказ", 
                          "характеристики": "i7, 16GB RAM, 512GB SSD, 15.6\" экран"},
            "наушники TWS": {"цена": "6500 руб.", "доступность": "в наличии", 
                           "характеристики": "Bluetooth 5.0, шумоподавление, 30ч работы"}
        }
        self.context = {"last_product": None, "last_attribute": None}
        
    def process_query(self, text):
        doc = self.nlp(text)
        
        # Определение намерения пользователя
        intent = self._identify_intent(doc)
        
        # Извлечение продукта и атрибута из запроса
        product = self._extract_product(doc) or self.context["last_product"]
        attribute = self._extract_attribute(doc) or self.context["last_attribute"]
        
        # Обновление контекста
        if product:
            self.context["last_product"] = product
        if attribute:
            self.context["last_attribute"] = attribute
            
        # Формирование ответа
        if intent == "приветствие":
            return "Здравствуйте! Чем могу помочь?"
        
        elif intent == "запрос_информации" and product and attribute:
            if product in self.product_catalog and attribute in self.product_catalog[product]:
                return f"{product}: {attribute} - {self.product_catalog[product][attribute]}"
            else:
                return f"Извините, у меня нет информации о {attribute} для {product}."
                
        elif intent == "запрос_информации" and product:
            return f"Что конкретно вас интересует о {product}? Доступны: цена, доступность, характеристики."
            
        else:
            return "Извините, не могу понять ваш запрос. Попробуйте спросить о конкретном продукте."
    
    def _identify_intent(self, doc):
        greeting_tokens = ["привет", "здравствуй", "добрый", "день", "утро"]
        info_tokens = ["сколько", "стоит", "цена", "характеристики", "когда", "где", "как"]
        
        # Проверка на приветствие
        if any(token.lemma_.lower() in greeting_tokens for token in doc):
            return "приветствие"
            
        # Проверка на запрос информации
        if any(token.lemma_.lower() in info_tokens for token in doc) or doc.text.endswith("?"):
            return "запрос_информации"
            
        return "неопределенно"
    
    def _extract_product(self, doc):
        for product in self.product_catalog:
            if product.lower() in doc.text.lower():
                return product
        return None
    
    def _extract_attribute(self, doc):
        attribute_map = {
            "цена": ["цена", "стоимость", "стоит"],
            "доступность": ["наличие", "доступность", "купить", "заказать"],
            "характеристики": ["характеристики", "параметры", "спецификации"]
        }
        
        for attr, keywords in attribute_map.items():
            if any(keyword in doc.text.lower() for keyword in keywords):
                return attr
        return None
 
# Пример использования
bot = ContextualChatbot()
queries = [
    "Привет!",
    "Сколько стоит смартфон X1?",
    "А какие у него характеристики?",
    "Что насчет ноутбука Pro?",
    "Он доступен сейчас?"
]
 
for query in queries:
    response = bot.process_query(query)
    print(f"Пользователь: {query}")
    print(f"Бот: {response}\n")
Этот простой бот демонстрирует базовые принципы работы с контекстом. Он запоминает последний упомянутый продукт и атрибут, что позволяет вести более естественный диалог.

Автоматическое составление резюме текстов



Автоматическое резюмирование текста — ценный инструмент для быстрого извлечения ключевой информации из объемных документов. SpaCy может использоваться для создания экстрактивного резюме (выбор наиболее важных предложений из оригинального текста):

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
def summarize_text(text, num_sentences=3):
    nlp = spacy.load("ru_core_news_md")
    doc = nlp(text)
    
    # Разбиение на предложения
    sentences = list(doc.sents)
    
    # Расчет важности предложений
    sentence_scores = {}
    for sent in sentences:
        # Фильтрация стоп-слов и знаков препинания
        words = [token for token in sent if not token.is_stop and not token.is_punct]
        
        # Оценка на основе частотности слов в документе
        word_freq = {}
        for token in doc:
            if not token.is_stop and not token.is_punct and token.is_alpha:
                word = token.lemma_.lower()
                if word in word_freq:
                    word_freq[word] += 1
                else:
                    word_freq[word] = 1
        
        # Вычисление оценки предложения
        score = sum(word_freq.get(token.lemma_.lower(), 0) for token in words)
        
        # Нормализация по длине предложения
        if len(words) > 0:
            score = score / len(words)
            
        # Бонус для предложений с именованными сущностями
        ent_bonus = sum(1 for _ in sent.ents) * 0.5
        score += ent_bonus
        
        # Бонус для предложений в начале документа
        position_bonus = 1.0 / (1 + sentences.index(sent) * 0.1)
        score *= position_bonus
        
        sentence_scores[sent] = score
    
    # Отбор предложений с наивысшей оценкой
    summary_sentences = sorted(sentence_scores.items(), key=lambda x: x[1], reverse=True)[:num_sentences]
    
    # Сортировка предложений по их порядку в оригинальном тексте
    summary_sentences.sort(key=lambda x: sentences.index(x[0]))
    
    # Формирование резюме
    summary = " ".join([sent.text for sent, _ in summary_sentences])
    return summary
 
# Пример использования
article = """
Исскуственный интеллект трансформирует сферу образования во всём мире. Новые системы 
позволяют создавать персонализированные учебные программы, адаптированные под темп 
и стиль обучения каждого ученика. Учителя получают инструменты для автоматической 
проверки заданий и анализа прогресса студентов. В некоторых странах уже запущены 
пилотные программы по внедрению ИИ-ассистентов в школах. Однако критики указывают 
на риски уменьшения социального взаимодействия и возможного увеличения неравенства 
в доступе к качественному образованию. Исследования показывают, что наиболее эффективным 
является сбалансированный подход, при котором технологии дополняют, а не заменяют 
традиционные методы обучения. Эксперты прогнозируют, что к 2030 году ИИ станет 
неотъемлемой частью образовательного процесса в большинстве развитых стран.
"""
 
summary = summarize_text(article, num_sentences=2)
print(f"Резюме:\n{summary}")

Сравнение с другими инструментами и ограничения



При выборе инструмента для обработки естественного языка важно понимать, что универсальных решений не существует. SpaCy, NLTK и Gensim имеют разные подходы к решению задач NLP, и каждый инструмент имеет свои сильные и слабые стороны.

NLTK, как старейшая и наиболее академически ориентированная библиотека, предоставляет широкий набор алгоритмов и корпусов, что делает её идеальной для исследований и обучения. Однако её модульная структура часто приводит к более медленной обработке по сравнению с spaCy. В тестах на идентичных задачах tokenization, POS-tagging и NER spaCy демонстрирует скорость в 5-10 раз выше, что критично для промышленных решений. При этом NLTK остаётся непревзойденным по обширности доступных ресурсов и образовательной ценности.

Gensim фокусируется на тематическом моделировании и работе с векторными представлениями. Его реализации LDA, Word2Vec и Doc2Vec отлично дополняют возможности spaCy в проектах, требующих глубокого семантического анализа. При обработке корпусов из миллионов документов Gensim показывает лучшую производительность за счёт оптимизированных алгоритмов и поддержки инкрементального обучения.

Важное ограничение spaCy проявляется при работе с морфологически сложными языками. Русский, финский, турецкий языки с их богатой морфологией и свободным порядком слов часто вызывают сложности даже у средних и больших моделей spaCy. На практике точность морфологического анализа для русского языка может быть на 5-10% ниже, чем для английского. В таких случаях специализированные решения, как DeepPavlov или Natasha, могут дать лучшие результаты для конкретных задач. В высоконагруженных системах spaCy демонстрирует хорошую масштабируемость до определённого предела. Тесты показывают, что одиночный экземпляр модели способен обрабатывать до 20000 текстов в минуту на стандартном серверном оборудовании, при условии правильной настройки и отключения ненужных компонентов конвейера. Для более высоких нагрузок требуется горизонтальное масштабирование и потоковая обработка.

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

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

Обработка естественного языка
Всем доброго времени суток! Делаю учебный пример на тему обработки естественного языка с...

Задача 4: Обработка естественного языка
2.1 Вкрапления слов (a) Вам был предоставлен небольшой набор документов в файле nlp_data.json,...

Задача разбора предложения естественного языка
Здравствуйте! Есть задача написать парсер предложений русского языка. Я взял корпус, написал...

Перевод естественного языка
Есть задание, в котором даны два текста на русском и немецком языках. Нужно написать программу,...

Трансляция естественного языка в sql запрос
здравствуйте. делаю работу в вузе. &quot;разработка процессора языка запроса на основе метаданных&quot;....

Как отправлять данные на сервер с помощью Python и принимать их там с помощью php?
Здравствуйте, мне необходимо отправлять данные на сервер с помощью Python и принимать их там с...

Перевод программы из языка С на Python
Ктот знает как можно перевести програму с языка С на Питон? Добавлено через 4 часа 3 минуты...

NumPy 1.6.0 - расширение языка Python для научных вычислений
14 мая 2011 года стала доступной для загрузки стабильная версия 1.6.0 расширения языка Python для...

Переход с одного языка на Python
Всем привет, я тут подумал, как вы думайте, логично будет перейти с Visual Basic на Python (или же...

Конвертировать из языка С в .so (динамические загружаемый объектный файл) для python
Для использования файла C в сценарии Python надо скомпилировать его в динамически загружаемый...

Авторизация на сайте с использованием средств языка python
Добрый вечер. Есть сайт с учётными записями студентов https://student.psu.ru Проблема в том, что...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru