alex

alex

智能检测并改进文本中的不当用语

alex是一款开源的智能写作辅助工具,专注于检测和改进文本中的不当用语。它能识别潜在的性别歧视、种族相关或其他不平等的措辞,提供替代建议以增强文字的包容性。支持多种格式如纯文本、HTML、MDX和Markdown,alex适用于个人写作和文章审阅,有效提升文字质量和社会意识。

alex写作辅助文本分析包容性语言CLI工具Github开源项目
<h1 align="center"> <img width="300" src="https://yellow-cdn.veclightyear.com/87312a0a/c0ba1348-5e45-467e-80fa-6863f9b12e66.svg?sanitize=true" alt="alex"> <br> <br> </h1> > 📝 **alex** — 捕捉不敏感、不体贴的写作。 [![构建][build-badge]][build] [![覆盖率][coverage-badge]][coverage] [![首次贡献者友好][first-timers-badge]][first-timers] 无论是你自己的还是他人的写作,**alex** 都能帮助你发现偏向性别、极端化、涉及种族或其他**不平等**的措辞。 例如,当出现"We've confirmed his identity"时,**alex** 会提醒你,并建议使用"their"来代替"his"。 在[在线演示 »][demo]上体验 **alex**。 ## 为什么选择
  • 有助于提高体贴性写作能力
  • 捕捉许多可能的冒犯表述
  • 提供有用的替代建议
  • 可读取纯文本、HTML、MDX或markdown作为输入
  • 风格优雅

安装

使用 npm(配合 Node.js):

$ npm install alex --global

使用 yarn

$ yarn global add alex

或者你可以按照这个步骤教程进行操作: 在你的项目中设置 alex

<!--alex disable wacko stupid-->

目录

检查项目

alex 检查以下内容:

  • 带性别倾向的职业头衔(如果你写"垃圾男",alex 会建议用"垃圾收集员";如果你写"房东",alex 会建议用"业主")
  • 带性别倾向的谚语(如果你写"像个男人一样",alex 会建议用"勇敢地";如果你写"淑女般的",alex 会建议用"有礼貌的")
  • 歧视残疾人的语言(如果你写"学习障碍",alex 会建议用"有学习障碍的人")
  • 居高临下的语言(如果你写"显然"或"众所周知",alex 会对此发出警告)
  • 不宽容的措辞(如果你写"主人"和"奴隶",alex 会建议用"主要"和"副本")
  • 亵渎语(如果你写"屁股"🍑,alex 会对此发出警告) ……还有更多!

注意:alex 假定你的意图是善意的:你并不是有意冒犯他人!

查看 retext-equalityretext-profanities 了解所有规则。

alex 会忽略字面意义上的词语,所以 "他"他 — ……,以及类似用法不会被警告。

集成

忽略文件

CLI 在给定目录时会搜索带有 markdown 或文本扩展名的文件(因此 $ alex . 会找到 readme.mdpath/to/file.txt)。要防止文件被发现,请创建一个 .alexignore 文件。

.alexignore

CLI 有时会搜索文件。要防止文件被发现,请在当前工作目录(即运行 alex 的位置)上方的某个目录中添加一个名为 .alexignore 的文件。这些文件的格式类似于 .eslintignore(而后者又类似于 .gitignore 文件)。

例如,当在 ~/path/to/place 中工作时,忽略文件可以位于 toplace~ 中。

本项目自身的忽略文件看起来像这样:

# `node_modules` 默认被忽略。 example.md

控制

有时alex会出错:

这句话会弹出一条消息。

结果如下:

readme.md 1:15-1:18 警告 `pop` 可能有歧义,请改用 `parent` dad-mom retext-equality ⚠ 1 个警告

可以使用 Markdown 中的 HTML 注释来忽略它们:

<!--alex ignore dad-mom--> 这句话将**不会**弹出消息。

结果如下:

readme.md: 未发现问题

ignore 会关闭注释后面内容的消息(在这个例子中是该段落)。 也可以使用 disable 在注释后关闭消息,然后使用 enable 重新开启这些消息:

<!--alex disable dad-mom--> 这句话将**不会**弹出消息。 这句话也**不会**弹出消息。 再来一句话,同样**不会**弹出消息。 <!--alex enable dad-mom--> 这句话会弹出消息。

结果如下:

readme.md 9:15-9:18 警告 `pop` 可能有歧义,请改用 `parent` dad-mom retext-equality ⚠ 1 个警告

可以一次控制多个消息:

<!--alex disable he-her his-hers dad-mom-->

…通过省略所有规则标识符,可以控制所有消息:

<!--alex ignore-->

配置

您可以通过 .alexrc 配置文件控制 alex

{ "allow": ["boogeyman-boogeywoman"] }

…如果文件名为 .alexrc.yml.alexrc.yaml,您可以使用 YAML:

allow: - dad-mom

…如果文件名为 .alexrc.js,您还可以使用 JavaScript:

// 但像这样随机设置是个坏主意! exports.profanitySureness = Math.floor(Math.random() * 3)

…最后,还可以在 package.json 中使用 alex 字段:

{ "alex": { "noBinary": true }, }

allow 字段应为规则数组或 undefined(默认为 undefined)。提供时,将跳过并不报告指定的规则。 deny 字段应为规则数组或 undefined(默认为 undefined)。提供时,报告指定的规则。 不能同时使用 allowdenynoBinary 字段应为布尔值(默认为 false)。 开启(true)时,像 he and shegarbageman or garbagewoman 这样的配对将被视为错误。 关闭(false,默认)时,这样的配对是可以的。 profanitySureness 字段是一个数字(默认为 0)。 我们使用 cuss,它有一个词典,对单词或短语作为亵渎语的可能性(而非其"糟糕"程度)进行 0 到 2 的评级:

评级作为亵渎语使用在干净文本中使用示例
2可能不太可能asshat
1可能可能addict
0不太可能可能beaver
profanitySureness 字段是您想要检查的最低评级(包含该评级)。
如果您将其设置为 1(可能),那么它会对级别 1 2(可能)的亵渎语发出警告,但不会对级别 0(不太可能)的发出警告。

CLI

<!--alex enable wacko stupid-->

![][截图]

假设example.md内容如下:

妖怪将所有更改写入**主服务器**。因此,从服务器是主服务器的只读副本。不过别担心,他是个残疾人。

现在,在example.md上运行alex

$ alex example.md

输出结果:

example.md 1:5-1:14 警告 `boogeyman`可能有冒犯性,请使用`boogeymonster`代替 boogeyman-boogeywoman retext-equality 1:42-1:48 警告 `master` / `slaves`可能有冒犯性,请使用`primary` / `replica`代替 master-slave retext-equality 1:69-1:75 警告 不要使用`slaves`,这是亵渎性词语 slaves retext-profanities 2:52-2:54 警告 `he`可能有冒犯性,请使用`they`、`it`代替 he-she retext-equality 2:61-2:68 警告 `cripple`可能有冒犯性,请使用`person with a limp`代替 gimp retext-equality ⚠ 5 个警告

使用$ alex --help获取更多信息。

当没有给alex输入文件时,它会在当前目录、docdocs中搜索文件。 如果给定--mdx参数,它会搜索mdx扩展名的文件。 如果给定--html参数,它会搜索htmhtml扩展名的文件。 否则,它会搜索txttextmdmkdmkdnmkdownronmarkdown扩展名的文件。

API

本包是仅支持 ESM的: 需要 Node 14+ 版本才能使用,且必须通过 import 而不是 require 来引入。

npm:

$ npm install alex --save

本包导出了标识符 markdownmdxhtmltext。 默认导出为 markdown

markdown(value, config)

检查 Markdown(忽略语法)。

参数
  • value (VFilestring) — Markdown 文档
  • config (Object,可选) — 参见[配置][]部分
返回值

VFile

你可能对其 messages 属性感兴趣,如下例所示,因为它包含了可能的违规信息。

示例
import alex from 'alex' alex('We've confirmed his identity.').messages

输出:

[ { message: '`his` 在指代人时可能不够敏感,请使用 `their`、`theirs`、`them` 替代', name: '1:17-1:20', reason: '`his` 在指代人时可能不够敏感,请使用 `their`、`theirs`、`them` 替代', line: 1, column: 17, location: { start: [Object], end: [Object] }, source: 'retext-equality', ruleId: 'her-him', fatal: false, actual: 'his', expected: [ 'their', 'theirs', 'them' ] } ]

mdx(value, config)

检查 MDX(忽略语法)。

注意:alex 使用的是目前处于 beta 阶段的 MDX@2 语法。

参数
  • value (VFilestring) — MDX 文档
  • config (Object,可选) — 参见[配置][]部分
返回值

VFile

示例
import {mdx} from 'alex' mdx('<Component>He walked to class.</Component>').messages

输出:

[ { reason: '`He` 可能不够敏感,请使用 `They`、`It` 替代', line: 1, column: 12, location: { start: [Object], end: [Object] }, source: 'retext-equality', ruleId: 'he-she', fatal: false, actual: 'He', expected: [ 'They', 'It' ] } ]

html(value, config)

检查 HTML(忽略语法)。

参数
  • value (VFilestring) — HTML 文档
  • config (Object,可选) — 参见[配置][]部分
返回值

VFile

示例
import {html} from 'alex' html('<p class="black">He walked to class.</p>').messages

输出:

[ { message: '`He` 可能不够敏感,请使用 `They`、`It` 替代', name: '1:18-1:20', reason: '`He` 可能不够敏感,请使用 `They`、`It` 替代', line: 1, column: 18, location: { start: [Object], end: [Object] }, source: 'retext-equality', ruleId: 'he-she', fatal: false, actual: 'He', expected: [ 'They', 'It' ] } ]

text(value, config)

检查纯文本(包括语法检查)。

参数
  • value (VFilestring) — 文本文档
  • config (Object,可选) — 参见[配置][]部分
返回值

VFile

示例
import {markdown, text} from 'alex' markdown('The `boogeyman`.').messages // => [] text('The `boogeyman`.').messages

输出:

[ { message: '`boogeyman` 可能不够敏感,请使用 `boogeymonster` 替代', name: '1:6-1:15', reason: '`boogeyman` 可能不够敏感,请使用 `boogeymonster` 替代', line: 1, column: 6, location: Position { start: [Object], end: [Object] }, source: 'retext-equality', ruleId: 'boogeyman-boogeywoman', fatal: false, actual: 'boogeyman', expected: [ 'boogeymonster' ] } ]

工作流程

建议的工作流程是将 alex 添加到 package.json 中,并在 Travis 中与您的测试一起运行。

您可以通过 alexrc 文件和控制注释来选择忽略警告。

一个使用 npm scriptspackage.json 文件,并额外使用 AVA 进行单元测试,可能如下所示:

{ "scripts": { "test-api": "ava", "test-doc": "alex", "test": "npm run test-api && npm run test-doc" }, "devDependencies": { "alex": "^1.0.0", "ava": "^0.1.0" } }

如果您使用 Travis 进行持续集成,在 .travis.yml 中设置类似以下内容:

script: - npm test + - alex --diff

请确保仍然安装 alex!

如果使用 --diff 标志,并且检测到 Travis,则会忽略此次推送中未更改的行。

使用这个工作流程,即使 PR 有警告,您也可以合并它。然后,如果有人编辑了一个完全不同的文件,他们不会被已存在的警告所困扰,只会关注他们添加的内容!

常见问题

这太蠢了!

这不是一个问题。 是的,alex 并不是很聪明。 人类在这方面做得更好。 但人也会犯错,而 alex 就是来帮忙的。

alex 没有检查"X"!

请查看 contributing.md 了解如何让 alex 检查"X"。

为什么叫 alex?

这是一个不分性别的好名字,在 npm 上还未被使用,我很喜欢! :smile:

延伸阅读

没有任何自动化工具可以取代学习包容性沟通和倾听他人的亲身经历。 alex 工具的错误可以成为学习更多知识的契机。 以下资源可作为起点,帮助你在 alex 工具之外深化自身理解和编辑技能:

  • 18F 内容指南提供了一系列有用的链接,指向新闻和学术写作中使用的其他包容性语言指南。
  • Conscious Style Guide涵盖了许多语言使用的微妙话题。例如,种族和民族这两个术语有不同的含义,选择正确的词语取决于你。 同样,过度概括某个群体的句子(如"开发者喜欢整天编码")可能不会被 alex 发现,但它并不具有包容性。优秀的人工编辑可以迎接挑战,找到更好的表达方式。
  • 有时,了解什么是包容性的唯一方法就是询问。 在残疾是一个细微的问题一文中,Nicolas Steenhout 写道,以人为本的语言,如"有残疾的人",并不总是正确的选择。
  • 语言在不断演变。一年前中性的术语到今天可能就成了问题。像Self-Defined Dictionary这样的项目旨在收集我们用来定义自己和他人的词语,并将它们与历史和一些有用的建议联系起来。
  • 无意识偏见存在于日常决策和对话中,也可能出现在写作中。 Textio提供了一些例子,说明描述性形容词的选择和语气如何会疏远某些人,以及地区性语言差异如何可能导致混淆。
  • 使用复杂的句子和罕见的词汇可能导致内容不够包容。这在Harver的这篇文章中被描述为读写能力排斥。 如果你的内容面向全球受众,这一点尤为重要,因为读者最擅长的语言可能不是你写作所用的语言。

贡献

请参阅 get-alex/.github 仓库中的 contributing.md 文件,了解如何开始贡献。 如需获取帮助,请查看 support.md 文件。 本项目遵循行为准则。 通过与此仓库、组织或社区进行互动,即表示您同意遵守其条款。

起源故事

感谢 @iheanyi 提出这个问题,以及 @sindresorhus 激发我(@wooorm)采取行动。

当 alex 推出时,它在 TwitterProduct Hunt 上获得了一些关注。随后,出现了大量媒体报道新闻报导

致谢

alex 的初步工作始于2015年

该项目由 @wooorm 创作。

自那以后,许多为此做出了贡献!

许可证

MIT © Titus Wormer

<!-- 定义 -->

编辑推荐精选

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

下拉加载更多