比较开源Python的工作-用于识别命名实体的库

介绍


我们公司的工作人员正在创建一项服务,使您可以自动创建,管理和安全存储自由职业者与其客户之间的许可协议和其他协议。

为了解决这个问题,我尝试了自然语言处理领域的数十种解决方案,包括开放源代码解决方案,并希望与开放源代码Python共享我的经验-用于识别命名实体的库。

公认的命名实体


关于问题本身的几句话。命名实体识别(NER)是人类语言处理技术的一种分支,其软件实现使人们可以查找语音和文本中的客观词和短语类别。最初,这些是地理名称,人员名称,组织,地址,但是现在这个概念已得到很大扩展,借助NER,我们正在文本中查找相对和绝对日期,数字,数字等。
命名实体的识别是通向人类语言的“门户”,它使您可以识别和处理一个人的意图,以建立他的言语与真实世界之间的联系。


语言不平等


首先,我想提请注意针对不同语言的软件解决方案中明显的不平等。因此,大多数开发(包括由俄罗斯程序员创建的开发)都使用英语。为Bahasa,Hindi或阿拉伯语查找现成的模型是一项不感恩的任务。

欧洲语言至少是最受欢迎的图书馆中的代表;非洲语言在现代自然语言处理中原则上不存在。同时,根据我自己的经验,我知道非洲大陆是一个巨大而丰富的市场,这种态度很可能是市场的惯性。

俄语有多种解决方案,其质量令人惊讶,但是,它们并不像“建造”用于处理英语的发达图书馆那样具有商业力量和学术潜力。

要处理的文字


我从不同的来源那里获得了一些建议,并将它们组合成某种催眠性文字,以测试所选库的工作效果。

english_text = ''' I want a person available 7 days and with prompt response all most every time. Only Indian freelancer need I need PHP developer who have strong experience in Laravel and Codeigniter framework for daily 4 hours. I need this work by Monday 27th Jan. should be free from plagiarism . 
Need SAP FICO consultant for support project needs to be work on 6 months on FI AREAWe.  Want a same site to be created as the same as this https://www.facebook.com/?ref=logo, please check the site before contacting to me and i want this site to be ready in 10 days. They will be ready at noon tomorrow .'''

russian_text = '''   110     ,     .        https://www.sobyanin.ru/  , 1 .     .51 (   :  , )  ?     2107   47     24,    . 
 c        10  1970 ,     -, . ,  5/1 8 000 ( )  00  .               .              - .'''



NLTK库


NLTK是用于自然语言处理的经典库,它易于使用,不需要长期学习,并且可以解决学生的问题时执行99%的任务。
import nltk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('maxent_ne_chunker')
nltk.download('words')
for sent in nltk.sent_tokenize(english_text):
   for chunk in nltk.ne_chunk(nltk.pos_tag(nltk.word_tokenize(sent))):
      if hasattr(chunk, 'label'):
         print(chunk)

输出: 如我们所见,NLTK做得很好,但是为了使结果更“丰富”,我们将必须训练我们自己的标记器(或从相当广泛的列表中选择另一个)。但是,如果有更简单的解决方案,那么在2020年值得吗?
(GPE Indian/JJ)
(ORGANIZATION PHP/NNP)
(GPE Laravel/NNP)
(PERSON Need/NNP)
(ORGANIZATION SAP/NNP)
(ORGANIZATION FI/NNP)




斯坦福大学


图片

扩展NLTK功能的一种方法是将Stanford CoreNLP的经典Java库与经典Python库一起使用。质量要求相对较低,因此可以显着提高质量。
from nltk.tag.stanford import StanfordNERTagger
jar = "stanford-ner-2015-04-20/stanford-ner-3.5.2.jar"
model = "stanford-ner-2015-04-20/classifiers/" 
st_3class = StanfordNERTagger(model + "english.all.3class.distsim.crf.ser.gz", jar, encoding='utf8') 
st_4class = StanfordNERTagger(model + "english.conll.4class.distsim.crf.ser.gz", jar, encoding='utf8') 
st_7class = StanfordNERTagger(model + "english.muc.7class.distsim.crf.ser.gz", jar, encoding='utf8')
for i in [st_3class.tag(english_text.split()), st_4class.tag(english_text.split()), st_7class.tag(english_text.split())]:
  for b in i:
    if b[1] != 'O':
        print(b)

输出: 正如我们所看到的,输出质量已得到显着改善,现在,考虑到速度和易用性,NLTK很明显也非常适合工业应用。
('PHP', 'ORGANIZATION')
('Laravel', 'LOCATION')
('Indian', 'MISC')
('PHP', 'ORGANIZATION')
('Laravel', 'LOCATION')
('Codeigniter', 'PERSON')
('SAP', 'ORGANIZATION')
('FICO', 'ORGANIZATION')
('PHP', 'ORGANIZATION')
('Laravel', 'LOCATION')
('Monday', 'DATE')
('27th', 'DATE')
('Jan.', 'DATE')
('SAP', 'ORGANIZATION')



空间



图片

Spacy是用于自然语言处理的开源Python库,它以MIT许可证(!)发行,由开发公司Explosion的创始人Matthew Hannibal和Ines Montany创建和开发。
通常,每个需要解决一些处理自然语言问题的人都将早晚学习此库。大多数功能都是“开箱即用”的;开发人员请注意该库易于使用。
Space提供了18个标记命名实体的标签,以及重新训练自己模型的简单方法。在此处添加出色的文档,庞大的社区和良好的支持-这将清楚为什么这种解决方案在最近几年变得如此流行。

import spacy
model_sp = en_core_web_lg.load()
for ent in model_sp(english_text).ents:
  print(ent.text.strip(), ent.label_)

输出: 如您所见,结果要好得多,并且代码也更简单易懂。工作的弊端–大量的模型,操作缓慢,相对不合逻辑的“标签”,缺少包括俄语在内的许多语言的模型(尽管有多语言模型)。
7 days DATE
New York GPE
Indian NORP
Laravel LOC
Codeigniter NORP
4 hours TIME
Monday 27th Jan. DATE
FICO ORG
6 months DATE
10 days DATE
noon TIME
tomorrow DATE
Iceland GPE



天才


图片

Flair在主题领域提供了更深层次的浸入,创建了该库,实际上,对于解决研究问题而言,文档还不错,但是由于某些故障,它与大量其他库,清晰,逻辑和可读的代码集成在一起。
图书馆拥有发达的社区,并且不仅面向英语,由于可用的模型很多,Flair在选择语言方面比Spacy更加民主。
from flair.models import SequenceTagger
tagger = SequenceTagger.load('ner')
from flair.data import Sentence
s = Sentence(english_text)
tagger.predict(s)
for entity in s.get_spans('ner'):
    print(entity)

输出: 如您所见,训练有素的模型并非以最佳方式工作。但是,很少有人“开箱即用”地使用Flair-它主要是用于创建自己的工具的库。 关于下一个图书馆,同样可以保留。
Span [6,7]: "7 days" [− Labels: DATE (0.9329)]
Span [17]: "Indian" [− Labels: NORP (0.9994)]
Span [35,36]: "4 hours." [− Labels: TIME (0.7594)]
Span [42,43,44]: "Monday 27th Jan." [− Labels: DATE (0.9109)]
Span [53]: "FICO" [− Labels: ORG (0.6987)]
Span [63,64]: "6 months" [− Labels: DATE (0.9412)]
Span [98,99]: "10 days." [− Labels: DATE (0.9320)]
Span [105,106]: "noon tomorrow" [− Labels: TIME (0.8667)]




迪帕夫洛夫


图片
DeepPavlov是由TensorFlow和Keras构建的开源库。

开发人员建议将该系统主要用于“对话”系统,聊天机器人等,但是该库对于解决研究问题也非常有用。MIPT的创建者似乎甚至没有提出在生产中使用它而无需认真工作来“定制”和“完成”该解决方案的任务。
与Python Zen相矛盾的一种奇怪且不合逻辑的代码架构方法,如果您花足够的时间来处理它,则会带来良好的结果。
from deeppavlov import configs, build_model
from deeppavlov import build_model, configs

ner_model = build_model(configs.ner.ner_ontonotes_bert, download=True)
result = ner_model([english_text])
for i in range(len(result[0][0])):
     if result [1][0][i] != 'O':
         print(result[0][0][i], result[1][0][i])

输出: 结果是可预测的,可理解的,详细的,也是最好的之一。该模型本身也可以直接用于Hugging Face Transformers中,从而以多种方式消除了对代码体系结构的要求。
7 B-DATE
days I-DATE
Indian B-NORP
Laravel B-PRODUCT
Codeigniter B-PRODUCT
daily B-DATE
4 B-TIME
hours I-TIME
Monday B-DATE
27th I-DATE
Jan I-DATE
6 B-DATE
months I-DATE
FI B-PRODUCT
AREAWe I-PRODUCT
10 B-DATE
days I-DATE
noon B-TIME
tomorrow B-DATE




deepmipt / ner


实际上,这是Deep Pavlov最初的图书馆。它可以用来了解开发人员思想的方向以及他们所取得的进步。
import ner
example = russian_text
def deepmint_ner(text):
  extractor = ner.Extractor()
  for m in extractor(text):
     print(m)
deepmint_ner(example)

输出:
Match(tokens=[Token(span=(7, 13), text='')], span=Span(start=7, end=13), type='LOC')
Match(tokens=[Token(span=(492, 499), text='')], span=Span(start=492, end=499), type='PER')
Match(tokens=[Token(span=(511, 520), text=''), Token(span=(521, 525), text='')], span=Span(start=511, end=525), type='PER')
Match(tokens=[Token(span=(591, 600), text='')], span=Span(start=591, end=600), type='LOC')
Match(tokens=[Token(span=(814, 820), text=''), Token(span=(821, 829), text='')], span=Span(start=814, end=829), type='PER')


多种语言


最古老的库之一,快捷的工作和大量受支持的语言使其仍然很受欢迎。另一方面,病毒GPLv3许可证不允许将其完全用于商业开发。
from polyglot.text import Text
for ent in Text(english_text).entities:
 print(ent[0],ent.tag)

输出: 对于俄语:
Laravel I-LOC
SAP I-ORG
FI I-ORG


!polyglot download embeddings2.ru ner2.ru
for ent in Text(russian_text).entities:
 print(ent[0],ent.tag)

输出: 结果不是最好的,但是如果您付出努力,速度和良好的支持可以提高结果。
24 I-ORG
I-PER
I-LOC
I-PER
I-ORG
I-PER




AdaptNLP


图片
另一个新图书馆,对于研究人员而言门槛极低。
AdaptNLP允许用户(从学生到经验丰富的数据工程师)使用现代的NLP模型和培训方法。
该库建立在流行的Flair和Hugging Face Transformers库的顶部。

from adaptnlp import EasyTokenTagger
tagger = EasyTokenTagger()
sentences = tagger.tag_text(
    text = english_text, model_name_or_path = "ner-ontonotes"
)
spans = sentences[0].get_spans("ner")
for sen in sentences:
    for entity in sen.get_spans("ner"):
        print(entity)

输出: 结果是可以接受的,但是该库允许您使用各种模型来完成任务,并且如果您付出努力可以将其反复改进(但是,如果直接拥有Flair和Hugging Face Transformers,为什么呢?)。 尽管如此,简单性,大量任务和良好的体系结构以及开发人员的系统努力使我们希望图书馆有一个未来。
DATE-span [6,7]: "7 days"
NORP-span [18]: "Indian"
PRODUCT-span [30]: "Laravel"
TIME-span [35,36,37]: "daily 4 hours"
DATE-span [44,45,46]: "Monday 27th Jan."
ORG-span [55]: "FICO"
DATE-span [65,66]: "6 months"
DATE-span [108,109]: "10 days"
TIME-span [116,117]: "noon tomorrow"





图片
来自StanfordNlp的Stanza是斯坦福大学于2020年向开发人员赠送的礼物。Spacy缺乏的是多种语言,这是一种对语言的沉浸感以及易用性。
如果社区支持此库,那么它就有机会成为最受欢迎的库之一。
import stanza
stanza.download('en')
def stanza_nlp(text):
  nlp = stanza.Pipeline(lang='en', processors='tokenize,ner')
  doc = nlp(text)
  print(*[f'entity: {ent.text}\ttype: {ent.type}' for sent in doc.sentences for ent in sent.ents], sep='\n')
stanza_nlp(english_text)

输出: 对于俄语:
entity: 7 days type: DATE
entity: Indian type: NORP
entity: Laravel type: ORG
entity: Codeigniter type: PRODUCT
entity: daily 4 hours type: TIME
entity: Monday 27th Jan. type: DATE
entity: SAP type: ORG
entity: FICO type: ORG
entity: 6 months type: DATE
entity: FI AREAWe type: ORG
entity: 10 days type: DATE
entity: noon tomorrow type: TIME



import stanza
stanza.download('ru')
def stanza_nlp_ru(text):
  nlp = stanza.Pipeline(lang='ru', processors='tokenize,ner')
  doc = nlp(text)
  print(*[f'entity: {ent.text}\ttype: {ent.type}' for sent in doc.sentences for ent in sent.ents], sep='\n')
stanza_nlp_ru(russian_text)

输出: 工作快捷,代码优美,效果良好。
2020-05-15 08:01:18 INFO: Use device: cpu
2020-05-15 08:01:18 INFO: Loading: tokenize
2020-05-15 08:01:18 INFO: Loading: ner
2020-05-15 08:01:19 INFO: Done loading processors!
entity: type: LOC
entity: type: LOC
entity: type: PER
entity: 2107 type: MISC
entity: 47 type: MISC
entity: 24 type: MISC
entity: type: PER
entity: - type: LOC
entity: . type: LOC
entity: type: LOC
entity: type: LOC
entity: type: PER




艾伦普


图片
建立在PyTorch上的研究库/
一方面-简单的体系结构和快速的速度,另一方面,开发人员正在不断更改体系结构中的某些内容,这会影响整个图书馆的工作。
from allennlp.predictors.predictor import Predictor
import allennlp_models.ner.crf_tagger
predictor = Predictor.from_path("https://storage.googleapis.com/allennlp-public-models/ner-model-2020.02.10.tar.gz")
allen_result = predictor.predict(
  sentence=english_text
)
for i in zip(allen_result['tags'], allen_result['words']):
    if (i[0]) != 'O':
      print(i)

输出:(
'U-MISC','Indian')
('U-ORG','PHP')
('U-MISC','Laravel')
('U-MISC','Codeigniter')
('B- ORG','SAP')
('L-ORG','FICO')
该模块可以快速运行,但是效果不佳。

汉普


图片
HanLP是来自中国开发人员的开放源代码库之一。在我看来,这是一个聪明,发达,活跃的项目,它将在天朝帝国之外找到自己的利基市场。
针对在TensorFlow 2.0上创建的研究人员和公司的NLP库。
HanLP随附了针对不同语言(包括英语,中文和许多其他语言)的预先准备的模型。
唯一的问题是每次更新库后输出“跳转”的质量。
recognizer = hanlp.load(hanlp.pretrained.ner.MSRA_NER_BERT_BASE_ZH)
recognizer([list('上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美国纽约现代艺术博物馆参观。'),
                list('萨哈夫说,伊拉克将同联合国销毁伊拉克大规模杀伤性武器特别委员会继续保持合作。')])

输出:

[[('上海华安工业(集团)公司', 'NT', 0, 12), ('谭旭光', 'NR', 15, 18),
('张晚霞', 'NR', 21, 24),
('美国', 'NS', 26, 28),
('纽约现代艺术博物馆', 'NS', 28, 37)],
[('萨哈夫', 'NR', 0, 3),
('伊拉克', 'NS', 5, 8),
('联合国销毁伊拉克大规模杀伤性武器特别委员会', 'NT', 10, 31)]]


import hanlp
tokenizer = hanlp.utils.rules.tokenize_english
testing = tokenizer('Need SAP FICO consultant for support project needs to be work on 6 months on FI AREAWe')
recognizer = hanlp.load(hanlp.pretrained.ner.CONLL03_NER_BERT_BASE_UNCASED_EN)
recognizer(testing)

输出: 对于英语,结果不稳定,但这可以使用NLTK的分词器解决。
[('SAP FICO', 'ORG', 1, 3)]




PullEnti


俄语中NER的C#库。2016年,她在事实RuEval-2016竞赛中获得第一名。在2018年,作者将代码移植到Java和Python。
可能是俄语中最漂亮的解决方案。
快速,深入,注重细节。决定是基于规则的,自然会限制其发展,但是其自主性,速度和结果使我们对项目的发展充满希望。
该库有一个python-wrapper,尽管看起来“已废弃”。
from pullenti_wrapper.processor import (
    Processor,
    MONEY,
    URI,
    PHONE,
    DATE,
    KEYWORD,
    DEFINITION,
    DENOMINATION,
    MEASURE,
    BANK,
    GEO,
    ADDRESS,
    ORGANIZATION,
    PERSON,
    MAIL,
    TRANSPORT,
    DECREE,
    INSTRUMENT,
    TITLEPAGE,
    BOOKLINK,
    BUSINESS,
    NAMEDENTITY,
    WEAPON,
)

processor = Processor([PERSON, ORGANIZATION, GEO, DATE, MONEY])
text = russian_text
result = processor(text)
result.graph


输出:图片

娜塔莎(Natasha)


图片
Natasha,这似乎是俄语的主要NLP项目之一。它具有悠久的历史,始于通过流行的Yargy Parser开发的基于规则的解决方案,现在解决了俄语的主要NLP任务:标记化,句子分割,词形化,短语规范化,解析,NER标记,事实提取。
from natasha import (
    Segmenter,
    MorphVocab,
    
    NewsEmbedding,
    NewsMorphTagger,
    NewsSyntaxParser,
    NewsNERTagger,
    
    PER,
    NamesExtractor,

    Doc
)

segmenter = Segmenter()
morph_vocab = MorphVocab()

emb = NewsEmbedding()
morph_tagger = NewsMorphTagger(emb)
syntax_parser = NewsSyntaxParser(emb)
ner_tagger = NewsNERTagger(emb)

names_extractor = NamesExtractor(morph_vocab)

doc = Doc(russian_text)

输出: 不幸的是,与同一开发者的Yargy Parser的自定义规则相比,结果不稳定,但是该项目正在积极开发中,并显示出可观的商业应用结果。
110 ,
LOC───
.
https://www.sobyanin.ru/ , 1 .
.51 ( :
LOC───────────────
, ) ?
ORG PER────────────
2107 47
24, .
ORG──
c
PER────────────────
10 1970 ,
─────────
-, . , 5/1 8 000 ( )
LOC──────────── PER─────────
00
LO
.

PER────────────
- .




书呆子


最后一个模块是一个私有项目,该项目不是特别受欢迎,它建立在Spacy和Thinc的基础上,尽管如此,仍应注意选择的体系结构方法(强调易用性)。
from nerd import ner
doc_nerd_d = ner.name(english_text)
text_label = [(X.text, X.label_) for X in doc_nerd_d]
print(text_label)


产出: 在所有项目中,最``平衡''和便捷,具有可接受的结果和易用性似乎是StanfordNlp的Stanza-我认为大多数语言的开箱即用,高质量的学术研究以及大学本身科学界的支持使该项目最有希望。 下次,我将分享我与“封闭式”解决方案以及为自然语言处理所提议的API一起工作的经验。Google Colab 提供的所有代码
[('7 days', 'DATE'), ('Indian', 'NORP'), ('PHP', 'ORG'), ('Laravel', 'GPE'), ('daily 4 hours', 'DATE'), ('Monday 27th Jan.', 'DATE'), ('Need SAP FICO', 'PERSON'), ('6 months', 'DATE'), ('10 days', 'DATE'), ('noon', 'TIME'), ('tomorrow', 'DATE')]







All Articles