我想用以下字段编写一个算法,将非结构化文本(带有竞赛描述)转换为结构化数据:
我有数以百计的文本例子,可以用来学习模型。
如何处理这一任务?万一这很重要,最好的语言是Python。但我以前从来没有做过这样的工作。这样做的最佳做法是什么?
发布于 2015-07-21 17:45:54
如果我说得对,您希望从非结构化文本中提取提到的实体。这听起来像命名实体识别(NER)问题对我来说。在您的情况下,我将定义以下实体:
您的文本现在可以使用这些实体进行标记或注释。您希望构建一台机器,它将自动标记非结构化文本(免费文本)中遇到的实体。
我建议看一看条件随机场(CRF),一种经典的方法。也有递归神经网络(RNN),这是最新的序列建模,但我不是专家对这些方法。
让我们开始建模的过程。你需要决定什么将是一个单一的训练例子。这可以是一个句子,也可以是一个段落。
既然你没有提供任何例子,让我提出两个例子:
The contest started on <START_DATE>july 1st</START_DATE> and ended on <END_DATE>july 25</END_DATE>.
The winner got away with <MAIN_PRIZE>1 million dollars</MAIN_PRIZE> and <EXTRA_PRIZE>bunch of flowers</EXTRA_PRIZE>.注意文本的结构方式。现在的每个单词要么是标签(被标签包围),要么根本没有标签(任何标签之外)。这是如何构造文本的一种方式。这也是对一些非结构化文本的期望输出。
机器不理解文字和注释。你需要想出你可以从每个单词中提取出来的特征。它可以是单词本身,前一个词,下一个单词,左bigram,右bigram,长度1,2,3的后缀,长度1,2,3的前缀等等。我建议你看看斯坦福大学的特征。
一旦获得了这些特性,就需要创建一个培训集。培训集是转换为label +的带注释的文本(参见我的示例)。它可能看起来像这样
O feature1 feature2 ...
O feature1 feature2 ...
B-START_DATE feature1 feature2 ...
I-START_DATE feature1 feature3 ...
...这基本上是说前两个单词没有标签,但最后两个词是实体START_DATE的一部分。
每一行本质上都是一个单词,后面跟着它的特性。标签"O“表示该词没有标签,标号B-和I-表示命名实体的第一个和第二个单词(例如”7月1日“)。
句子可以用空行隔开。
一旦您准备好了培训集文件,就可以进行模型培训了。有了手头的模型,您可以将其应用于任何非结构化数据(提取的特性),以获取所需的实体。
作为一种工具,我建议您使用CRFSuite (也可以使用Python )。如果你愿意的话,我可以详细说明每一步。
发布于 2015-07-21 19:03:19
查找NLTK,一个用于分析自然语言数据的Python包。使用它,您可以添加一些结构到文本中,如人类所写的。
https://datascience.stackexchange.com/questions/6530
复制相似问题