Javascript 识别不同的词类
我有一个网上商店的大量服装清单。Javascript 识别不同的词类,javascript,algorithm,nlp,pseudocode,linguistics,Javascript,Algorithm,Nlp,Pseudocode,Linguistics,我有一个网上商店的大量服装清单。 每个条目由一个主要单词(如衬衫、夹克)和一个或多个属性(如尺寸、颜色)组成 衣服可能具有以下属性: 尺寸:XS、S、M、L、XL 颜色:GREEN,红色,BLUE 类别:SPORT,BUSINY,CASUAL 性别:MALE,FEMALE,UNI性别 让我们看一个例子 SPO SHIRT L CAS SHIRT M GRE CAS SHIRT L RED BUS SHIRT XS RED CAS SHOES SHOES BLACK JACKET FE
每个条目由一个主要单词(如衬衫、夹克)和一个或多个属性(如尺寸、颜色)组成 衣服可能具有以下属性:
- 尺寸:XS、S、M、L、XL
- 颜色:GREEN,红色,BLUE
- 类别:SPORT,BUSINY,CASUAL
- 性别:MALE,FEMALE,UNI性别
SPO SHIRT L
CAS SHIRT M GRE
CAS SHIRT L RED
BUS SHIRT XS RED
CAS SHOES
SHOES BLACK
JACKET FEM M
JACKET FEM GRE
CAS JACKET MA RED
这些项目由人类填充,因此不一致。不是每个条目都有每个属性。它们的顺序也可能不同
现在我想自动识别主要单词和属性。我还想将属性分组,如上图所示 一个示例输出就是一组单词
- 关键词:衬衫,鞋子,夹克
- 属性:L,M,XS,GRE,RED,CAS,SPO,BUS,FEM
- 五十、 M,XS
- SPO、CAS、总线
- GRE,RED
我已经知道:
- 相同类别(=相同语义)的属性是相互排斥的。所以一件衬衫只能有一种尺寸、一种颜色等
- 属性的数量远远高于主词的数量。
- 例如,有5种不同的鞋子,但L码会出现20次(与其他衣服)
一种可能的解决方案是使用
更新过滤单词:
记住:在这种情况下,数据越多,算法就越精确。但是,如果只有几行具有许多属性,那么几乎所有算法都会失败。另外>=3的东西将失败的黑色和它的产品名称是领带,所以我们将不得不寻找一个好的算法
下面是我对这个问题的看法
解析数据,并根据其他唯一单词为每个项目创建每个唯一单词的矩阵。这将给出哪个单词在哪个顺序中使用的统计信息,以及与该顺序中的哪个单词相关的统计信息。这也将给出一个单词在顺序中使用频率的统计信息
我建议创建或(从某处导入)一个人类可识别颜色名称的列表,因为颜色名称是全局的,若它是蓝色的,那个么人们会将它写为蓝色。这将有助于识别颜色
一旦确定了颜色,我们可能就可以寻找性别了。当然,如果一个人是女性,那么他写这篇文章的概率是F或FEM或女性。因此,我们必须找到与性别名称最接近的匹配项
现在以c.slice(0,3)为目标,
类别列表:“运动、商务、休闲”。拆分(',).map((c)=>c.slice(0,3)),
性别列表:[“MA”、“FEM”、“UNI”],
项目清单:“鞋、衬衫、夹克”。拆分(“,”)
};
让items=text.split(/\n/).filter((line)=>!!line.trim()).map((line)=>{
line=line.trim();
让item={};
行分割(“”).forEach((w)=>{
Object.key(令牌).forEach((t)=>{
代币[t]。包括(w)和(项目[t.replace”(“U列表”,简称“))=w);
});
});
退货项目;
})
document.write(JSON.stringify(items,0,4));
}());代码>查找主要单词正是封面的问题
让我们假设每个单词都是主词或属性词——也就是说,没有单词有时用作主词,有时用作属性。然后问题是将每个单词分类为主单词或属性单词——或者等价地,以确定所有单词的子集,这些单词都是主单词(因为其余的单词必须是属性单词)。我们对属性词了解不多,只是它们应该很常见。但是我们知道一些关于主要单词子集的更明确的信息:每个产品在这个子集中必须只包含一个单词
这个问题可以建模为寻找一个,其中基本集(需要“覆盖”的项目集)是所有产品的集合,每个词都给我们一个集合,我们可以潜在地使用它来覆盖一些基本集元素:即使用该词的产品集。这个问题的一个解决方案是一个单词子集,其对应的产品集一起包含每个产品一次,也就是说,它将是主单词的候选集
不幸的是,找到一个精确的覆盖是一个NP难问题,所以没有有效的算法可以精确地解决这个问题
整数线性规划的形式
然而,通常情况下,通过将问题表示为一个问题,并使用ILP解算器(如免费提供的或昂贵的(但速度更快)来解决问题,可以找到准确答案或高质量的启发式答案。有两种方法:
- 使用整数LP精确地解决问题:这可能需要很长时间,但如果存在,则可以保证找到精确的解决方案
- 使用普通的连续LP启发式地解决问题:这将花费相当短的时间,即使是对于较大的输入大小,但通常不会找到可行的解决方案。大多数变量不是被指定为1或0,而是由解算器在[0,1]范围内的某个地方指定一个值,该值通常可以解释为置信度得分,并简单地四舍五入到0或1。这样做并不能保证获得最佳甚至可行的解决方案,但通常可以通过执行此舍入,然后“纠正”任何违反可行性的情况(特别是,没有指定主词的任何产品,或[编辑7/3/2016]任何
p_i_1*x_1 + p_i_2*x_2 + ... + p_i_n*x_n = 1.
x_1 + x_2 + ... + x_n
1 BLACK
2 BUS
3 CAS
4 FEM
5 GRE
6 JACKET
7 L
8 M
9 MA
10 RED
11 SHIRT
12 SHOES
13 SPO
14 XS
Minimize
x_1 + x_2 + x_3 + x_4 + x_5 + x_6 + x_7 + x_8 + x_9 + x_10 + x_11 + x_12 + x_13 + x_14
Subject To
x_13 + x_11 + x_7 = 1
x_3 + x_11 + x_8 + x_10 = 1
x_3 + x_11 + x_7 + x_10 = 1
x_2 + x_11 + x_14 + x_10 = 1
x_3 + x_12 = 1
x_12 + x_1 = 1
x_6 + x_4 + x_8 = 1
x_6 + x_4 + x_5 = 1
x_3 + x_6 + x_9 + x_10 = 1
Binary
x_1 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10 x_11 x_12 x_13 x_14