如何从简短的纯文本描述中提取属性/标签?(NER、LLM、?)

如何从简短的纯文本描述中提取属性/标签?(NER、LLM、?)

我有一些简短的产品描述,希望将其转换为结构化的属性。

示例:

输入:

“La Lecciaia Cabernet Sauvignon 2017 – Red – 750ml”

输出:

Year = 2017Color = RedWeight = 750Weight Unit = ml

如果所有描述都采用这种格式,那么编写一个正则表达式就能轻松解决问题,但实际上存在许多不同的格式和细微差别。为每种格式硬编码逻辑变得越来越繁琐。在尝试创建一个通用解决方案时,我立即遇到了“基本”方法的问题:

  1. 有几个不同的数据提供商,每个提供商都有自己的格式。对于上面的例子,另一个提供商可能使用“(Red) 2017 La Lecciaia Cabernet Sauvignon 750 ML”。即使是同一个提供商,也可能有多种格式,并且这些格式可能会随时间变化。格式并不总是严格遵循的。

  2. 表达特定组件的方式有很多种。例如,重量可能以以下任何一种方式表达:“1.5L”、“1 1/2 Liters”、“1500ml”等。

  3. 描述的某些部分可能会被误认为是目标组件。例如,可能有一个名为“Red Head Vineyard”的品牌的白葡萄酒。重量“2000 ml”可能会被误认为是年份等。我在这里仅使用这些葡萄酒示例是为了向一般受众简化说明,但我的产品领域存在相同的问题概念。

  4. 我认为这更像是“有益但非必要”的功能,但能够解析出更多细节会很有用,比如算法能够智能地识别“La Lecciaia”是品牌,而“Cabernet Sauvignon”是葡萄品种。假设这需要更多的前期工作,并且更难做到正确,但如果有直接的方法可以做到这一点,了解一下会很好。

我想开发一个通用函数,可以接受任何格式的描述。我对NLP/人工智能几乎没有经验,但怀疑有我可以利用的有用工具/算法。我有1000多个示例记录,可以用来训练模型。最好是能在本地运行,但这不是绝对必要的。

我不是在寻找具体的实现,而是希望从处理过类似问题的人那里获得指导。开放接受混合方法,其中一些额外的逻辑或人工监督可以解决初始的不准确性。

感谢任何关于方法或建议学习资源的见解。

我在网上查找了信息,但许多方法涉及大量的前期工作,并且不清楚它们在实际操作中是否有效。


回答:

LLM在这方面会表现得很好。我之前做过类似的任务,效果很好,几乎不需要训练。请记住,任何统计方法(NLP / LLM / NER)都不会100%准确,但就实际用途而言,我发现LLM比定制的正则表达式组合更准确。

对于你的任务,我会使用像Langchain这样的框架,以及以下提示(请注意,你可能需要对提示进行一些调整,这只是一个示例)。当与模型一起运行时,它将创建一个XML输出,这将很容易解析。你可以修改提示以创建不同类型的输出。但是,个人而言,我发现XML对我来说非常有效。

你是一个设计用于将葡萄酒瓶描述解析为结构化数据的AI语言模型。你将被提供一个葡萄酒瓶描述,你的任务是提取以下组件:- **Year**:葡萄酒的年份。- **Color**:葡萄酒的颜色(例如,Red, White, Rosé)。- **Weight**:葡萄酒瓶的体积,以数字表示(例如,750, 1500)。- **Weight Unit**:重量的测量单位(例如,ml, mL, L, Liters)。- **Brand**:葡萄酒的品牌或生产商。- **Grape Variety**:使用的葡萄品种(例如,Cabernet Sauvignon, Merlot)。**Instructions:**- 葡萄酒描述可能有多种格式,并且可能包含额外或令人困惑的信息。仔细分析描述以准确提取组件。- 注意潜在的歧义。例如:  - 品牌名称可能包含“Red”或“White”等词(例如,“Red Head Vineyard”),这些不应与葡萄酒颜色混淆。  - 大数字可能代表重量(例如,“1500 ml”),而不是年份。- **不要假设描述中不存在的信息。**如果某个组件缺失,你可以将相应的标签留空或省略。**Output Format:**以XML格式提供提取的信息,使用以下结构:<Wine><Year>{{Year}}</Year><Color>{{Color}}</Color><Weight>{{Weight}}</Weight><WeightUnit>{{WeightUnit}}</WeightUnit><Brand>{{Brand}}</Brand><GrapeVariety>{{GrapeVariety}}</GrapeVariety></Wine>**Examples:**  1. **Input:** `La Lecciaia Cabernet Sauvignon 2017 – Red – 750ml` **Output:**```xml   <Wine>     <Year>2017</Year>     <Color>Red</Color>     <Weight>750</Weight>     <WeightUnit>ml</WeightUnit>     <Brand>La Lecciaia</Brand>     <GrapeVariety>Cabernet Sauvignon</GrapeVariety>   </Wine>   ```      `Red Head Vineyard Chardonnay 2020 1.5L`   **Output:**   <Wine>     <Year>2020</Year>     <Color></Color>     <Weight>1.5</Weight>     <WeightUnit>L</WeightUnit>     <Brand>Red Head Vineyard</Brand>     <GrapeVariety>Chardonnay</GrapeVariety>   </Wine>     **Task:**        给定以下葡萄酒描述,提取组件并按指定的XML格式提供输出。        {win_description}

请记住,运行LLM的成本不低。但鉴于该领域的模糊性,这很可能是最佳选择。对于这个特定任务,使用OpenAI服务,每个标签的成本将是1/1000美分。你可能会找到更便宜的模型/提供商。然而,在使用LLM时,首先确保准确性,然后再优化成本非常重要。

整个过程对于中级LLM开发者来说可能需要1-2小时来构建。如果你是初学者,时间可能会有所不同。但这是一个学习LLM的完美项目

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注