我正在从事一个用于情感分析的 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