基于字典标记句子

数据挖掘 Python nlp
2021-10-03 17:45:59

我很少说关键词——RAM、扬声器、品牌、显示器等。我已经制作了一本包含这些键可以具有的所有可能值的字典。喜欢 - RAM 可以有 12、12gb、12GB;显示器可以有 12 英寸、12 英寸、12 英寸。

给我一个标题说 - “Apple iPhone 5s (Space Grey, 16GB)”

我必须从这些标题中提取标记并映射到字典值并为每个标记分配适当的关键字。

喜欢这个 - 品牌 - 苹果,颜色 - 灰色,存储空间 - 16GB

我应该如何标记这些句子?仅靠空间来做是不​​够的——就像在这个标题中一样——“Samsung Guru Music 2 SM-B310E (White)”2 将是一个令牌,可以映射到 RAM,显示任何内容。

任何 NLP 库都会对此有所帮助吗?我正在使用 python 编码和 NLP 新手。

4个回答

查看 Python 的NLTK库,有一些函数可以方便地对句子进行标记。

如果几个词在你的语料库中多次出现,例如,,,'new''york'可以使用这个它适用于超过 2 个令牌。这样你就有了一个名为"new_york"

同样对于您的 dict,您可以使用this,它完全符合您的要求。

这似乎很适合正则表达式,但让我们先谈谈如何限制搜索空间,这样您就不必使用正则表达式。在您开始之前,尽管您需要确保您的要求是可能的 - 看起来您希望将 16 与存储匹配,将 12 与屏幕尺寸匹配,而最后不需要 GB 或英寸,这意味着您需要找到一些方法来区分这些数字。以下是有关如何进行这些限制的一些想法:

存储:这很可能是 2 的幂,(8, 16, 32, 64...) 所以你只需要检查字符串中是否有 2 的幂:

[storage in "iPhone 5s 16 GB" for storage in ["8", "16", "32", "64"]]

会返回给你[False, True, False, False],告诉你那里有一个 16。

显示:同样,这些可能受到很大限制 - 正如您所说,12、13 等。您可能会使用类似于我上面的存储技巧的东西而忽略试图找到英寸。

品牌、型号:这些应该非常简单——再次列出您要搜索的品牌,然后进行上面的列表理解。

如果这不起作用,您可以尝试正则表达式。它们比它们的价值更复杂,通常也更麻烦——它们很难阅读、维护,而且我经常被它们咬伤。然而:

python 中的正则表达式(?i)[0-9]+(\s|)GB将不区分大小写 ( (?i)) 搜索包含多个数字 0-9 ( [0-9]+)、零个或多个空格 ( \s*) 以及字母 GB ( GB) 之一的字符串。GB 将匹配大写或小写,因为(?i)选项是开头。打电话

re.search('(?i)[0-9]+\s*GB', "Apple iPhone 5s (Space Grey, 16GB)")

将返回一个匹配对象,为您提供匹配的字符串。

我发现正则表达式非常复杂,所以一般使用一个有用的网站来至少在我编码它们之前尝试捕获错误。

我一直在研究一个非常相似的问题,从发票信息中提取材料细节。一种显示出希望的方法是为每个“主食”标记创建一个字典列表的字典 - 在你的情况下,我相信这将是所有可能值的字典。每个标记都是一个键,每个值都是一个字典列表,每个字典都由在顶级键的句子中找到的所有其他标记、它们一起看到的频率以及与顶级的(平均)距离组成每个句子的关键。有了这个,我能够生成一个概率分布,描述每个子级别令牌相对于顶级令牌/键在句子中的存在和位置的可能性。

这显示了在与顶级标记/键一起出现时识别句子中数字标记代表什么度量的承诺。在您上面的示例中,它甚至可能导致“2”标记实际上映射到任何东西的低水平置信度,您可以在逻辑中对其进行编码以进行标记。例如,我发现如果一种材料可以具有长度 x 高度 x 深度的尺寸,那么任何给定的数字度量很可能是长度或高度,并且只有很少一部分时间可能是深度。然后我将该逻辑扩展为“向前迈进”并使用子级别的字典(即长度)来进一步推断识别出的下一个数字标记的可能性,依此类推。

这也导致能够根据来源/发布者概括句子中的特征(在您的情况下,这可能与制造商首选的命名约定方法相关。)

如果你必须使用 reflex,pythex.org 也是一个非常有用的测试工具。请记住,pythex 在 r'' 假设下运行,因此转义特殊字符可能会在编译器中产生不同的结果。

这种方法还假设您有大量数据可供试验——如果您的语料库太小或相同的词重复太频繁,许多 NLP/ngram/常用词方法不会很好。