我有480封电子邮件,每封邮件包含以下一个或所有值:
[人名, 学位, 工作/不工作, 职位]
例如,其中一封邮件如下所示:
嗨 Amy, 我想讨论一下 Bob。我看到他拥有计算机科学学位,这是三年前获得的,但他仍然失业。 我不知道他是否适合我们学院的初级程序员职位。 我会在这件事上给你回信。 谢谢
这封邮件在数据库中的对应条目如下:
Email_123 | Bob | 计算机科学 | 失业 | 初级程序员
虽然数据没有被标记,但我们仍然有一个数据库,可以查找从每封邮件中提取到四个字段的值。现在我的问题是,如何使用这480封邮件的语料库,通过机器学习/自然语言处理来学习和提取这四个字段。我是否需要手动标记所有这480封邮件,比如这样…
我想讨论一下<人名>Bob</人名>。我看到他拥有<学位>计算机科学</学位>学位,他获得了....
或者有更好的方法。比如这个(MarI/O – 视频游戏的机器学习) https://www.youtube.com/watch?v=qv6UVOQ0F44&t=149s
回答:
假设每封邮件每个字段只有一个值,且该值总是从邮件中原样复制,你可以使用像WikiReading这样的工具。
问题在于WikiReading是在470万个例子上训练的,所以如果你只有480个,这远远不够来训练一个好的模型。
我建议对你的数据集进行预处理,自动添加像你示例中的标签。类似这样,用伪Python代码表示:
entity = "初级程序员"entity_type = "职位"mail = "...[邮件文本]..."ind = mail.index(entity)tagged = "{front}<{tag}>{ent}</{tag}>{back}".format( front=mail[0:ind], back=mail[ind+len(entity):], tag=entity_type, ent=entity)
你需要调整大小写问题、多重匹配等情况。
有了标记的数据,你可以使用传统的命名实体识别系统,比如CRF。 这里有一个使用Python中的spaCy的教程。