AI人工智能 使用 Python 进行自然语言处理
什么是自然语言处理?
自然语言处理(NLP)是指使用自然语言(如英语)与智能系统进行通信的人工智能方法。当你希望像机器人这样的智能系统按照你的指令执行操作时,或者当你想从基于对话的临床专家系统那里听到决策时,就需要进行自然语言处理。
NLP 领域涉及让计算机使用人类使用的自然语言执行有用的任务。NLP 系统的输入和输出可以是语音或书面文本。
NLP 中的关键术语
以下是自然语言处理中一些关键术语和概念:
| 术语 | 说明 |
|---|---|
| 音系学(Phonology) | 系统地研究声音组织的学科 |
| 形态学(Morphology) | 研究如何从原始有意义的单位构建单词的学科 |
| 词素(Morpheme) | 语言中意义的基本单位 |
| 句法(Syntax) | 指将单词排列成句子。它还涉及确定单词在句子和短语中的结构角色 |
| 语义学(Semantics) | 关注单词的含义以及如何将单词组合成有意义的短语和句子 |
| 语用学(Pragmatics) | 处理在不同情况下使用和理解句子,以及句子的解释如何受到影响 |
| 语篇(Discourse) | 处理紧接的前一个句子如何影响对下一个句子的解释 |
| 世界知识(World Knowledge) | 包括关于世界的一般知识 |
NLP 中的技术
NLP 中的技术是用于处理、分析和理解人类语言和数据的方法和算法。一些常见的 NLP 技术包括:
- 分词(Tokenization):NLP 中的一种技术,涉及将句子或短语拆分为称为词元(tokens)的较小单位。
- 词性标注(Part-of-Speech Tagging):NLP 中的这种技术涉及根据单词的词性(名词、动词、形容词)识别和标记句子中的单词。
- 命名实体识别(Named Entity Recognition, NER):NLP 中的这种技术用于识别文本中的命名实体,如人名、组织、地点、日期等。
- 语义分析(Semantic Analysis):NLP 中的这种技术确定文本中表达的情感。
NLP 的步骤
为了更好地理解和分析书面和口头语言,通常遵循以下 5 个 NLP 步骤:
- 词法分析(Lexical Analysis):涉及识别和分析单词的结构。语言的词汇表是指该语言中单词和短语的集合。词法分析是将整个文本块分成段落、句子和单词。
- 句法分析(Syntactic Analysis / Parsing):涉及分析句子中的单词以检查语法,并以显示单词之间关系的方式排列单词。例如,像"The school goes to boy"这样的句子会被英语句法分析器拒绝。
- 语义分析(Semantic Analysis):从文本中提取确切的含义或字典含义。检查文本是否有意义。这是通过将句法结构与任务域中的对象映射来完成的。语义分析器会拒绝像"hot ice-cream"这样的句子。
- 语篇整合(Discourse Integration):任何句子的含义都取决于它前面句子的含义。此外,它还涉及紧接的后一句的含义。
- 语用分析(Pragmatic Analysis):在此过程中,根据实际含义重新解释所说的内容。它涉及推导语言的那些需要现实世界知识的方面。
NLP 的组成部分
NLP 有两个组成部分:
自然语言理解(Natural Language Understanding, NLU)
NLU 帮助机器通过从内容中提取元数据(包括概念、实体、关键词、情感、关系和语义角色)来理解和分析人类语言。理解涉及以下任务:
- 将自然语言中的给定输入映射到有用的表示形式
- 分析语言的不同方面
自然语言生成(Natural Language Generation, NLG)
这是从某种内部表示形式生成自然语言形式的有意义短语和句子的过程。
它包括:
- 文本规划(Text Planning):包括从知识库中检索相关内容
- 句子规划(Sentence Planning):包括选择所需的单词,形成有意义的短语,设置句子的语气
- 文本实现(Text Realization):将句子计划映射到句子结构
NLP 的阶段
以下图表显示了自然语言处理中的阶段或逻辑步骤:
形态学处理(Morphological Processing)
这是 NLP 的第一阶段。此阶段的目的是将语言输入块分解成对应于段落、句子和单词的词元集合。例如,像uneasy这样的单词可以分解成两个子词词元un-easy。
句法分析(Syntax Analysis)
这是 NLP 的第二阶段。此阶段的目的是双重的:检查句子是否格式正确,并将其分解成显示不同单词之间句法关系的结构。例如,像The school goes to the boy这样的句子会被句法分析器或解析器拒绝。
语义分析(Semantic Analysis)
这是 NLP 的第三阶段。此阶段的目的是从文本中提取确切的含义,或者你可以说字典含义。检查文本是否有意义。例如,语义分析器会拒绝像Hot ice-cream这样的句子。
语用分析(Pragmatic Analysis)
这是 NLP 的第四阶段。语用分析只是将给定上下文中存在的实际对象/事件与上一阶段(语义分析)获得的对象引用相匹配。例如,句子Put the banana in the basket on the shelf可以有两种语义解释,语用分析器将在这两种可能性之间做出选择。
使用 Python 进行 NLP
以下特性使 Python 不同于其他语言:
- Python 是解释型的:我们不需要在执行 Python 程序之前编译它,因为解释器在运行时处理 Python。
- 交互式:我们可以直接与解释器交互来编写 Python 程序。
- 面向对象:Python 本质上是面向对象的,这使得这种语言更容易编写程序,因为借助这种编程技术,它将代码封装在对象中。
- 初学者可以轻松学习:Python 也被称为初学者语言,因为它非常容易理解,并且支持开发广泛的应用程序。
词干提取(Stemming)
由于语法原因,语言包含很多变体。变体的意思是,语言(英语以及其他语言)有一个单词的不同形式。例如,像democracy、democratic和democratization这样的单词。对于机器学习项目,机器理解这些不同的单词(如上所述)具有相同的基本形式是非常重要的。这就是为什么在分析文本时提取单词的基本形式非常有用的原因。
词干提取是一种启发式过程,通过切掉单词的末尾来帮助提取单词的基本形式。
NLTK 模块提供的不同词干提取包如下:
PorterStemmer 包 Porter 算法被这个词干提取包用于提取单词的基本形式。我们可以使用以下命令导入此包:
from nltk.stem.porter import PorterStemmer
例如,将单词writing输入到此词干提取器时,输出将是write。
LancasterStemmer 包 Lancaster 算法被这个词干提取包用于提取单词的基本形式。我们可以使用以下命令导入此包:
from nltk.stem.lancaster import LancasterStemmer
例如,将单词writing输入到此词干提取器时,输出将是writ。
SnowballStemmer 包 Snowball 算法被这个词干提取包用于提取单词的基本形式。我们可以使用以下命令导入此包:
from nltk.stem.snowball import SnowballStemmer
例如,将单词writing输入到此词干提取器时,输出将是write。
词形还原(Lemmatization)
这是提取单词基本形式的另一种方法,通常旨在通过使用词汇和形态分析来去除屈折词尾。词形还原后,任何单词的基本形式称为词元(lemma)。
NLTK 模块提供以下包用于词形还原:
WordNetLemmatizer 包 此包将根据单词是用作名词还是动词来提取单词的基本形式。可以使用以下命令导入此包:
from nltk.stem import WordNetLemmatizer
词性标注计数与分块(Counting POS Tags & Chunking)
借助分块,可以识别词性(POS)和短短语。这是自然语言处理中的重要过程之一。正如我们了解到的用于创建词元的分词过程,分块实际上是为这些词元做标记。换句话说,我们可以说借助分块过程可以获得句子的结构。
示例 在以下示例中,我们将使用 NLTK Python 模块实现名词短语分块(Noun-Phrase chunking),这是一种分块类别,用于在句子中查找名词短语块。
实现名词短语分块的步骤如下:
步骤 1:定义分块语法 在此步骤中,我们需要定义分块的语法。它将包含我们需要遵循的规则。
步骤 2:创建分块解析器 接下来,我们需要创建一个分块解析器。它将解析语法并给出输出。
步骤 3:输出 在此步骤中,我们将以树形格式获得输出。
运行 NLP 脚本 首先导入 NLTK 包:
import nltk
现在,我们需要定义句子。
这里:
- DT 是限定词(Determiner)
- VBP 是动词(Verb)
- JJ 是形容词(Adjective)
- IN 是介词(Preposition)
- NN 是名词(Noun)
sentence = [("a", "DT"),("clever","JJ"),("fox","NN"),("was","VBP"),
("jumping","VBP"),("over","IN"),("the","DT"),("wall","NN")]
接下来,语法应以正则表达式的形式给出:
grammar = "NP:{<DT>?<JJ>*<NN>}"
现在,我们需要定义一个解析器来解析语法:
parser_chunking = nltk.RegexpParser(grammar)
现在,解析器将按如下方式解析句子:
parser_chunking.parse(sentence)
接下来,输出将存储在变量中,如下所示:
Output = parser_chunking.parse(sentence)
现在,以下代码将帮助您以树形形式绘制输出:
output.draw()