我有一个软件项目的需求列表,它是根据其前身的遗迹组装而成的。每个需求都应该映射到一个或多个类别。每个类别都包含一组关键字。我想做的是找到一种算法,该算法可以给我一个分数,对每个需求可能属于哪个类别进行排名。结果将用作对需求进行进一步分类的起点。
举个例子,假设我有这样的需求:
The system shall apply deposits to a customer's specified account.
和类别/关键字:
- 客户交易:存款、存款、客户、账户、账户
- 余额账户:账户、账户、借方、贷方
- 其他类别:foo、bar
我希望算法在类别 1 中对要求评分最高,在类别 2 中评分较低,而在类别 3 中完全不评分。评分机制与我无关,但需要传达类别 1 适用的可能性有多大比第 2 类。
我是 NLP 的新手,所以我有点不知所措。我一直在阅读 Python 中的自然语言处理 并希望应用其中的一些概念,但还没有看到任何非常适合的内容。我不认为简单的频率分布会起作用,因为我正在处理的文本太小了(一个句子。)
最佳答案
您可能想查看“相似性度量”或“距离度量”的类别(在数据挖掘术语中,这与“分类”不同。)
基本上,相似性度量是一种数学方法,您可以:
- 获取两组数据(在您的情况下为单词)
- 做一些计算/方程式/算法
- 结果是您有一些数字可以告诉您该数据有多“相似”。
对于相似性度量,这个数字是介于 0 和 1 之间的数字,其中“0”表示“完全不匹配”,“1”表示“相同”
因此,您实际上可以将句子视为一个向量 - 句子中的每个词都代表该向量的一个元素。对于每个类别的关键字列表也是如此。
然后您可以做一些非常简单的事情:取“cosine similarity”或“Jaccard index”(取决于您构建数据的方式。)
这两个指标的作用是获取两个向量(您的输入句子和“关键字”列表)并为您提供一个数字。如果您对所有类别都执行此操作,则可以对这些数字进行排序,以查看哪个匹配具有最大的相似系数。
举个例子:
从你的问题:
Customer Transactions: deposits, deposit, customer, account, accounts
因此您可以构造一个包含 5 个元素的向量:(1, 1, 1, 1, 1)。这意味着,对于“客户交易”关键字,您有 5 个词,并且(这听起来很明显,但是)每个词都出现在您的搜索字符串中。跟我在一起。
那么现在你来听听你的句子:
The system shall apply deposits to a customer's specified account.
这有来自“客户交易”集合的 2 个词:{deposits, account, customer}
(实际上,这说明了另一个细微差别:您实际上有“customer's”。这等同于“customer”吗?)
你的句子的向量可能是 (1, 0, 1, 1, 0)
此向量中的 1 与第一个向量中的 1 位于相同的位置 - 因为这些词是相同的。
所以我们可以说:这些向量有多少次不同?让我们比较一下:
(1,1,1,1,1) (1,0,1,1,0)
嗯。他们有 3 次相同的“位”——在第 1、3、4 个位置。它们仅相差 2 位。所以假设当我们比较这两个向量时,我们的“距离”为 2。恭喜,我们刚刚计算了 Hamming distance。 !汉明距离越小,数据越“相似”。
(“相似性”度量和“距离”度量之间的区别在于前者是标准化的——它给你一个介于 0 和 1 之间的值。距离只是任何数字,所以它只给你一个相对值.)
无论如何,这可能不是进行自然语言处理的最佳方式,但就您的目的而言,它是最简单的,并且实际上可能非常适合您的应用程序,或者至少作为一个起点。
(PS:“分类”——正如你在标题中所说的那样——会回答“如果你接受我的句子,它最有可能属于哪一类?”这个问题,这与说“多少我的句子与第 1 类比第 2 类更相似?”这似乎是您所追求的。)
祝你好运!
关于algorithm - 根据关键字组对文本进行分类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1490061/