Выявление неинклюзивных выражений с помощью Retext и Node.js

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

alex — это прекрасный инструмент командной строки, который принимает текст или файлы с разметкой и, используя retext-equality и retext-profanities, выделяет предложения по улучшению. alex проверяет гендерные названия работ, гендерные пословицы, ableist язык, снисходительный или нетерпимый язык, ругательства и многое другое.

В этом кратком руководстве мы рассмотрим, как использовать библиотеки retext, от которых зависит alex, для проверки транскриптов Deepgram на наличие предложений.

Перед началом работы

Прежде чем мы начнем, вам понадобится API-ключ Deepgram — получить его можно здесь.

Создайте новый каталог и откройте его в редакторе кода, перейдите в него в терминале, создайте новый файл package.json, выполнив npm init -y, и установите зависимости:

npm install retext retext-equality retext-profanities vfile-reporter-json @deepgram/sdk
Войдите в полноэкранный режим Выйти из полноэкранного режима

Пакеты retext требуют наличия проекта ES6. Самый простой способ сделать это без необходимости компилировать код с помощью такого инструмента, как Babel, — добавить следующее свойство в файл package.json:

"type": "module"
Enter fullscreen mode Выйти из полноэкранного режима

Создайте и откройте файл index.js в вашем редакторе кода.

Генерация стенограммы с помощью Deepgram

Deepgram Node.js является модулем CommonJS, но может быть импортирован через экспорт по умолчанию. Поэтому наш импорт в CommonJS будет происходить отсюда:

const { Deepgram } = require('@deepgram/sdk')
Войти в полноэкранный режим Выход из полноэкранного режима

К этому в ES6 (DG может быть чем угодно, лишь бы оно было одинаковым в обоих случаях):

import DG from '@deepgram/sdk'
const { Deepgram } = DG
Войти в полноэкранный режим Выйти из полноэкранного режима

Затем создайте транскрипт. Здесь я использую запись своего голоса, зачитывающего фразу из примера alex для демонстрации.

const deepgram = new Deepgram('YOUR_DEEPGRAM_API_KEY')
const url = 'http://lws.io/static/inconsiderate.mp3'
const { results } = await deepgram.transcription.preRecorded({ url }, { utterances: true })
console.log(results)
Войти в полноэкранный режим Выход из полноэкранного режима

При использовании функции произнесения фраз будет предоставлен массив с каждым произнесенным словом (фразой) и временем его произнесения.

Проверьте это! Запустите файл с помощью node index.js, и вы должны увидеть в терминале полезную нагрузку. Как только вы убедитесь, что он работает, удалите console.log().

Настройка средства проверки языка

В самом верху index.js включите зависимости, необходимые для установки retext и последующего сообщения о найденных с его помощью проблемах:

import { reporterJson } from 'vfile-reporter-json'
import { retext } from 'retext'
import retextProfanities from 'retext-profanities'
import retextEquality from 'retext-equality'
Войти в полноэкранный режим Выход из полноэкранного режима

Затем создайте следующую многократно используемую функцию:

async function checkText(text) {
    const file = await retext()
        .use(retextProfanities)
        .use(retextEquality)
        .process(text)
    const outcome = JSON.parse(reporterJson(file))
    const warnings = outcome[0].messages.map(r => r.reason)
    return warnings
}
Вход в полноэкранный режим Выход из полноэкранного режима

Эта функция обрабатывает предоставленный текст через указанные плагины (здесь retextProfanities и retextEquality). outcome на самом деле представляет собой довольно большой объем данных:

{
    reason: '`man` may be insensitive, use `people`, `persons`, `folks` instead',
    line: 1,
    column: 9,
    position: {
        start: { line: 1, column: 9, offset: 8 },
        end: { line: 1, column: 12, offset: 11 }
    },
    ruleId: 'gals-man',
    source: 'retext-equality',
    fatal: false,
    stack: null
},
Вход в полноэкранный режим Выход из полноэкранного режима

Карта warnings в многоразовой функции checkText извлекает только reason и возвращает массив этих строк. Попробуйте это, временно добавив эту строку:

const testSuggestions = await checkText('He is a butthead.')
console.log(testSuggestions)
Войти в полноэкранный режим Выйти из полноэкранного режима

Результат должен быть следующим:

[
    'Don’t use `butthead`, it’s profane',
    '`He` may be insensitive, use `They`, `It` instead'
]
Войти в полноэкранный режим Выйти из полноэкранного режима

Когда вы убедитесь, что все работает, удалите console.log().

Проверка языка каждого высказывания

Добавьте следующее в файл index.js, расположенный ниже того места, где вы генерируете транскрипты Deepgram:

let suggestions = []

for(let utterance of results.utterances) {
    const { transcript, start } = utterance

    // Get array of warning strings
    let warnings = await checkText(transcript)

    // Alter strings to be objects including the utterance transcript and start time
    warnings = warnings.map(warning => ({ warning, transcript, start }))

    // Append to end of array
    suggestions = [...suggestions, ...warnings]
}

console.log(suggestions)
Войти в полноэкранный режим Выйдите из полноэкранного режима

Ваш терминал должен показать все предложения, представленные двумя плагинами retext:

Подведение итогов

Этот полный фрагмент (ниже) — отличное место, чтобы начать выявлять и изменять шаблоны использования и неинклюзивного языка. Вы можете быстро понять, что плагинам retext не хватает нюансов, и иногда они делают предложения по ложноположительным совпадениям. Не рассматривайте эти предложения как «обязательные к исполнению», это скорее повод для размышлений.

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

import { reporterJson } from 'vfile-reporter-json'
import { retext } from 'retext'
import retextProfanities from 'retext-profanities'
import retextEquality from 'retext-equality'
import DG from '@deepgram/sdk'
const { Deepgram } = DG
const deepgram = new Deepgram(process.env.DG_KEY)

const url = 'http://lws.io/static/inconsiderate.mp3'
const { results } = await deepgram.transcription.preRecorded({ url }, { utterances: true })

async function checkText(text) {
    const file = await retext()
        .use(retextProfanities)
        .use(retextEquality)
        .process(text)
    const outcome = JSON.parse(reporterJson(file))
    const warnings = outcome[0].messages.map(r => r.reason)
    return warnings
}

let suggestions = []
for(let utterance of results.utterances) {
    const { transcript, start } = utterance
    let warnings = await checkText(transcript)
    warnings = warnings.map(warning => ({ warning, transcript, start }))
    suggestions = [...suggestions, ...warnings]
}

console.log(suggestions)
Вход в полноэкранный режим Выход из полноэкранного режима

Оцените статью
devanswers.ru
Добавить комментарий