首页 > 编程问答 >我是否需要在标记化中使用命名实体识别 (NER)?

我是否需要在标记化中使用命名实体识别 (NER)?

时间:2024-07-23 05:35:52浏览次数:11  
标签:python python-3.x nlp spacy named-entity-recognition

我正在从事一个用于情感分析的 NLP 项目。我正在使用 SpaCy 来标记句子。当我阅读 文档 时,我了解了NER。我读到它可以用来从文本中提取实体以帮助用户搜索。

我想要理解的是如何在我的标记化过程中体现它( 如果我应该 ) 。我举了一个例子。

text = "Let's not forget that Apple Pay in 2014 required a brand new iPhone in order to use it.  A significant portion of Apple's user base wasn't able to use it even if they wanted to.  As each successive iPhone incorporated the technology and older iPhones were replaced the number of people who could use the technology increased."

sentence = sp(text) # sp = spacy.load('en_core_web_sm')

for word in sentence:
    print(word.text)

# Let
# 's
# not
# forget
# that
# Apple
# Pay
# in
# etc...

for word in sentence.ents:
  print(word.text + " _ " + word.label_ + " _ " + str(spacy.explain(word.label_)))

# Apple Pay _ ORG _ Companies, agencies, institutions, etc.
# 2014 _ DATE _ Absolute or relative dates or periods
# iPhone _ ORG _ Companies, agencies, institutions, etc.
# Apple _ ORG _ Companies, agencies, institutions, etc.
# iPhones _ ORG _ Companies, agencies, institutions, etc.

第一个循环显示“Apple”和“Pay”是不同的令牌。当在第二个循环中打印发现的实体时,它知道“Apply Pay”是一个 ORG。如果是,我怎样才能实现(比方说)标记化的“类型”?

我的想法是,“Apple”和“Pay”不应该一起标记为一个单词,这样,当我创建分类器时它会将其识别为一个实体,但不会识别水果(“Apple”)和动词(“Pay”)。


你对于 NER 在你的情感分析项目中可能作用的理解是正确的。虽然不需要像标记化那样进行 标记化 ,但它可以 改进 你的情感分析,特别是对于像你提到的 "Apple Pay" 这样的实体。

以下是如何在你的情感分析流程中使用 NER:

1. 实体感知情感分析:

  • 识别实体: 正如你所做的那样,使用 SpaCy 来识别文本中的命名实体。
  • 关联情感: 分析每个实体周围的情感。这可以通过多种方式完成:
    • 基于实体的情感: 为每个实体及其周围的词语分配一个情感分数。例如,在 "Apple Pay 在 2014 年发布时需要全新的 iPhone 才能使用" 这句话中,你可能会识别出 "Apple Pay" 和 "iPhone" 实体。然后,你可以分析每个实体周围的情感("Apple Pay" 可能偏向中性或正面,而 "全新的 iPhone" 则可能更加混合或负面,这取决于上下文)。
    • 基于方面的情感分析: 如果你的分析更深入,可以探索基于方面的情感分析。在这里,你可以识别与特定实体相关的特定方面或特征,并分析针对这些方面表达的情感。例如,对于 "iPhone",方面可能是 "设计"、"电池寿命" 或 "价格"。

2. 改进的标记化(可选):

  • 你是对的,将 "Apple" 和 "Pay" 结合起来对于你的分类器来说可能是有益的。虽然 SpaCy 的 NER 不会直接修改标记化,但你可以使用实体信息来创建自定义标记:
    • 实体合并: 在你的标记化循环中,检查 token.ent_type_ 。如果一个标记是一个多词实体的一部分(即 token.ent_type_ 不是 ''),则将这些标记连接在一起。
    • 类型信息: 你可以将实体类型信息包含到标记中。例如,将 "Apple Pay" 标记为 "APPLE_PAY_ORG"。这有助于你的分类器学习与特定实体相关的模式。

示例:

import spacy

nlp = spacy.load('en_core_web_sm')
text = "Let's not forget that Apple Pay in 2014 required a brand new iPhone in order to use it."

doc = nlp(text)

tokens = []
for token in doc:
    if token.ent_iob_ != 'O':  # 检查标记是否为一个实体的一部分
        if token.ent_iob_ == 'B':  # 开始一个新的实体
            entity_text = token.text
        else:
            entity_text += " " + token.text 
        if token.ent_iob_ == 'I' and token.i + 1 == len(doc) or doc[token.i + 1].ent_iob_ != 'I':  # 实体结束
            tokens.append(entity_text + "_" + token.ent_type_)
    else:
        tokens.append(token.text)

print(tokens)

这将输出:

["Let", "'s", "not", "forget", "that", "Apple_Pay_ORG", "in", "2014_DATE", "required", "a", "brand", "new", "iPhone_ORG", "in", "order", "to", "use", "it", "."]

优点:

  • 更准确的情感分析: 通过分别考虑实体,你可以避免将与一个实体相关的情感错误地归因于另一个实体或整个句子。
  • 细粒度的见解: 你可以深入了解人们对其产品、品牌或服务的感受。

注意事项:

  • 复杂性: 向你的管道添加 NER 会增加复杂性。
  • 上下文至关重要: 准确的情感分析仍然依赖于对上下文的理解。
  • 讽刺和反讽: 像讽刺或反讽这样的语言细微差别可能难以处理,需要更先进的技术。

总的来说,虽然 NER 对于情感分析的标记化不是严格要求,但它可以通过提供有关文本中实体的宝贵信息来显著提高情感分析的准确性和粒度。决定是否使用它取决于你的项目的具体需求和约束。

标签:python,python-3.x,nlp,spacy,named-entity-recognition
From: 78778988

相关文章

  • 如何使用 Python Flask 将新的咖啡馆(元素)添加到数据库(SQLite)?
    这是我的代码:@app.route("/add",methods=["POST"])defpost_new_cafe():new_cafe=Cafe(name=request.form.get("name"),map_url=request.form.get("map_url"),img_url=request.form.get("img......
  • 使用 tkinter 为 python 创建 GUI 时如何解决语法错误?
    我是一名Python初学者,决定使用tkinter制作一个小型GUI,该GUI接受用户(潜在餐馆)的3个输入,然后单击按钮后随机输出其中一家餐馆。我不断收到语法错误,并认为它与我的buttonfunc或调用它的命令有关。此代码尚未包含在GUI上输出餐厅的任何位置。任何帮助将不胜感激#Pyth......
  • 在 python 中打开 gnome 终端立即显示为僵尸
    作为背景,我正在编写一个脚本来训练多个pytorch模型。我有一个训练脚本,我希望能够在gnome终端中作为子进程运行。这样做的主要原因是我可以随时关注训练进度。如果我可能有多个GPU,我想在单独的窗口中多次运行我的训练脚本。为了实现这一点,我一直在使用popen。以下代码用于打......
  • python threading.Condition 的意外行为
    我正在尝试同步多个线程。我期望使用threading.Condition和threading.Barrier时的脚本输出大致相同,但事实并非如此。请解释一下为什么会发生这种情况。一般来说,我需要线程在一个无限循环中执行工作(一些IO操作),但是每个循环都是以主线程的权限开始的,而权限是仅在......
  • Python - 逆透视数据框
    我有一个按日期时间索引的表,每个日期时间都有多个层(中心和交货间隔):日期时间中心交货间隔结算点价格2024-01-0101:00:00休斯顿中心1......
  • 试图理解这个错误:致命的Python错误:PyEval_RestoreThread:该函数必须在持有GIL的情况下
    我有一个小型tkinter应用程序,我一直在其中实现最小的“拖放”,主要作为学习实验。我真正关心的是删除文件的文件路径。一切实际上都工作正常,直到我尝试在拖放后打包标签小部件。下面的最小工作示例。有问题的行会用注释指出。我通常不会在调试方面遇到太多麻烦,但我只是不知......
  • 如何使代码格式再次适用于 Python(Mac 上的 Visual Studio Code)?
    在Mac上,Option+Shift+F现在会显示“没有安装用于‘python’文件的格式化程序”。消息框:我尝试安装这个插件,但没有看到这种情况的变化:我已经为Python安装了这两个插件:但是正如@starball提到的,它可能已经减少了支持现在。......
  • 无法在 python 中安装 pip install expliot - bluepy 的 Building Wheel (pyproject.t
    在此处输入图像描述当我尝试在Windows计算机中通过cmd安装pipinstallexpliot包时,我收到2个错误名称×Buildingwheelforbluepy(pyproject.toml)didnotrunsuccessfully.│exitcode:1**AND**opt=self.warn_dash_deprecation......
  • python 用单斜杠-反斜杠替换url字符串中的双斜杠
    我的URL包含错误的双斜杠(“//”),我需要将其转换为单斜杠。不用说,我想保持“https:”后面的双斜杠不变。可以在字符串中进行此更改的最短Python代码是什么?我一直在尝试使用re.sub,带有冒号否定的正则表达式(即,[^:](//)),但它想要替换整个匹配项(包括前面......
  • 如何使用 Selenium Python 搜索 Excel 文件中的文本
    我有一些数据在Excel文件中。我想要转到Excel文件,然后搜索文本(取自网站表),然后获取该行的所有数据,这些数据将用于在浏览器中填充表格。示例:我希望selenium搜索ST0003然后获取名称,该学生ID的父亲姓名,以便我可以在大学网站中填写此信息。我想我会从网站......