我想编写一个算法来将非结构化文本(带有比赛描述)转换为具有以下字段的结构化数据:
- 比赛开始日期(可选)
- 比赛结束日期
- 主要奖项
- 额外奖品(可选)
我有数百个文本示例,可用于模型学习。
如何处理这个任务?以防万一这很重要 - 首选语言是 Python。但我以前从未从事过此类任务。这样做的最佳做法是什么?
我想编写一个算法来将非结构化文本(带有比赛描述)转换为具有以下字段的结构化数据:
我有数百个文本示例,可用于模型学习。
如何处理这个任务?以防万一这很重要 - 首选语言是 Python。但我以前从未从事过此类任务。这样做的最佳做法是什么?
如果我猜对了,您想从非结构化文本中提取提到的实体。对我来说,这听起来像是命名实体识别 (NER) 问题。在您的情况下,我将定义以下实体:
您的文本现在可以使用这些实体进行标记或注释。您想构建一台机器,它将自动标记非结构化文本(自由文本)中遇到的实体。
我建议看一下条件随机场(CRF),这是一种经典的 NER 方法。还有循环神经网络 (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>.
注意文本的结构方式。现在每个单词要么是标签(被标签包围)要么根本没有标签(在任何标签之外)。这是构建文本的一种方式。这也是一些非结构化文本的期望输出。
机器看不懂文字和注释。您需要提出可以从每个单词中提取的特征。它可以是单词本身,前一个单词,下一个单词,左二元组,右二元组,长度为 1,2,3 的后缀,长度为 1,2,3 的前缀等等。我建议你看看斯坦福 NER 特征。
获得这些功能后,您需要创建一个训练集。训练集是您的注释文本(参见我的示例)转换为标签 + 特征信息。它可能看起来像这样
O feature1 feature2 ...
O feature1 feature2 ...
B-START_DATE feature1 feature2 ...
I-START_DATE feature1 feature3 ...
...
这基本上是说前两个词没有标记,但后两个词是实体 START_DATE 的一部分。
每一行本质上是一个单词,后面跟着它的特征。标签“O”是表示该词没有被标注的方式,用于 DATE 的标签 B- 和 I- 表示命名实体的第一个和第二个词(例如“july 1st”)。
句子可以用空行分隔。
准备好训练集文件后,就可以进行模型训练了。有了模型,您可以将其应用于任何非结构化数据(提取的特征)以提取所需的实体。
作为一种工具,我建议您使用 CRFSuite(也可用于 Python 绑定)。如果您愿意,我可以详细说明每个步骤。
寻找 NLTK,一个用于分析自然语言数据的 Python 包。有了它,您可以为人类编写的文本添加一些结构。