精华内容
下载资源
问答
  • 这个系列文章【文本信息抽取与结构化】,在自然语言处理中是非常有用和有难度的技术,是文本处理与知识提取不可或缺的技术。 本篇介绍如何从非结构的文档中,提取想要的信息,进而结构化文本。 作者&编辑 | 小Dream...
  • 技术组件nlp允许提取结构化信息,此提取在代理中定义。 代理商是会说多种语言的助手,以查找相关数据。 nlp组件将一组JSON格式的代理和非结构化文本内容作为输入,以提供结构化数据的JSON流作为输出。 第二个技术...
  • 步骤一:词性标注 实体抽取是文本挖掘类问题的一部分,它从非结构化文本提取出某些结构化信息。我们来仔细看看受到推崇的实体抽取方法的思路。如果技能主要都是通过所谓的名词短语体现的,那么我们的抽取动作...

    v2-485af11152fef2bdc807c6b983552704_1440w.jpg?source=172ae18b

    v2-7d8e1302079a75b8948d2390cb92d4e4_b.jpg
    本文为 AI 研习社编译的技术博客,原标题 :
    Deep learning for specific information extraction from unstructured texts
    作者 | Intuition Engineering
    翻译 | AI小山 编辑 | 王立鱼
    原文链接:https://towardsdatascience.com/deep-learning-for-specific-information-extraction-from-unstructured-texts-12c5b9dceada

    v2-033270eb0f5dfe6a9b912ded44be9b13_b.jpg

    这是我们在iki项目工作中的一系列技术文章中的第一篇,内容涵盖用机器学习和深度学习技术来解决自然语言处理与理解问题的一些应用案例。

    在本文中,我们要解决的问题是从非结构化文本中提出某些特定信息。我们要从简历中提取出用户的技能,简历可以以任意格式书写,比如“曾经在生产服务器上部署定量交易算法”。

    本文有一个演示页面,可以用你的简历试试我们的模型表现如何。

    语言学模型

    现代语言学模型(ULMfit,ELMo)使用无监督学习技术,比如在大型文本语料中加入RNN嵌入层(embeddings)用来“认识”基本的语言结构,然后再进行特定的监督训练。在某些情况下,你反而需要一个在非常特定的、小的数据集上训练出来的模型。这些模型对一般的语言结构几乎一无所知,只对特定的文本特征有效。一个典型的例子是影评或新闻数据集的简易情感分析工具,这些极简单的分析模型只能识别“好”或“坏”等形容词的同义词,或者判别是否有强调性词汇存在。在我们的研究中,这两种方法我们都采用。

    通常,当进行文本语料分析时,我们会考虑文本中的全部词汇。一些流行的文本向量化算法,比如tfidf,word2vec或GloVe模型都使用整个文档的词汇表来生成向量,除了停用词(例如冠词、代词,和其它十分基本的语言元素,在统计平均法中几乎没有语义上的意义)。如果有更明确的目标,并且有关于语料的更多的信息,你也许会判断出哪些语料更有价值。比如说,要对菜谱的语料进行分析,把配料和菜品名称的类别从文本中提取出来就很重要。另外一个例子是从简历语料中提取专业技能。如果我们能够通过把每个简历与一个提取出来的技能的向量相关联,从而使之向量化,我们就可以对行业职位的分类做得好得多。

    举例说明:

    简历:数据科学家,机器学习、大数据、开发、统计和分析方面的实际经验。带领数据科学家团队实现了Python机器学习模型的大融合、分层和特征工程,展现出预测性分析方面的极高的准确度。使用Doc2Vec词汇嵌入和神经网络创立了一个推荐系统。

    提取的专业技能:机器学习,大数据,开发,统计,分析,Python机器学习模型大融合,分层,特征工程,预测性分析,Doc2Vec,词汇嵌入,神经网络。

    步骤一:词性标注

    实体抽取是文本挖掘类问题的一部分,它从非结构化的文本中提取出某些结构化的信息。我们来仔细看看受到推崇的实体抽取方法的思路。如果技能主要都是通过所谓的名词短语体现的,那么我们的抽取动作的第一步就是实体识别,用的是NLTK库的内置函数(参阅“从文本中提出信息”,《NLTK全书》第7部分)。词性标注函数提取出名词短语(NP),并用树来表示名词短语和句中其它部分的关系。NLTK库有若干工具能进行这样的词语分解。

    v2-a097308c6fbb9109346b504e51d9bce0_b.jpg
    NLTK全书,第7章,图2.2:基于简单正则表达式的NP Chunker的一个示例
    NLTK全书,第7章,图2.2:基于简单正则表达式的NP Chunker的一个示例

    我们可以定义一个用正则表达式完成语句分解的模型(例如,我们可以把几个形容词加上一个名词定义为一个短语),或者我们能用NLTK中的已经提取出来的名词短语范例训练出一个关于本文标号的模型。这个步骤能让我们得到许多实体,其中一些是我们要的技能,而另一些不是。此外,技能简历也可能包含其它实体,比如地点、人物、对象、组织,诸如此类。

    步骤二:候选词分类的深度学习架构

    下一步是实体分类。这里的目标非常简单----把技能从“非技能”里区别开来。用于训练的特征集是根据候选短语和上下文的结构来构建的。显然,要训练一个模型,我们先要创建一个标注好的训练集,我们用1500个抽取出来的实体手工创建了训练集,里面包含了技能和“非技能”。

    我们从不打算把模型应用于那些硬编码的有限的技能集合,模型的核心思想是从英文简历的技能中学习到语义,并用模型来提取出未见过的技能。

    每个词的向量由二进制特征组成,这些特征包括数字或其它特殊字符的出现与否(技能通常包含数字和符号:C#,Python3),首字母或全词大写(SQL)。我们也看某个词是否在英语词汇表里以及是否在一些主题列表里,比如人名、地名等等。最终使用了这些特征的模型在实体测试集中的准确率是74.4%。如果把候选词中是否有英语里常见的前缀和后缀,做成二进制特征,放到模型里,则模型在测试集中的准确率高达77.3%。如果模型的特征集中再加上用单热(one-hot)向量编码的词性标注,准确率就可以推到84.6%。

    一个可靠的语义词汇嵌入模型没法用简历数据集训练得来,这样的数据集太小,也不全面。针对这个问题,你应该使用在其它真正大型的数据集上训练出来的词汇嵌入层。我们使用了有50个维度的GloVe模型向量,这把模型在测试集上的准确率提升至高达89.1%。你可以上传一个简历文本到我们的最终模型的演示,试试效果。

    v2-ba5b112d43514f751d3a0d72fb485972_b.jpg

    流行的词性标注程序(NLTK 词性标注程序,Standford 词性标注程序)经常在做简历短语标注时犯错误。原因是简历文本为了突显经验和照顾格式(人们在句子中以谓语开头而不是主语,有时,短语没有用正确的语法结构)就经常忽略语法,以及有许多词是专用术语和名称。我们只得写一个自己的词性标注程序解决上述问题。

    分类是通过Keras神经网络进行的,这个Keras神经网络有三个输入层,每一层都被设计用来接收特定类别的数据。第一个输入层接收一个可变长度的向量,构成这个向量的候选短语具有我们上面讨论过的特征,它可以包含任意数目的单词。这个特征向量由一个LSTM层进行处理。

    v2-00a7be936f3802c7a42e96dd078c2444_b.jpg

    第二个可变长度向量含有上下文结构信息。对于给定的窗口大小n,我们在候选短语左边和右边各取n个相邻单词,这些单词的向量拼接成一个可变长度的向量,并传到LSTM层。我们发现最优的n=3。

    第三个输入层的长度固定,它使用候选短语的通用信息和上下文来处理向量——短语里的单词向量在坐标轴上的最大最小值,以及它的上下文所代表的在整个短语中的众多的二进制特征的存在与否以及其它信息。

    我们把这个结构称作SkillExtractor,如下图所示:

    v2-f1e46852574d4cea378fdf3ccd9a5ed9_b.jpg
    Skills Extractor网络架构

    通过 Keras 实现:

    class SkillsExtractorNN:
    
        def __init__(self, word_features_dim, dense_features_dim):
    
            lstm_input_phrase = keras.layers.Input(shape=(None, word_features_dim))
            lstm_input_cont = keras.layers.Input(shape=(None, word_features_dim))
            dense_input = keras.layers.Input(shape=(dense_features_dim,))
    
            lstm_emb_phrase = keras.layers.LSTM(256)(lstm_input_phrase)
            lstm_emb_phrase = keras.layers.Dense(128, activation='relu')(lstm_emb_phrase)
    
            lstm_emb_cont = keras.layers.LSTM(256)(lstm_input_cont)
            lstm_emb_cont = keras.layers.Dense(128, activation='relu')(lstm_emb_cont)
    
            dense_emb = keras.layers.Dense(512, activation='relu')(dense_input)
            dense_emb = keras.layers.Dense(256, activation='relu')(dense_emb)
    
            x = keras.layers.concatenate([lstm_emb_phrase, lstm_emb_cont, dense_emb])
            x = keras.layers.Dense(128, activation='relu')(x)
            x = keras.layers.Dense(64, activation='relu')(x)
            x = keras.layers.Dense(32, activation='relu')(x)
    
            main_output = keras.layers.Dense(2, activation='softplus')(x)
    
            self.model = keras.models.Model(inputs=[lstm_input_phrase, lstm_input_cont, dense_input],
                                            outputs=main_output)
    
            optimizer = keras.optimizers.Adam(lr=0.0001)
    
            self.model.compile(optimizer=optimizer, loss='binary_crossentropy')

    把学习率降到0.0001之后,用Adam优化法取得了最好的模型训练效果。我们选择binary_crossentropy作为损失函数,因为模型的设计是对两个类别进行分类的。

    为了使用更方便,我们加入拟合函数来进行神经网络的训练并使用交叉检查和预测函数实现自动停止,从而实现对候选短语的未知的向量的预测。

        def fit(self, x_lstm_phrase, x_lstm_context, x_dense, y,
                val_split=0.25, patience=5, max_epochs=1000, batch_size=32):
    
            x_lstm_phrase_seq = keras.preprocessing.sequence.pad_sequences(x_lstm_phrase)
            x_lstm_context_seq = keras.preprocessing.sequence.pad_sequences(x_lstm_context)
    
            y_onehot = onehot_transform(y)
    
            self.model.fit([x_lstm_phrase_seq, x_lstm_context_seq, x_dense],
                           y_onehot,
                           batch_size=batch_size,
                           pochs=max_epochs,
                           validation_split=val_split,
                           callbacks=[keras.callbacks.EarlyStopping(monitor='val_loss', patience=patience)])
    
    
        def predict(self, x_lstm_phrase, x_lstm_context, x_dense):
    
            x_lstm_phrase_seq = keras.preprocessing.sequence.pad_sequences(x_lstm_phrase)
            x_lstm_context_seq = keras.preprocessing.sequence.pad_sequences(x_lstm_context)
    
            y = self.model.predict([x_lstm_phrase_seq, x_lstm_context_seq, x_dense])
    
            return y

    pad_sequences函数把一系列特征序列转换成2维数组,这个数组的宽度等于这些序列中的最长者。这样做是为了让可变长度的数据传到LSTM层中,并转换成适合模型训练的格式。

    onehot_transform函数把目标值0和1转换成单热(one-hot)向量[1, 0]和[0, 1]

    def onehot_transform(y):
    
        onehot_y = []
    
        for numb in y:
            onehot_arr = np.zeros(2)
            onehot_arr[numb] = 1
            onehot_y.append(np.array(onehot_arr))
    
        return np.array(onehot_y)

    只要实体及其上下文中的单词数是不确定的,那么,使用稀疏的固定长度的向量就会让人觉得不合理。因此,使用可以处理任意长度向量的循环神经网络就自然显得很方便了。我们的许多试验都证明了使用稠密层处理固定长度向量、使用LSTM层处理可变长度向量的架构是最合理的。

    我们试验过不同的稠密层与LSTM层相组合而形成的多个架构。最后得到的架构配置(层的大小和数量)在交叉验证测试中取得了最优效果,同时训练数据的使用效果也达到最佳。以后的模型要做调优,可以增加训练数据集的大小并且适当增加层的数量和大小,如果在相同的数据集上只是单纯增加层的数量和大小,会导致模型过拟合。

    结果

    v2-f831cff1dfdeb32682de1bbc842ced0b_b.jpg
    抽取的技能举例

    用于模型训练的所有简历都是来自IT行业。我们很高兴看到我们的模型在其它行业(比如,设计和金融)的简历数据集上也有不错的表现。显然,处理完全不同结构和风格的简历会让模型的效果打折扣。我们也想指出,我们对技能这个概念的理解可能跟别人有所不同。我们的模型所遇到的难点之一是把技能跟新的公司的名称相区别开来,这是因为技能往往跟软件框架的名字一样,有时候,你区分不了一个名词到底是指所提到的初创公司还是指新的JS框架或Python库。但不管怎样,在大多数情况下,我们的模型都可以作为一个有效的简历自动化分析工具,而且借助一些统计方法,我们的模型可以大范围用于任意简历语料的数据科学课题中。

    想要继续查看该篇文章相关链接和参考文献?

    点击【用深度学习从非结构化文本中提取特定信息】即可访问!

    今日资源推荐:AI入门、大数据、机器学习免费教程

    35本世界顶级原本教程限时开放,这类书单由知名数据科学网站 KDnuggets 的副主编,同时也是资深的数据科学家、深度学习技术爱好者的Matthew Mayo推荐,他在机器学习和数据科学领域具有丰富的科研和从业经验。

    点击链接即可获取:https://ai.yanxishe.com/page/resourceDetail/417

    展开全文
  • 结构化文本信息提取数据通道设计信息提取任务针对Word或Excel类半结构化文件,即有一定的文章结构和形式的文件,提取感兴趣的键值对。信息提取工作的难点信息提取的工作是将感兴趣的键值对从文档中提取出来,并以...

    b6a8b748c2960c167c9da07bd8b85e02.png

    半结构化文本信息提取数据通道设计

    信息提取任务

    针对Word或Excel类半结构化文件,即有一定的文章结构和形式的文件,提取感兴趣的键值对。

    信息提取工作的难点

    信息提取的工作是将感兴趣的键值对从文档中提取出来,并以结构化格式保存。该任务的难点包括:

    文档格式多样性

    数据格式不统一。不同的文件可能是Word文档,也有可能是Excel文档,不同的文档格式也不尽相同,有比较老的格式如.doc和".xls"类,也有比较新的格式例如".docx"和".xlsx"类,这些格式还包括大写扩展名例如".XLSX",另外很多文档还有信息丢失和文档保护或文档加密情况。

    报告类别多样性

    报告类别繁多。主要包括两个问题:1.不同的文档包括不同类别的报告,例如一个文件包括“A报告”、“B报告”等多个报告。2.同类报告格式不一。大量的报告类别使报告分类工作显得尤其重要,但是如何准确的对报告进行分类是难点之一。

    报告类别重复

    同一个文档中包含同一类别的多份报告问题。例如,出于工作需要,在同一份文档中包含多份“A报告”。

    报告结构多样性

    同一类报告结构不统一。同一类别的报告,也可能存在不同的报告结构。

    关键字多样性

    同一关键字在不同报告内的表述方式不同。在同一类别的报告中,同一个关键字的表述方式不同,也会造成关键字的多样性,例如,同样表示“名称”的关键字,由于不同的写报告的人的习惯不同,可能有“姓名”、“名字”、“申请人”等各种不同的说法。为了实现结构化,必须把所有不同的表述映射为唯一的关键字名称。

    不同类别关键字重复

    不同报告包含相同关键字问题。即便所有报告中包含的关键字均被映射成为唯一的标准关键字,仍然存在重复关键字的问题,即在不同的报告中包含同一个关键字,例如,在同一个文档的“A报告”和“B报告”中均包含”名称“,在这种情况下,存在使用哪个名称作为唯一的关键字的问题,即重复关键字的选择问题。或者当无法使用唯一关键字时,则考虑是否扩展关键字集。

    同类别关键字重复

    同一报告包含相同关键字问题。在同一个报告中,也有可能同一个关键字在文章中的多处出现,例如有时一个报告的内容实际上是由多份子报告合并而成,这同样造成了如何选择唯一关键字或关键字集扩展的问题,

    键值对匹配难题

    与关键字对应的值是什么的问题。当我们检索到感兴趣的关键字,其对应的值不一定就在关键字的后面,有时候在下一行,或下面多行,或者有时干脆是空字符。

    实体识别问题

    如何准确的识别值中感兴趣的实体问题。例如“两年期我还是青铜,上个月已经是王者了”这句话是关键字“晋级历程”的值,其中的“青铜”和“王者”是关键字“初始段位”和“当前段位”的值,但是如何从这句话中准确的提出段位信息实体是一个难题。

    人为错误问题

    无论数据处理的流程设计的如何严谨,总会出现意料之外的人为错误,例如写错字、忘记删除多余文字、或者在Excel类型的文档中将某些行隐藏或干脆调整为非常小的行高,以隐藏信息。这些情况给信息提取带来了更大的难度。

    信息提取工作的度量标准

    判断信息提取工作最终的结果优劣,需要一套完整科学的度量标准。

    提取的准确度

    准确性指的是能够想要提取的键值对与实际的键值对的匹配程度, 我们使用

    代表提取出的键值对,使用
    表示真实的键值对,单个键值对提取的准确性
    可以定义为:

    be7c74304e9314b12ec243dace8ef2b7.png

    a和b是(0,1)区间的小数。

    对于全部键值对的准确

    可以采用取平均的方式,即

    是全部键值对的数量。

    提取的完整度

    完整度指的是提取的关键字正确的键值对数量占全部真实键值对数量的比例。我们使用

    代表x的数量,
    代表提取比例则有:

    提取的效率

    提取的效率指的是算法的效率,不难想象,如果一个算法只遍历一遍所有单元(根据算法的设计,单元有可能是每个字符或者每一行)就实现了全部信息的提取,即认为达到了最大效率,算法d效率为

    是基本单元的数量。

    数据处理流程

    为了有效解决上述问题,我们提出采用数据管道的方式,分阶段处理。具体管道包括6个步骤,即文档分类、文档格式转换、文档切分、报告分类、关键字提取、关键字分类、键值对匹配。

    文档分类用于将输入文档按照文件格式归档;归类后的文档采用不同的工具进行文档格式转换,一般来说转换为txt格式;然后提取并统计报告类型;对不同的报告类型进行合并归档;针对每一种类型的报告进行关键词提取;将所有关键词合并为“标准关键词”;最后提取报告键值对,并将关键字映射为标准关键字。

    下面分别介绍每个步骤的处理过程。

    2a57e1b26ee95916f7cff165ff6e6ed2.png

    文档分类

    为了解决上一节提出的“文档格式多样性”问题,首先要进行文档分类,该过程使用一个文档分类器遍历所有文件,该分类器的输入是待处理的文档,输出是该文档的文件格式。

    这里我们定义文档集合为

    ,其中
    ,n是全部文档的数量。

    我们用

    代表该分类器,
    代表文件格式,其中
    ,m是全部文件格式的数量,那么该分类器作用的数学形式如下:

    65115ee67c481f91b5a29da1710fde62.png

    的确定

    如果文件格式较少,可以通过人为设定的方式,在只有4类文件的情况下可以设定:

    如果文件格式较多,则首先对全部文档进行遍历,遍历后得到所有文件类别,出于效率的考虑,一般将文档分类和判别工作合二为一,过程如下:

    文档分类器的另一个作用是缓解“报告类别多样性”问题,引起该问题的原因之一是来自不同公司同一类别的报告也会采用不同的格式。 因此将公司名称作为文档判定其的类别,同样可以将文档归档。

    文档分类器能够这部分解决“文档格式多样性”和“报告类别多样性”的问题。但是该步骤只是将文档进行了归类,依然还存在不同的文件格式。

    文档格式转换

    在文档分类器工作的基础上,为了解决彻底解决“文档格式多样性”的问题,还需要使用“格式转换器”。

    我们用

    表示该转换器,该转换器的作用是检索输入文件的格式,使用对应的转换工具将文件转换为指定的格式。

    根据输入和输出的数量,该转换器可以有多-多、多-单、单-多的三种,根据任务不同,选择不同的转换器,本文的目的是解决“文档格式多样性”问题,因此选择“多-单”转换器。转换器的工作流程如下:

    f72cffcaee130ff88a9ac53e57b6e56d.png

    对于商检数据来说,该转换器将Word或Excel格式文档转换为txt格式并保存,得到的结果如下

    文档切分

    经过文档分类和文档格式转换,基本解决了“文档格式多样性”的问题,一定程度上解决了“报告类别多样性”问题,但是文档中包含的不同类别的报告依然是待解决的问题,无法解决该问题,即便我们将键值对提取出来,也无从得知该键值对来自于哪个报告,数据也就没有任何意义,因此本节我们讨论如何将文档切分为不同报告。

    我们提出使用“文档切分器”将文档切分为多个报告。

    使用

    代表切分得到的报告,其中
    ,p是所有文档中报告数量的最大值,值得注意的是,不是所有文档都能得到p份报告。
    代表切分器,则有:

    该切分器的输入是一个报告和参数,输出是一个报告的集合。

    开始标识和结束标识

    观察上式,切分器的输入不仅包括文档,还包括

    ,这两个变量是文档切分器的参数,
    是开始标识,
    是结束标识。下面具体介绍:

    文档切分器的工作过程基于开始标识和结束标识的定义,这两个标识代表报告的开始和报告的结束,一般来说报告的开始有一个较明显的标识就是报告标题,报告的结束也有一定规律,例如出现“综上所述”、“备注”等字眼,或者出现类似“* * end * * ”的固定格式。对于Excel类报告来说,有一个天然的切分方式就是在一个工作簿中不同的工作表自然就是一个个报告。

    文档切分的工作流程如下:

    f3691957ecdacf4823b3b5697c93d33a.png

    文档切分基本解决了“报告类别多样性”和“不同类别关键字重复”的问题,但还有一个细节问题待处理,那就是报告分类的问题。

    报告分类

    文档经过切分,得到了报告集,想从这些报告集中抽取数据,自然想到的一个方法就是将报告分类,逐个类别提取信息。但是报告分类面临的困难是,同一类报告的名称不一定相同,例如“A报告”,有可能的名称包括"a报告"、 "A证书"、 "A文件"等等。

    我们采用第二个分类器,即报告分类器,解决上述问题。

    假设用

    表示报告分类器,该分类器的作用是得到输入报告的类别,l代表某一个类别,l的范围是1到q,q是全部类别的数量。

    报告名-类别映射表

    报告分类器的数学表达式中包含一个参数

    ,该参数是报告名称到报告类别的映射表,是报告分类器的核心参数。

    举例来说,报告映射表的映射过程如下:

    "A证书" -> “A报告”
    "a报告" -> “A报告”
    "A文件" -> “A报告”
    ...

    确定映射表

    如何确定映射表有多种方法,例如根据报告题目中出现的字判断,根据报告的格式判断,或根据报告的文字统计判断等等,这些方法有各自的优势,但是对于专业性较强的报告,采用专家规则法能够得到最准确的结果。

    简化报告名称

    在实际处理报告名称的过程中,有可能出现不同的名称过多的情况,如果不同的报告名称数量超过了1000个,则认为采用专家规则的方式复杂度过高,所以需要对报告名称进行简化处理。通过简化报告名称的方式,亦可以达到粗略分类报告的目的。

    简化报告名称的方式可以采用两步的方法,第一步根据报告出现的次数简化。第二步根据报告名称的长度简化。第三步删除名称中的无用字符,例如空格、制表符等。具体来说本文设定报告出现次数少于3次则不予考虑,并取去除无用字符后所有报告名称的最后10个字符作为简化名称。

    报告分类过程

    报告分类的过程如下图所示:

    88ce77113dfb508833725827cc048585.png

    关于“报告类别重复”和“报告结构多样性”问题的讨论

    处理好报告分类器的细节,能够解决报告类别重复的问题。如果在保存报告时,想将报告名称保存为报告类别,简单有效的方法是对报告进行编号,例如"A报告1.txt"、"A报告2.txt"等。另外一种方式是采用数据库保存报告,将报告类型作为其中一个字段。

    虽然可以把统一类型的报告,按照排版结构的不同继续分类,以解决“报告结构多样性”的问题。但是考虑到该工作的难度和工作量与对信息提取带来的提升的比较,可以简单的认为同一类别报告的排版格式大致一样,后面的实践也进一步证明了,设计好后续步骤可以有效的减少该问题带来的不确定性。

    关键字提取

    有了某一类报告,如何提取其中的关键字?主要有两种方法:第一种是设定需要提取的关键字集,在报告中检索其中的关键字。第二种方法是先检索所有关键字,再将其映射为标准关键字。

    第一种方法的问题在于,我们无法在没有事先把所有报告都看过的前提下,定义一个包含全部可能出现的关键字的集合,这大大影响了关键字提取的准确性。所以,出于精度的考量,我们采用先盲检索后分类的方法,即一种“基于分隔符的逐行关键字提取方法”。

    基于分隔符的逐行关键字提取方法

    基于分隔符的逐行关键字提取方法以报告的行为单位元素,以预先设定的分隔符为提取依据,通过“关键字提取器”提取关键字。

    我们设

    为关键字提取器,
    为报告中的第s行,其中
    ,r为该报告的最大行数,
    为分隔符的集合,
    为第r个关键字,则有。

    这种方法基于一个基本的假设,关键字之后一定有一个分隔符用于区分关键字与值。如果出现异常情况,这种方法则会失效。

    分隔符的确定

    一般来说使用中英文的冒号、制表符等作为分隔符,也可以结合多个分隔符,当检测到使用了某一个分割符时,该分割符前面的字符串即认定为关键字。

    多个分隔符的情况

    如果一行中出现多个分割符,那么对该行的分割得到的字符串将超过2个,这种情况下如何判断哪个是关键字,需要通过设定规则来解决。

    我们假设

    经过分割后得到
    个字符串,对应每种字符串串长度设定提取规则。例如如果字符串长度为偶数,那么奇数项认为是关键字,偶数项认为是该项前面一个奇数项关键字的值。如果字符串长度为奇数,那么将奇数项认定为关键字,偶数项认定为值,最后一个关键字自动删除,因为它没有值。当然,这个规则需要根据报告的具体形式而设定。

    逐行提取的优势

    采用逐行提取的方式可以提高检测的效率,遍历一遍报告的所有行即可得到全部关键字,效率较高。但是该方式也基于一个基本假设,即关键字与分隔符一定在同一行,如果出现了违背该基本假设的情况,则该方法失效。

    关键字提取流程

    3a5e6df52da2033c4ab18d3ae6fc3ad3.png

    关键字分类

    完成关键字提取工作后,等待我们的是“关键字多样性”和“同类别关键字重复”的问题,这一节将探讨如何解决这两个问题。

    我们用

    代表关键字分类器,该分类器的输入是待分类的关键字和核心参数,该核心参数是“关键字-标准关键字”映射表,经过分类后,输出是标准化的关键字

    获取关键字映射表

    关键字映射表与报告类型映射表的获取方式类似,采取专家规则的方法虽然效率较低,但是能够保证数据的准确性。

    简化关键字

    如果关键字提取器提取出来的关键字种类太多,创建关键字映射表的过程将非常复杂和耗时,所以我们同样需要使用三步简化的方式。第一步去掉无意义的字符,例如空格、制表符等。第二步去掉无意义的关键字,例如关键字是纯数字或纯符号等。第三步取关键字的最后10个字符(也可以是其他任意的字符或从字符串的开始部分取,这个数字应该既保证有足够的信息区分不同的关键字,又能够有效的减少数量)。

    关键字分类流程

    8bb2b4eef853c36f58c837003c3ba391.png

    键值对匹配

    键值对的提取需要解决“键值对匹配难题”、“实体识别问题”。也就是,怎么找到与某个关键字对应的值的问题,以及如何从该值中提取出我们需要的内容的问题。

    关于键值对匹配难题的解决方案

    我们使用键值对匹配器完成匹配任务。

    上两节提到的关键字提取器和关键字分类器能够从报告中发现关键字并标准化。我们认为除了报告中除了关键字都是值,这时需要解决的问题是哪些值与哪些关键字匹配。

    Word类文档转换的报告(以下简称Word报告)与Excel类文档转换的报告(以下简称Excel报告)在解决这个问题上采取不同策略,因为这两类文件需要基于不同的基本假设。

    • Excel报告假设与某个关键字匹配的值是位于同一行的该关键字之后的字符串,或者位于同一行的该关键字与下一个关键字之间的字符串。
    • Word报告假设与某个关键字匹配的值是该关键字与下一个关键字之间的字符串,不一定在同一行。

    键值对匹配器的输入是一个有顺序的关键字序列和一个有顺序的值序列,关键字序列的形式采用“关键字提取”章节的形式,即

    ,记该序列为
    ;值序列的数学形式为
    ,记该序列为
    。其中每个关键字或值的下角标代表该变量的顺序,r与w可能相等也可能不等。

    对于Excel类文档转换的报告来说,每处理一行数据,即可得到对应的

    ,因为我们假设关键字和值在同一行。而对于Word报告来说,我们需要将整体报告遍历处理完成后才能得到
    (即使提取关键字的过程仍然是基于逐行的处理)。

    有了

    ,我们还需要一个策略库,用于应对不同类型的报告,这同样有助于解决“报告类别多样性”的问题,这也体现了报告分类步骤的重要性,因为如果没有报告分类,我们可能需要一个规模庞大的策略库,而基于报告分类,需要指定的策略库只需覆盖最小的报告类型数量。

    匹配策略库

    匹配策略库是键值对匹配器的核心参数,库中的策略决定了该匹配器的匹配精度。

    举例来说,对于封面类型的报告(Excel类报告),假设

    的数量相等,即
    ,一个简单的策略是按顺序依次匹配,即得到键值对集合

    当然,实际情况比这个简单策略复杂的多,不变的是,对于不同的报告类别,我们需要指定一套不同的策略,这些策略的集合组成策略库,设策略库为

    ,记为
    ,这里的l和q与表示报告类型的
    中的
    含义相同。

    键值对匹配器的输出是匹配好的键值对集,记为

    基于上述说明,设键值对匹配器为

    ,键值对匹配器的数学表达如下所示:

    当然,输出的键值对集合中的关键字应该映射为标准关键字,这一步可以在键值对匹配之前或之后完成。

    键值对匹配器工作流程

    31ef9f2315e88d084d1ba07b84ab6e91.png

    关于实体识别问题的讨论

    实体识别问题是一个自然语言处理的传统问题,对于如何识别出人名和电话号码等实体的研究较多。想要识别出一个字符串中的特定实体,高效率和高精准度的方法一般建立在有合适的语料库和该领域的字典的前提下。

    总结

    对于“半结构化文本信息提取”任务,想得到比较好的结果,需要理论与实践的结合,具体来说既要定义好问题、度量和方法,又要实现步骤设计、策略和工程部署。

    总结我们的工作,主要得到了以下成果:

    一、定义了“信息提取”工作的难点

    能够正确的定义问题就解决了问题的一半。我们定义了10个待克服的困难,包括:文档格式多样性、报告类别多样性、报告类别重复、报告结构多样性、关键字多样性、不同类别关键字重复、同类别关键字重复、键值对匹配难题、实体识别问题和人为错误问题。

    二、定义了“信息提取”工作的度量标准

    没有工作度量标准,无法判断解决方案的效果,我们提出了“提取准确度”、“提取完整度”、“提取效率”的三维度度量标准。

    三、实现了“数据管道”的设计

    数据通道的设计方式将一个复杂的项目分解为相互依赖的分项目,具体管道包括6个步骤,即文档分类、文档格式转换、文档切分、报告分类、关键字提取、关键字分类、键值对匹配。这样设计的好处在于工程上易于实现和维护,且一个设计好的管道可以对其他数据复用,减少重复工作量,另外,管道的设计是理论与实践的结合,可以在工程实现上采用理论设计的逻辑搭建管道。

    四、部分解决了信息提取工作的难点

    数据管道的每一步骤设计都充分考虑了如何解决信息提取的难点。

    c0961430dba9c4ac4d00d33d27d14448.png
    展开全文
  • 基于注意力的街景图像提取结构化信息一种用于真实图像文本提取问题的TensorFlow模型。该文件夹包含在FSNS数据集数据集上训练新的注意OCR模型所需的代码,以在法国转录街道名称。 您还可以使用它来根据自己的数据进行...

    基于注意力的街景图像提取结构化信息

    一种用于真实图像文本提取问题的TensorFlow模型。

    该文件夹包含在FSNS数据集数据集上训练新的注意OCR模型所需的代码,以在法国转录街道名称。 您还可以使用它来根据自己的数据进行培训。

    更多细节可以在我们的论文中找到:

    “从街景图像注意为基础提取结构化信息”

    项目地址:https://github.com/tensorflow/models/tree/master/attention_ocr

    Attention-based Extraction of Structured Information from Street View Imagery

    A TensorFlow model for real-world image text extraction problems.

    This folder contains the code needed to train a new Attention OCR model on the FSNS dataset dataset to transcribe street names in France. You can also use it to train it on your own data.

    More details can be found in our paper:

    “Attention-based Extraction of Structured Information from Street View Imagery”
    http://www.tensorflownews.com/

    展开全文
  • 步骤一:词性标注 实体抽取是文本挖掘类问题的一部分,它从非结构化文本提取出某些结构化信息。我们来仔细看看受到推崇的实体抽取方法的思路。如果技能主要都是通过所谓的名词短语体现的,那么我们的抽取动作...
    52b1a31a3c37546cbaa7524edb5f7c2a.png

    本文为 AI 研习社编译的技术博客,原标题 :

    Deep learning for specific information extraction from unstructured texts

    作者 | Intuition Engineering

    翻译 | AI小山 编辑 | 王立鱼

    原文链接:

    https://towardsdatascience.com/deep-learning-for-specific-information-extraction-from-unstructured-texts-12c5b9dceada

    RUefIoj6OS8Cuj

    这是我们在iki项目工作中的一系列技术文章中的第一篇,内容涵盖用机器学习和深度学习技术来解决自然语言处理与理解问题的一些应用案例。

    在本文中,我们要解决的问题是从非结构化文本中提出某些特定信息。我们要从简历中提取出用户的技能,简历可以以任意格式书写,比如“曾经在生产服务器上部署定量交易算法”。

    本文有一个演示页面,可以用你的简历试试我们的模型表现如何。

    语言学模型

    现代语言学模型(ULMfit,ELMo)使用无监督学习技术,比如在大型文本语料中加入RNN嵌入层(embeddings)用来“认识”基本的语言结构,然后再进行特定的监督训练。在某些情况下,你反而需要一个在非常特定的、小的数据集上训练出来的模型。这些模型对一般的语言结构几乎一无所知,只对特定的文本特征有效。一个典型的例子是影评或新闻数据集的简易情感分析工具,这些极简单的分析模型只能识别“好”或“坏”等形容词的同义词,或者判别是否有强调性词汇存在。在我们的研究中,这两种方法我们都采用。

    通常,当进行文本语料分析时,我们会考虑文本中的全部词汇。一些流行的文本向量化算法,比如tfidf,word2vec或GloVe模型都使用整个文档的词汇表来生成向量,除了停用词(例如冠词、代词,和其它十分基本的语言元素,在统计平均法中几乎没有语义上的意义)。如果有更明确的目标,并且有关于语料的更多的信息,你也许会判断出哪些语料更有价值。比如说,要对菜谱的语料进行分析,把配料和菜品名称的类别从文本中提取出来就很重要。另外一个例子是从简历语料中提取专业技能。如果我们能够通过把每个简历与一个提取出来的技能的向量相关联,从而使之向量化,我们就可以对行业职位的分类做得好得多。

    举例说明:

    简历:数据科学家,机器学习、大数据、开发、统计和分析方面的实际经验。带领数据科学家团队实现了Python机器学习模型的大融合、分层和特征工程,展现出预测性分析方面的极高的准确度。使用Doc2Vec词汇嵌入和神经网络创立了一个推荐系统。

    提取的专业技能:机器学习,大数据,开发,统计,分析,Python机器学习模型大融合,分层,特征工程,预测性分析,Doc2Vec,词汇嵌入,神经网络。

    步骤一:词性标注

    实体抽取是文本挖掘类问题的一部分,它从非结构化的文本中提取出某些结构化的信息。我们来仔细看看受到推崇的实体抽取方法的思路。如果技能主要都是通过所谓的名词短语体现的,那么我们的抽取动作的第一步就是实体识别,用的是NLTK库的内置函数(参阅“从文本中提出信息”,《NLTK全书》第7部分)。词性标注函数提取出名词短语(NP),并用树来表示名词短语和句中其它部分的关系。NLTK库有若干工具能进行这样的词语分解。

    e135204bb9b6e1f38bc76155ec65a48a.png

    NLTK全书,第7章,图2.2:基于简单正则表达式的NP Chunker的一个示例

    我们可以定义一个用正则表达式完成语句分解的模型(例如,我们可以把几个形容词加上一个名词定义为一个短语),或者我们能用NLTK中的已经提取出来的名词短语范例训练出一个关于本文标号的模型。这个步骤能让我们得到许多实体,其中一些是我们要的技能,而另一些不是。此外,技能简历也可能包含其它实体,比如地点、人物、对象、组织,诸如此类。

    步骤二:候选词分类的深度学习架构

    下一步是实体分类。这里的目标非常简单----把技能从“非技能”里区别开来。用于训练的特征集是根据候选短语和上下文的结构来构建的。显然,要训练一个模型,我们先要创建一个标注好的训练集,我们用1500个抽取出来的实体手工创建了训练集,里面包含了技能和“非技能”。

    我们从不打算把模型应用于那些硬编码的有限的技能集合,模型的核心思想是从英文简历的技能中学习到语义,并用模型来提取出未见过的技能。

    每个词的向量由二进制特征组成,这些特征包括数字或其它特殊字符的出现与否(技能通常包含数字和符号:C#,Python3),首字母或全词大写(SQL)。我们也看某个词是否在英语词汇表里以及是否在一些主题列表里,比如人名、地名等等。最终使用了这些特征的模型在实体测试集中的准确率是74.4%。如果把候选词中是否有英语里常见的前缀和后缀,做成二进制特征,放到模型里,则模型在测试集中的准确率高达77.3%。如果模型的特征集中再加上用单热(one-hot)向量编码的词性标注,准确率就可以推到84.6%。

    一个可靠的语义词汇嵌入模型没法用简历数据集训练得来,这样的数据集太小,也不全面。针对这个问题,你应该使用在其它真正大型的数据集上训练出来的词汇嵌入层。我们使用了有50个维度的GloVe模型向量,这把模型在测试集上的准确率提升至高达89.1%。你可以上传一个简历文本到我们的最终模型的演示,试试效果。

    f882f7ee8a2a13ed421dbf3c6e1454ee.png

    流行的词性标注程序(NLTK 词性标注程序,Standford 词性标注程序)经常在做简历短语标注时犯错误。原因是简历文本为了突显经验和照顾格式(人们在句子中以谓语开头而不是主语,有时,短语没有用正确的语法结构)就经常忽略语法,以及有许多词是专用术语和名称。我们只得写一个自己的词性标注程序解决上述问题。

    分类是通过Keras神经网络进行的,这个Keras神经网络有三个输入层,每一层都被设计用来接收特定类别的数据。第一个输入层接收一个可变长度的向量,构成这个向量的候选短语具有我们上面讨论过的特征,它可以包含任意数目的单词。这个特征向量由一个LSTM层进行处理。

    6adff52f2d2492cf91ad0335ed8a8f85.png

    第二个可变长度向量含有上下文结构信息。对于给定的窗口大小n,我们在候选短语左边和右边各取n个相邻单词,这些单词的向量拼接成一个可变长度的向量,并传到LSTM层。我们发现最优的n=3。

    第三个输入层的长度固定,它使用候选短语的通用信息和上下文来处理向量——短语里的单词向量在坐标轴上的最大最小值,以及它的上下文所代表的在整个短语中的众多的二进制特征的存在与否以及其它信息。

    我们把这个结构称作SkillExtractor,如下图所示:

    9178562022a845983e21b9c77428bc53.png

    Skills Extractor网络架构

    通过 Keras 实现:

    c71caaef62a637662e21252a96ce1818.png

    查看完整代码,点击此处

    把学习率降到0.0001之后,用Adam优化法取得了最好的模型训练效果。我们选择binary_crossentropy作为损失函数,因为模型的设计是对两个类别进行分类的。

    为了使用更方便,我们加入拟合函数来进行神经网络的训练并使用交叉检查和预测函数实现自动停止,从而实现对候选短语的未知的向量的预测。

    4cb400c5c6aa469209343a74a6b937d5.png

    查看完整代码,点击此处

    pad_sequences函数把一系列特征序列转换成2维数组,这个数组的宽度等于这些序列中的最长者。这样做是为了让可变长度的数据传到LSTM层中,并转换成适合模型训练的格式。

    onehot_transform函数把目标值0和1转换成单热(one-hot)向量[1, 0]和[0, 1]

    802ed7a4430d8a40896e09472bb9a361.png

    只要实体及其上下文中的单词数是不确定的,那么,使用稀疏的固定长度的向量就会让人觉得不合理。因此,使用可以处理任意长度向量的循环神经网络就自然显得很方便了。我们的许多试验都证明了使用稠密层处理固定长度向量、使用LSTM层处理可变长度向量的架构是最合理的。

    我们试验过不同的稠密层与LSTM层相组合而形成的多个架构。最后得到的架构配置(层的大小和数量)在交叉验证测试中取得了最优效果,同时训练数据的使用效果也达到最佳。以后的模型要做调优,可以增加训练数据集的大小并且适当增加层的数量和大小,如果在相同的数据集上只是单纯增加层的数量和大小,会导致模型过拟合。

    结果

    4b0095c9ebd054dd8ef4d901dd25c5bf.png

    抽取的技能举例

    用于模型训练的所有简历都是来自IT行业。我们很高兴看到我们的模型在其它行业(比如,设计和金融)的简历数据集上也有不错的表现。显然,处理完全不同结构和风格的简历会让模型的效果打折扣。我们也想指出,我们对技能这个概念的理解可能跟别人有所不同。我们的模型所遇到的难点之一是把技能跟新的公司的名称相区别开来,这是因为技能往往跟软件框架的名字一样,有时候,你区分不了一个名词到底是指所提到的初创公司还是指新的JS框架或Python库。但不管怎样,在大多数情况下,我们的模型都可以作为一个有效的简历自动化分析工具,而且借助一些统计方法,我们的模型可以大范围用于任意简历语料的数据科学课题中。雷锋网雷锋网雷锋网

    想要继续查看该篇文章相关链接和参考文献?

    点击【用深度学习从非结构化文本中提取特定信息】即可访问!

    今日资源推荐:AI入门、大数据、机器学习免费教程

    35本世界顶级原本教程限时开放,这类书单由知名数据科学网站 KDnuggets 的副主编,同时也是资深的数据科学家、深度学习技术爱好者的Matthew Mayo推荐,他在机器学习和数据科学领域具有丰富的科研和从业经验。

    点击链接即可获取:https://ai.yanxishe.com/page/resourceDetail/417

    展开全文
  • 回答下列问题: (1)如何能构建一个系统,以至从非结构化文本提取结构化数据? (2)有哪些稳健的方法识别一个文本描述的实体和关系? (3)哪些语料库适合这项工作,如何使用它们来训练和评估模型?信息有...
  • 解析器将结构化和非结构化文本转换为标头详细信息表示形式。 您可以使用Parsinator从pdf文件创建xml文件,从打印机假脱机文件创建对象,或者从任何文本中解析相关数据。 为什么 Parsinator允许您从任何基于文本的...
  • 基于注意力的街景图像提取结构化信息 一种用于真实图像文本提取问题的TensorFlow模型。 该文件夹包含在FSNS数据集数据集上训练新的注意OCR模型所需的代码,以在法国转录街道名称。 您还可以使用它来根据自己的数据...
  • 我们如何能构建一个系统,从非结构化文本提取结构化数据? 有哪些稳健的方法识别一个文本中描述的实体和关系? 哪些语料库适合这项工作,我们如何使用它们来训练和评估我们的模型? 导入的包 import nltk,re,...
  • 我们如何能构建一个系统,从非结构化文本提取结构化数据,如表格? 有哪些稳健的方法识别一个文本中描述的实体和关系? 哪些语料库适合这项工作,我们如何使用它们来训练和评估我们的模型? 这里写目录标题1 信息...
  •  (1)如何能构建一个系统,以至从非结构化文本提取结构化数据?  (2)有哪些稳健的方法识别一个文本描述的实体和关系?  (3)哪些语料库适合这项工作,如何使用它们来训练和评估模型? 一 信息提取 ...
  • 1. 我们如何能构建一个系统,从非结构化文本提取结构化数据?2. 有哪些稳健的方法识别一个文本中描述的实体和关系?3. 哪些语料库适合这项工作,我们如何使用它们来训练和评估我们的模型?7.1 信息提取#一个重要的...
  • Xponents是一组信息提取库,包括提取和规范地理实体,日期/时间模式,关键字/分类法和各种模式。 例如,如图1所示: 图1.通用标记和编码范例。 文本 提取实体 归一的名义输出 “博伊西,身份证很有趣!” ...
  • 常常在想,自然语言处理到底在做的是一件什么样的事情?到目前为止,我所接触到的NLP其实都...这个系列文章【文本信息抽取与结构化】,在自然语言处理中是非常有用和有难度的技术,是文本处理与知识提取不可或缺的技...
  • 1. 我们如何能构建一个系统,从非结构化文本提取结构化数据?2. 有哪些稳健的方法识别一个文本中描述的实体和关系?3. 哪些语料库适合这项工作,我们如何使用它们来训练和评估我们的模型?7.1 信息提取#一个重要的...
  • 1. 我们如何能构建一个系统,从非结构化文本提取结构化数据?2. 有哪些稳健的方法识别一个文本中描述的实体和关系?3. 哪些语料库适合这项工作,我们如何使用它们来训练和评估我们的模型?7.1 信息提取#一个重要的...
  • 如何构建一个系统,用于从非结构化的文本提取结构化的信息和数据?哪些方法使用这类行为?哪些语料库适合这项工作?是否可以训练和评估模型? 信息提取,特别是结构化信息提取,可以类比数据库的记录。对应的...
  • 《Python自然语言处理》学习笔记--从文本提取信息标签 :NLP应用 NLTK 解决的问题构建有个系统,从非结构化文本中提取结构化数据;识别一个文本中描述的实体和关系;哪些语料库适合于这项工作,且如何使用它们来训练...
  • 基于电力大数据体系信息的爆炸式增长,挖掘其深度价值,本文在结构化表达和特征提取与分析等方面提出文本分析新方法。针对电力运维领域文本特征设计基于拼音统计的中文词向量生成模型;采用卷积神经网络和条件随机场...
  • 本章原文:...1.我们如何能构建一个系统,从非结构化文本提取结构化数据如表格? 2.有哪些稳健的方法识别一个文本中描述的实体和关系? 3.哪些语料库适合这项工作,我们如何使用它们来训练和评估我们的...
  • 《Python自然语言处理》学习笔记--从文本提取信息标签 :NLP应用 NLTK解决的问题构建有个系统,从非结构化文本中提取结构化数据;识别一个文本中描述的实体和关系;哪些语料库适合于这项工作,且如何使用它们来训练...
  • 常常在想,自然语言处理到底在做的是一件什么样的事情?到目前为止,我所接触到的NLP...这个系列文章【文本信息抽取与结构化】,在自然语言处理中是非常有用和有难度的技术,是文本处理与知识提取不可或缺的技术。...
  • 基于HMM的文本信息的结构抽取,邹莎莎,王秀坤,信息抽取技术是处理海量文本信息,实现信息结构化的有效途径之一。但目前的信息提取方法,大都局限于语义内容的提取,其结构是扁

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 643
精华内容 257
关键字:

文本提取结构化信息