掌握-spaCY-自然语言处理-Part-1-
掌握 spaCY 自然语言处理(Part 1)
介绍
自然语言处理(NLP)是人工智能的一部分,专注于理解文本。它是帮助机器阅读、处理并从文本中找到有用的模式或信息,以供我们的应用程序使用。SpaCy是一个库,使这项工作变得更容易、更快。
许多开发者今天使用像 ChatGPT 或 Llama 这样的大型模型来完成大多数 NLP 任务。这些模型功能强大,可以做很多事情,但它们通常成本高昂且速度较慢。在现实世界的项目中,我们需要更专注且快速的东西。这正是 spaCy 大显身手的地方。
现在,spaCy 甚至通过spacy-llm模块让您能够结合其与大型模型(如 ChatGPT)的优势。这是一种获得速度和力量的好方法。
安装 Spacy
将以下命令复制并粘贴以使用 pip 安装 spaCy。
在以下单元格中,将“&ndash”替换为“-”。
python &ndashm venv. env
source .env/bin/activate
pip install &ndashU pip setuptools wheel
pip install &ndashU spacy
SpaCy 没有附带统计语言模型,这是在特定语言上执行操作所需的。对于每种语言,都有许多基于构建模型所使用的资源大小而构建的模型。
支持的所有语言都列在这里:spacy.io/usage/models
您可以通过命令行下载语言模型。在这个例子中,我正在下载英语语言模型。
python &ndashm spacy download en_core_web_sm
到目前为止,您已经准备好使用 load()功能使用该模型。
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("This is a text example I want to analyze")
SpaCy 管道
当你在 spaCy 中加载一个语言模型时,它会通过一个您可以定制的管道处理您的文本。这个管道由各种组件组成,每个组件处理一个特定的任务。其核心是分词器,它将文本分解成单个标记(单词、标点等)。
这个管道的结果是一个Doc对象,它是进一步分析的基础。根据您想要实现的目标,可以包含其他组件,如 Tagger(用于词性标注)、Parser(用于依存句法分析)和 NER(用于命名实体识别)。我们将在接下来的文章中看到 Tagger、Parser 和 NER 的含义。

管道(图片由作者提供)
为了创建一个 doc 对象,您可以简单地执行以下操作。
import spacy
nlp = spacy.load("en_core_web_md")
doc = nlp("My name is Marcello")
我们将熟悉 spaCy 提供的更多容器对象。
spaCy 的核心数据结构是 Language 类、Vocab 和 Doc 对象。
通过检查文档,您将找到容器对象的完整列表。

来自 spaCy 文档
使用 spaCy 进行分词
在 NLP 中,处理文本的第一步是分词。这是至关重要的,因为所有后续的 NLP 任务都依赖于对分词的处理。分词是句子可以分解成的最小有意义的文本单元。直观地,您可能会认为分词是由空格分隔的单独单词,但这并不简单。
分词通常依赖于统计模式,其中经常一起出现的字符组被视为单个分词以进行更好的分析。
您可以在 hugging face space 上尝试不同的分词器:huggingface.co/spaces/Xenova/the-tokenizer-playground
当我们在 spaCy 中对某些文本应用 nlp()时,文本会自动分词。让我们看看一个例子。
doc = nlp("My name is Marcello Politi")
for token in doc:
print(token.text)

图片由作者提供
从例子来看,这似乎是一个简单的使用 text.split(“”)进行的分割。那么让我们尝试对更复杂的句子进行分词。
doc = nlp("I don't like cooking, I prefer eating!!!")
for i, token in enumerate(doc):
print(f"Token {i}:",token.text)

图片由作者提供
SpaCy 的分词器是基于规则的,这意味着它使用语言规则和模式来确定如何分割文本。它不基于像现代 LLMs 那样的统计方法。
有趣的是,规则是可定制的;这给了您对分词过程的完全控制。
此外,spaCy 分词器是非破坏性的,这意味着您可以从分词中恢复原始文本。
让我们看看如何自定义分词器。为了实现这一点,我们只需要为我们的分词器定义一条新规则,我们可以通过使用特殊的 ORTH 符号来完成。
import spacy
from spacy.symbols import ORTH
nlp = spacy.load("en_core_web_sm")
doc = nlp("Marcello Politi")
for i, token in enumerate(doc):
print(f"Token {i}:",token.text)

图片由作者提供
我想以不同的方式分词单词“Marcello”。
special_case = [{ORTH:"Marce"},{ORTH:"llo"}]
nlp.tokenizer.add_special_case("Marcello", special_case)
doc = nlp("Marcello Politi")
for i, token in enumerate(doc):
print(f"Token {i}:",token.text)

图片由作者提供
在大多数情况下,默认的分词器表现良好,很少有人需要修改它,通常只有研究人员会这样做。
将文本分割成分词比将段落分割成句子更容易。SpaCy 能够通过使用依赖分析器来完成这项任务;您可以在文档中了解更多关于它的信息。但让我们看看它在实际中是如何工作的。
import spacy
nlp = spacy.load("en_core_web_sm")
text = "My name is Marcello Politi. I like playing basketball a lot!"
doc = nlp(text)
for i, sent in enumerate(doc.sents):
print(f"sentence {i}:", sent.text)
spaCy 的词元化
单词/分词可以有不同的形式。词元是单词的基本形式。例如,“dance”是“dancing”、“danced”、“dancer”、“dances”等单词的词元。
当我们将单词还原到其基本形式时,我们正在应用词元化。

词元化(图片由作者提供)
在 SpaCy 中,我们可以轻松访问单词的词元。查看以下代码。
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("I like dancing a lot, and then I love eating pasta!")
for token in doc:
print("Text :", token.text, "--> Lemma :", token.lemma_)

图片由作者提供
最后的想法
总结本篇 spaCy 系列的第一个部分,我分享了让我对这个 NLP 工具着迷的基础知识。
我们介绍了 spaCy 的设置、加载语言模型以及深入挖掘分词和词元化,这些是使文本处理感觉不像黑盒的主要步骤。
与那些如 ChatGPT 这样的大型模型相比,spaCy 的轻量级和快速方法非常适合许多项目,尤其是在需要额外功能时,还可以通过 spacy-llm 选项使用那些大型模型!
在下一部分,我将向您展示我是如何使用 spaCy 的命名实体识别和依存句法分析来处理现实世界的文本任务的。请继续关注第二部分,它将更加注重实践操作!

浙公网安备 33010602011771号