基于Python的自然语言处理系列(29):spaCy + Pipeline

打印 上一主题 下一主题

主题 1118|帖子 1118|积分 3354

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 先容

        在前面的文章中,我们先容了如何利用 spaCy 进行基本的自然语言处理任务,如分词、词性标注、定名实体辨认等。spaCy 强盛的地方在于它的流水线(Pipeline)机制,这使得全部的处理都可以被模块化和自动化。流水线本质上是一系列管道(Pipes),这些管道用于逐步处理文本并提取信息。在本篇文章中,我们将具体探究 spaCy 的流水线机制,并学习如何创建和自定义本身的管道。
什么是 Pipeline?

        Pipeline 是一组管道(Pipes)的顺序组合,每个管道负责处理数据的一部分,输出传递给下一个管道。en_core_web_X 中的预练习模型已经包罗了多个常见的管道,比如分词(Tokenization)、句子分别(Sentencizer)、词性标注(POS Tagging)和定名实体辨认(NER)等。
        更好的是,spaCy 答应我们添加、练习和定制管道以顺应具体需求!在本文中,我们起首会检查预练习模型中的流水线结构,然后逐步创建本身的流水线。
2. 检查预构建 Pipeline

        起首,让我们加载 spaCy 中的小型英文模型 en_core_web_sm,并检察此中的管道。
  1. import spacy
  2. nlp = spacy.load("en_core_web_sm")
复制代码
        利用 analyze_pipes() 方法可以表现当前流水线中各个管道的具体信息,包罗每个管道的名称及其处理顺序。
  1. analysis = nlp.analyze_pipes(pretty=True)
  2. print(analysis)
复制代码
        每个管道的实行顺序对于处理结果有偏重要的影响,稍后我们将看到如何自定义这些管道的顺序。
3. 如何添加预构建的管道

        在许多环境下,利用预构建的 spaCy 模型可能满意不了特定需求。比方,你可能只必要一个简单的管道(如句子分割器),不必要包罗全部默认管道。此时,我们可以通过创建一个空缺模型并向其添加所需的管道来实现目标。
3.1 创建空缺模型并添加管道

        我们可以从一个空缺的 spaCy 模型开始,并为其添加 sentencizer 管道,这只负责句子分别。
  1. nlp = spacy.blank("en")
  2. nlp.add_pipe('sentencizer')
  3. # 查看管道
  4. nlp.analyze_pipes(pretty=True)
复制代码
        接着,我们可以利用这个简单的模型处理文本:
  1. with open ("data/wiki_us.txt", "r") as f:
  2.     text = f.read()
  3. doc = nlp(text)
  4. print(len(list(doc.sents)))
复制代码
3.2 与 en_core_web_sm 的对比

        现在我们加载预构建的 en_core_web_sm 模型并实行同样的句子分别操作,比力处理时间。
  1. nlp2 = spacy.load("en_core_web_sm")
  2. nlp2.max_length = 5278439  # 增加文本处理的最大长度
  3. # 处理文本
  4. doc2 = nlp2(text)
  5. print(len(list(doc2.sents)))
复制代码
        我们会发现空缺模型加上句子分割器的处理速度明显更快。因此,定制模型可以根据需求明显提升性能。
4. 利用 EntityRuler 添加规则

        spaCy 提供了一种基于规则的定名实体辨认(NER)方式,称为 EntityRuler。EntityRuler 答应我们定义一组模式,并通过这些模式自动标注实体。
4.1 基本利用

        我们起首加载一个预构建的小型模型,并实行对样本文本进行实体辨认:
  1. import spacy
  2. nlp = spacy.load("en_core_web_sm")
  3. text = "Asian Institute of Technology, founded in 1959, situated 40km north of Bangkok, Thailand, near Rangsit ."doc = nlp(text)# 提取实体for ent in doc.ents:    print(ent.text, ent.label_)
复制代码
4.2 添加新的规则

        现在我们通过 EntityRuler 教会模型辨认新的实体。在本例中,我们将告诉模型将“Rangsit”辨认为一个地点(LOC),而不是默认的地理政治实体(GPE):
  1. # 添加 EntityRuler 管道
  2. ruler = nlp.add_pipe("entity_ruler")
  3. # 定义规则
  4. patterns = [{"label": "LOC", "pattern": "Rangsit"}]
  5. ruler.add_patterns(patterns)
  6. # 处理文本
  7. doc = nlp(text)
  8. # 提取实体
  9. for ent in doc.ents:
  10.     print(ent.text, ent.label_)
复制代码
        实行上述代码后,如果结果没有变革,这是因为 EntityRuler 被添加到了流水线的末尾,默认环境下 NER 管道已经标注了全部实体。因此,我们必要调整流水线的顺序。
4.3 调整管道顺序

        我们可以将 EntityRuler 放到 NER 之前,以确保它优先实行:
  1. nlp = spacy.load("en_core_web_sm")
  2. ruler = nlp.add_pipe("entity_ruler", before="ner")
  3. ruler.add_patterns(patterns)
  4. # 查看管道顺序
  5. nlp.analyze_pipes(pretty=True)
复制代码
        此时,EntityRuler 被正确添加到 NER 之前,运行结果将如预期一样。
5. 复杂的 EntityRuler 利用

    EntityRuler 支持复杂的规则匹配,包罗利用正则表达式等。在下面的例子中,我们将辨认电话号码。
  1. import spacy
  2. nlp = spacy.blank("en")
  3. ruler = nlp.add_pipe("entity_ruler")
  4. patterns = [{"label": "PHONE_NUMBER", "pattern": [{"ORTH": "("}, {"SHAPE": "ddd"}, {"ORTH": ")"}, {"SHAPE": "ddd"}, {"ORTH": "-", "OP": "?"}, {"SHAPE": "dddd"}]}]
  5. ruler.add_patterns(patterns)
  6. text = "This is a sample number (555) 555-5555."
  7. doc = nlp(text)
  8. for ent in doc.ents:
  9.     print(ent.text, ent.label_)
复制代码
6. 利用 Matcher 进行匹配

        除了 EntityRuler,spaCy 还提供了 Matcher 用于模式匹配。我们可以通过 Matcher 提取符合特定模式的文本片段。以下是一个简单的例子,提取电子邮件地址:
  1. from spacy.matcher import Matcher
  2. nlp = spacy.load("en_core_web_sm")
  3. matcher = Matcher(nlp.vocab)
  4. # 匹配电子邮件地址
  5. pattern = [{"LIKE_EMAIL": True}]
  6. matcher.add("EMAIL_ADDRESS", [pattern])
  7. doc = nlp("This is an email address: wmattingly@aol.com")
  8. matches = matcher(doc)
  9. for match_id, start, end in matches:
  10.     print(doc[start:end].text)
复制代码
    Matcher 还可以通过指定词性等特性来进行更复杂的匹配。
   结语

          在这篇文章中,我们深入探究了 spaCy 的 Pipeline 机制,并通过实例演示了如何创建和自定义管道。通过把握 spaCy 的流水线结构,我们不仅能够利用现有的功能进行高效的自然语言处理,还可以根据项目需求添加、修改或优化各类管道组件,如 EntityRuler 和 Matcher 等。通过这些功能,我们能够快速、精准地处理各种文本数据,尤其是在必要复杂的模式匹配或规则定义时,spaCy 为我们提供了极大的灵活性。
          除了 Pipeline 的基础知识外,我们还探索了如何通过简单的规则和预定义的模式来优化定名实体辨认和文本匹配,这些方法在处理特定领域或定制任务时非常实用。通过合理组合规则匹配和预练习模型的强盛能力,你可以有效提升模型的表现,并加速处理流程。
          在下一篇文章中,我们将继续探究更高级的 Pipeline 定制方法,特殊是如何结合正则表达式(Regex)与自定义管道(Custom Pipeline)来实现更加复杂的文本处理需求。正则表达式的强盛之处在于它能够灵活匹配复杂的文本模式,而与 spaCy 的自定义管道结合利用时,能够进一步扩展 spaCy 的应用场景。通过学习这些内容,你将能够构建出功能强盛的 NLP 解决方案,并更好地应对多样化的文本处理挑战。
          接待继续关注我们的系列文章,让我们一起深入探索自然语言处理的更多可能性!
  
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
接待关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢各人的支持!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表