SpaCy文档和样本显示,PhraseMatcher类对于匹配文档中的标记序列很有用。必须提供将要匹配的序列的词汇表。
在我的应用程序中,我有一些包含标记和短语的文档。有不同类型的实体。数据是远程自然语言(文档是一组具有半随机顺序的关键字)。我正在尝试查找多种类型的匹配项。
例如:
yellow boots for kids
如何使用SpaCy的PhraseMatches查找颜色(例如黄色),产品类型(例如靴子)和年龄(例如孩子)的匹配项?这是一个好用例吗?如果不同的实体匹配重叠(例如,颜色在颜色列表和材料列表中匹配),是否可以产生所有唯一的情况?
我真的不能使用序列标记器,因为数据结构松散且充满歧义。我有一个实体列表(例如颜色,颜色,产品类型)和关联的值列表。
一种想法是实例化多个PhraseMatcher对象(每个实体一个),分别进行匹配,然后合并结果。每种实体类型都有自己的词汇表。这听起来很简单,但效率不高,尤其是合并部分。值列表相当大。在走这条路线之前,我想知道这是一个好主意还是使用SpaCy做到这一点的简单方法。
spaCy PhraseMatcher
支持添加包含多个模式的多个规则,并为您添加的每个匹配器规则分配ID。如果两个规则重叠,则将返回两个匹配项。因此,您可以执行以下操作:
color_patterns = [nlp(text) for text in ('red', 'green', 'yellow')]
product_patterns = [nlp(text) for text in ('boots', 'coats', 'bag')]
material_patterns = [nlp(text) for text in ('silk', 'yellow fabric')]
matcher = PhraseMatcher(nlp.vocab)
matcher.add('COLOR', None, *color_patterns)
matcher.add('PRODUCT', None, *product_patterns)
matcher.add('MATERIAL', None, *material_patterns)
当您在matcher
上调用时doc
,spaCy将返回一个(match_id, start, end)
元组列表。因为spaCy将所有字符串存储为整数,所以match_id
返回的字符串也将是整数–但是您始终可以通过在词汇表中查找它来获取字符串表示形式StringStore
,即nlp.vocab.strings
:
doc = nlp("yellow fabric")
matches = matcher(doc)
for match_id, start, end in matches:
rule_id = nlp.vocab.strings[match_id] # get the unicode ID, i.e. 'COLOR'
span = doc[start : end] # get the matched slice of the doc
print(rule_id, span.text)
# COLOR yellow
# MATERIAL yellow fabric
添加匹配器规则时,您还可以将on_match
回调函数定义为的第二个参数Matcher.add
。如果您想触发特定的操作,这通常很有用–例如,如果COLOR
找到匹配项,则做一件事,然后为PRODUCT
匹配项做其他事情。
如果您想更优雅地解决此问题,则可能还需要考虑将匹配器与自定义管道组件或自定义属性结合使用。例如,您可以编写一个简单的组件,当您调用nlp()
文本,查找匹配项并设置Doc._.contains_product
或Token._.is_color
属性时,该组件会自动运行。文档中有一些示例,可以帮助您入门。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句