在人工智能理解你的问题、写论文或翻译句子之前,它必须处理原始文本。每个聊天机器人、搜索引擎和语言模型都以字符串开始——代表人类语言的字符序列。
了解字符串的工作原理打开了自然语言处理的大门,这是人工智能最令人兴奋的领域之一。
字符串只是按顺序存储的字符序列(字母、数字、空格和符号)。
message = "Hello, World!"
每个字符都有一个位置(索引),就像数组一样:
index: 0 1 2 3 4 5 6 7 8 9 10 11 12
char: H e l l o , W o r l d !
子字符串是字符串的一部分。出自《你好,世界!》您可以提取“World”(索引 7 到 11)。人工智能系统不断提取子字符串 - 从句子中提取名称,从推文中分离主题标签,或从网页中抓取 URL。
在大多数语言中,字符串是不可变的 - 您无法就地更改字符。相反,您创建一个新字符串。这对于性能很重要:如果您的 AI 管道修改文本数百万次,每次创建新字符串都会减慢速度。
莎士比亚的全部作品大约包含 90 万字。 GPT-4 在大数千倍的文本数据集上进行训练 - 数千亿个单词,在转换为数字之前全部作为字符串进行处理。
人工智能模型不像人类那样阅读文字。他们使用标记化 - 将文本分割成更小的部分,称为标记。
Input: "unhappiness"
Tokens: ["un", "happiness"]
Input: "ChatGPT is brilliant"
Tokens: ["Chat", "G", "PT", " is", " brilliant"]
标记化位于字符级和单词级处理之间。它通过将生僻单词分解为已知的子部分来处理生僻单词,从而保持词汇量易于管理。
当您在 ChatGPT 中输入一个长的、不寻常的单词(例如“antidistitutionalarianism”)时,模型会将其分解为熟悉的子词标记。为什么这比将每个可能的英语单词存储为单独的标记更好?
核心字符串操作是在较大文本中搜索模式。这封邮件中是否包含“紧急”一词?此代码是否包含安全漏洞?
沿着文本滑动图案,逐个字符检查:
text: "the cat sat on the mat"
pattern: "cat"
Position 0: "the" → no match
Position 1: "he " → no match
Position 4: "cat" → match found at index 4!
在最坏的情况下,这是 O(n × m),其中 n 是文本长度,m 是模式长度。对于短图案来说,这很好。为了扫描数百万份文档,我们需要更智能的方法。
为什么对于非常大的文本,朴素模式匹配速度很慢?
反转字符串很简单,但揭示了您如何看待数据:
reverse("hello") → "olleh"
登录 参与讨论
人工智能在序列到序列模型中使用反转——例如,一些早期的翻译模型反转输入句子以提高准确性。
回文从前到后读起来都是一样的:“赛车”、“女士”、“级别”。
is_palindrome(text):
return text == reverse(text)
如果两个单词包含不同顺序的相同字符,则它们是字谜词:“listen”和“silent”。
优雅的解决方案?使用哈希图计算字符频率:
are_anagrams(word1, word2):
return character_counts(word1) == character_counts(word2)
这直接连接到上一课中的频率计数模式 - 哈希映射使其 O(n)。
哪种方法最有效地检查两个单词是否是字谜?
正则表达式 (regex) 可让您描述模式而不是精确的文本:
|图案|比赛|使用案例|
|---------|---------|----------|
| \d+ |一位或多位数字 |从文本中提取数字 |
| [A-Z][a-z]+ |大写的单词 |查找专有名词 |
| \b\w+@\w+\.\w+\b |电子邮件地址 |数据提取|
| (cat\|dog\|bird) |三个词中的任何一个 |分类关键词|
AI 数据管道广泛使用正则表达式进行数据清理 - 删除 HTML 标签、提取日期、标准化电话号码以及在训练前过滤掉不需要的字符。
则表达式很强大,但也可能很棘手。写得不好的正则表达式可能会在某些输入上花费指数级的时间 - 这个问题被称为“灾难性回溯”。始终在边缘情况下测试您的模式。
以下是人工智能如何处理文本的简化视图:
每一步都涉及字符串操作——切片、搜索、替换和分割。
当您使用不使用单词之间空格的语言(例如中文或日语)向聊天机器人发送消息时,标记化的工作方式有何不同?这会带来什么额外的挑战?
OpenAI 的标记器将“标记化”拆分为 [“标记”、“化”] - 两个标记。但美式拼写“tokenization”变成了[“token”,“ization”]。相同的概念根据您的拼写方式不同,花费的金额也不同!
在文本处理管道中,为什么要在将文本输入人工智能模型之前执行标记化?