我在寻找关于以下问题的想法/想法:
我正在处理食品成分数据,如:牛奶,糖,鸡蛋,面粉,可能含有坚果
从这样一段文本中,我希望能够识别和提取短语,如可能包含坚果,分别预处理它们
这类短语在长度和内容上可以有很大的变化。我想使用NER标记器,但我不知道它们是否会正确地完成这项工作,因为它们主要用于识别单词实体…
关于使用什么作为短语实体识别系统有什么想法吗?还有,你会用哪个包装?欢呼声
对于这个特殊问题,单独使用NER(或一般的基于模型的实体提取)是一个糟糕的方法选择,因为它需要大量的手动注释才能正确完成。相反,我建议使用Word2Vec (https://radimrehurek.com/gensim/models/word2vec.html)和措辞(https://radimrehurek.com/gensim/models/phrases.html)。
这个想法是有一个无监督的模型,包含短语和它们的相似性,然后可以使用一些种子词来查询,列出所有可能的成分(例如"cat"产生类似的单词,如"dog"或"rat"。下一步是创建包含单词&短语或尝试使用每个单词/短语对之间的余弦相似度聚类模型的词汇。现在,如果你想更进一步,你可以总是将你创建的字典/集群匹配回W2V模型所训练的语料库,然后使用这些匹配训练自定义实体识别模型,就像你现在有注释的例子一样。
我认为这是一个Multiword-Expression问题。
有几种方法可以尝试解决这个问题:
- 建立命名实体识别模型(NER)
- 用正则表达式搜索一组固定的已知短语
- 用POS标签分块令牌
- 查找令牌的搭配
让我们看看这些
建立命名实体识别模型(NER)
命名实体识别标记一个实体类型的令牌的已知范围对于每个输入令牌,您必须将其标记为已知命名实体的一部分。
Eddy N PERSON
Bonte N PERSON
is V O
woordvoerder N O
van Prep O
diezelfde Pron O
Hogeschool N ORG
. Punc O
这是昂贵的,需要大量的时间来标记。对于你的任务来说,这可能不是一个好的选择。
用Regex搜索
这不是一个坏主意,使用一些已知的短语,你可以很容易地搜索输入文本与最小的词边界的上下文。
import re
re.findall(r"bmay contain nutsb", text)
这需要你事先知道你想要搜索的所有短语,这可能是不可能的。
用POS标签分块令牌
这可能是一个很好的中间步骤,但可能会产生许多假阳性。
您可以在知道您期望的POS标签序列的情况下执行此操作
may MD
contain VB
nuts NNS
则可以对已知的标签序列(MD, VB, NNS
)进行分块处理。问题是您可能不知道这一点,并且必须捕获许多用例。它还将捕获许多您不想捕获的序列(False Positive)
查找令牌的组合
这可能是最好的方法,因为看起来你正在寻找语料库中非常常见的单词(标记)序列。
你可以使用:
<<ul>两者都做同样的事情,它们寻找语料库中出现的统计学上常见的标记序列。
然后可以用来从新的文本中提取相同的搭配短语。
看起来你的成分表很容易分割成一个列表。在这种情况下,你真的不需要序列标记器;我不会把这个问题作为短语提取或NER。我要做的是训练一个分类器对列表中的不同项目进行分类,将它们标记为"食物";或";non-food"。你应该能够从规则开始,用任何东西训练一个基本的分类器。
在训练模型之前,一个更简单的步骤是通过PoS标记器(比如spaCy)运行每个列表项,如果有一个动词,你可以猜出它不是食品。