当前位置:   article > 正文

(6-3)语义分析与理解算法:命名实体识别(NER)_ner提取出文本中有电话号码的行

ner提取出文本中有电话号码的行

6.3  命名实体识别(NER)

命名实体识别(NER,Named Entity Recognition)是自然语言处理(NLP)中的一项重要任务,它旨在从文本中识别和分类命名实体,如人名、地名、组织名、日期、货币、百分比等。

6.3.1  命名实体识别介绍

命名实体识别(NER)是自然语言处理(NLP)中的一项任务,旨在从文本中识别和分类具有特定名称的实体,例如人名、地名、组织名、日期、时间、货币、百分比、专有名词等。NER 的目标是将文本中的实体定位并分配给预定义的类别,通常包括以下主要类别:

  1. 人名(PERSON):包括人的名字,如"John Smith"。
  2. 地名(LOCATION):包括城市、国家、地区等地点的名称,如"New York"。
  3. 组织名(ORGANIZATION):包括公司、政府机构、学校等组织的名称,如"Google"。
  4. 日期(DATE):包括日期、时间的表达,如"2023年10月31日"。
  5. 货币(MONEY):包括货币单位和金额,如"100美元"。
  6. 百分比(PERCENT):包括百分比值,如"50%"。

NER 任务是对文本进行结构化处理的一部分,它有助于计算机理解文本中的重要信息并提取有用的数据。NER 在许多自然语言处理应用中都起着关键作用,主要包括:

  1. 信息抽取:从大规模文本中提取关键信息。
  2. 问答系统:帮助回答与特定实体相关的问题。
  3. 机器翻译:确保在翻译中保留命名实体的一致性。
  4. 情感分析:分析用户评论中的情感与实体关系。
  5. 语音识别:将语音转换为文本并识别其中的实体。

NER 通常通过使用标记预定义实体的训练数据来进行模型训练。一旦训练好的模型可以识别文本中的命名实体,它可以自动标记文本中的实体并将它们分类到相应的类别中。这有助于加速信息提取和语义理解任务。

6.3.2  基于规则的NER方法

基于规则的命名实体识别(NER)方法使用一组事先定义的规则和模式来识别文本中的命名实体,这些规则和模式可以根据特定领域的知识和需求来定义,通常包括实体的名称、上下文、语法结构等信息。基于规则的NER方法通常不需要大规模的标记数据进行训练,因此在某些场景下是一种有效的解决方案。

在实际应用中,常见的基于规则的NER方法如下所示:

  1. 字典匹配:建立一个实体词典,包含各种命名实体的名称。然后,通过在文本中查找字典中的匹配项来标识实体。这种方法适用于已知实体名称的场景。
  2. 正则表达式:使用正则表达式模式来匹配文本中的实体。例如,可以使用正则表达式模式来匹配日期、时间、电子邮件地址等。
  3. 语法规则:使用语法分析和依存关系分析来识别实体。这种方法涉及到分析文本的语法结构,以识别包含实体信息的短语或句子。
  4. 上下文规则:根据实体的上下文信息来识别实体。例如,可以定义规则来捕捉“在公司名称后面的人名是员工名”的情况。
  5. 模板匹配:定义匹配模板,这些模板描述了实体的常见结构和模式。例如,人名通常由名字和姓氏组成,可以使用模板匹配来捕捉这种结构。

例如下面是一个基于规则的NER方法的简单例子,用于从文本中提取日期信息。在这个例子中,将使用正则表达式来匹配文本中的日期模式。

实例6-3:基于正则表达式的日期模式匹配(源码路径:daima\6\gui.py

实例文件gui.py的具体实现代码如下所示。

  1. import re
  2. # 定义一个包含日期模式的正则表达式
  3. date_pattern = r'\d{1,2}/\d{1,2}/\d{2,4}'
  4. # 输入文本
  5. text = "请于2023年10月31日前完成任务。下次会议定于11/15/23举行。"
  6. # 使用正则表达式匹配日期
  7. matches = re.finditer(date_pattern, text)
  8. # 提取匹配的日期
  9. for match in matches:
  10. start, end = match.span()
  11. date_str = text[start:end]
  12. print("匹配的日期:", date_str)

在上述代码中,首先定义了一个日期模式的正则表达式,该模式匹配日期格式,例如"10/31/2023"或"11/15/23"。然后,我们提供了一个包含日期信息的输入文本。使用re.finditer函数搜索文本以查找与日期模式匹配的文本,然后提取匹配的日期并打印出来。执行后会输出

匹配的日期: 11/15/23

在这个例子中,基于规则的NER方法是基于正则表达式的日期模式匹配,用于从文本中提取日期信息。类似的方法可以用于匹配其他类型的命名实体,例如电子邮件地址、电话号码等,根据特定的模式和规则定义正则表达式。这种方法特别适用于识别具有已知结构的实体。

注意:基于规则的NER方法的主要优点是可以根据具体任务和领域的需求进行定制,而不需要大量的标记数据。然而,基于规则的NER方法的性能通常不如基于深度学习的NER方法,尤其是在大规模和多领域的情况下。因此,在一些应用中,基于规则的NER方法可能需要与其他方法结合使用,以提高准确性和鲁棒性。

6.3.3  基于机器学习的NER方法

基于机器学习的命名实体识别(NER)方法使用机器学习算法来从文本中自动识别和分类命名实体。这些方法通常需要大规模的标记数据进行训练,以学习如何有效地识别各种类型的实体。

使用基于机器学习的NER方法的一般步骤如下:

(1)数据标注:准备一个包含文本和标记命名实体的训练数据集。标记数据通常包括实体的类型(例如人名、地名、组织名)以及实体在文本中的起始和结束位置。

2)特征提取:从文本中提取各种特征,以供机器学习模型使用。这些特征可以包括词性、词形、上下文信息、依存关系等。

3)模型选择:选择适当的机器学习模型,例如条件随机场(CRF)、循环神经网络(RNN)、长短时记忆网络(LSTM)、卷积神经网络(CNN)或Transformer。这些模型可以用于序列标注任务,如NER。

4)模型训练:使用标记数据集来训练所选的机器学习模型。模型学习如何从特征中识别实体,并在文本中标记命名实体的位置。

5)评估和调优:使用验证集来评估模型的性能,根据性能指标(如精度、召回率、F1得分)进行调优。

6)模型应用:使用训练好的NER模型来识别未标记文本中的命名实体。

基于机器学习的NER方法通常在大规模文本数据上表现出色,可以应用于多领域和多语言的任务。这些方法的性能取决于训练数据的质量和数量,以及所选择的模型的类型和参数。

例如下面是一个基于机器学习的命名实体识别(NER)方法的例子,使用CRF(条件随机场)作为机器学习模型,并使用NLTK库进行文本处理。

实例6-4:训练一个基于机器学习的NER模型(源码路径:daima\6\ji.py

实例文件ji.py的具体实现代码如下所示。

  1. import nltk
  2. import sklearn
  3. from sklearn_crfsuite import CRF
  4. from sklearn.model_selection import train_test_split
  5. from sklearn.metrics import classification_report
  6. # 使用NLTK加载示例数据
  7. nltk.download('conll2002')
  8. from nltk.corpus import conll2002
  9. # 加载数据集
  10. data = conll2002.iob_sents()
  11. # 准备特征提取函数
  12. def word2features(sent, i):
  13. word = sent[i][0]
  14. features = {
  15. 'word.lower()': word.lower(),
  16. 'word[-3:]': word[-3:],
  17. 'word[-2:]': word[-2:],
  18. 'word.isupper()': word.isupper(),
  19. 'word.istitle()': word.istitle(),
  20. 'word.isdigit()': word.isdigit(),
  21. }
  22. if i > 0:
  23. prev_word = sent[i-1][0]
  24. features.update({
  25. 'prev_word.lower()': prev_word.lower(),
  26. 'prev_word.isupper()': prev_word.isupper(),
  27. })
  28. else:
  29. features['BOS'] = True # Beginning of sentence
  30. if i < len(sent) - 1:
  31. next_word = sent[i+1][0]
  32. features.update({
  33. 'next_word.lower()': next_word.lower(),
  34. 'next_word.isupper()': next_word.isupper(),
  35. })
  36. else:
  37. features['EOS'] = True # End of sentence
  38. return features
  39. def sent2features(sent):
  40. return [word2features(sent, i) for i in range(len(sent))]
  41. def sent2labels(sent):
  42. return [label for word, pos, label in sent]
  43. # 特征提取和标签准备
  44. X = [sent2features(s) for s in data]
  45. y = [sent2labels(s) for s in data]
  46. # 拆分数据集
  47. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  48. # 训练CRF模型
  49. crf = CRF(c1=0.1, c2=0.1)
  50. crf.fit(X_train, y_train)
  51. # 预测
  52. y_pred = crf.predict(X_test)
  53. # 评估模型性能
  54. report = classification_report(y_test, y_pred)
  55. print(report)

在上述代码中,使用库NLTK加载了CoNLL 2002示例数据,其中包含有标记的西班牙语句子,每个词都带有其命名实体标签。我们定义了特征提取函数来从每个词中提取特征,包括词本身、词形、大小写等信息。然后,我们使用这些特征来训练CRF模型,以便识别命名实体。最后,我们对模型进行评估并打印性能报告。执行后会输出性能报告:

  1. precision recall f1-score support
  2. B-LOC 0.92 0.93 0.92 1084
  3. B-MISC 0.78 0.71 0.74 339
  4. B-ORG 0.85 0.80 0.82 1400
  5. B-PER 0.94 0.91 0.92 735
  6. I-LOC 0.86 0.81 0.83 147
  7. I-MISC 0.81 0.49 0.61 339
  8. I-ORG 0.84 0.80 0.82 891
  9. I-PER 0.94 0.95 0.94 634
  10. O 0.99 0.99 0.99 35351
  11. accuracy 0.97 40930
  12. macro avg 0.87 0.81 0.84 40930
  13. weighted avg 0.97 0.97 0.97 40930

这个性能报告包括了精确度(precision)、召回率(recall)、F1得分等指标,分别针对每个NER类别进行了评估。在实际应用中,你可以根据具体的数据集和任务来解释和利用这些性能指标。模型的性能将取决于数据、特征工程和模型选择的质量。

注意:近年来,深度学习方法,尤其是使用预训练的语言模型(如BERT、GPT)进行微调的方法,已经在NER任务中取得了显著的成功,因为它们可以学习更复杂的文本表示和上下文信息,从而提高NER的准确性。这些方法通常在大型语料库上进行预训练,并在NER任务中微调,以适应特定领域和语言的需求。

未完待续

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号