Machine learning Spark:单词分类

Machine learning Spark:单词分类,machine-learning,apache-spark,nlp,Machine Learning,Apache Spark,Nlp,我有一个关于Spark中单词分类的问题。我正在研究一个简单的分类模型,它以一个单词(一个单词)作为输入,并预测被命名人的种族(它来自一个虚构的宇宙)。例如,Gimli->dwarf,Legolas->elf 我的问题是如何处理这些单词。我知道Spark包括两种特性矢量化方法,tf–idf和word2vec。然而,我很难理解它们,不知道该用哪一个 有人能给我解释一下并指导整个过程吗?。更重要的是,我想知道这些方法中哪一种最适合这种情况 谢谢首先,我们应该清楚,正确的方法将取决于数据* 此任务称为语

我有一个关于Spark中单词分类的问题。我正在研究一个简单的分类模型,它以一个单词(一个单词)作为输入,并预测被命名人的种族(它来自一个虚构的宇宙)。例如,Gimli->dwarf,Legolas->elf

我的问题是如何处理这些单词。我知道Spark包括两种特性矢量化方法,tf–idf和word2vec。然而,我很难理解它们,不知道该用哪一个

有人能给我解释一下并指导整个过程吗?。更重要的是,我想知道这些方法中哪一种最适合这种情况


谢谢

首先,我们应该清楚,正确的方法将取决于数据*

此任务称为语言检测语言识别。即使对于整个句子或页面,来自整个单词的向量也不是正确的方法。(它只适用于你在训练中实际遇到的名字,比如一个列表,没有真正的预测。)相反,你需要一个基于字符的n-gram模型。例如,在bigram模型中:
“Gimli”->“\G Gi im ml li i”

不幸的是,您不能使用开箱即用,因为它假定gram是一个单词,而不是一个字符

怎么办

您必须首先查找或写入,并将其应用于原始名称和进入系统的查询。(如果名称中有空格,也将其视为字符。)

然后,在中,这些字符n-gram是您的“单词”,包含所有单词(例如“_ggi im ml li i”)的字符串是您的“文档”

(如果您愿意,您现在可以使用NGram:将单词拆分为
['gimli']
,然后使用n=2的NGram应该相当于拆分为
['''G','Gi','im'…]

一旦您以这种方式构建了它,它将成为标准文档分类问题的一种味道(实际上是严格意义上的Spark术语中的“回归”),Spark已经解决了这一问题。需要注意的主要一点是,顺序很重要,不要使用像一袋单词一样对待顺序的方法。因此,尽管所有的Spark分类示例都是使用TF-IDF进行矢量化的(在您的案例中不会完全失败),但这将是次优的,因为我假设每个字符n-gram的顺序/上下文实际上是重要的

为了优化其准确性,可能会对字母表、特殊字符、区分大小写、词干等进行改进。这取决于您的数据-见下文。(如果您发布一个指向整个数据集的链接,那将非常有趣。)

:*关于它的数据和假设:
字符n-gram方法可以很好地识别地球上的实际人类语言。即使对于人类语言,也有类似于文本的名称类别的特殊情况,例如可以使用汉字,或者使用海地语或塔戈洛格语等语言,其中许多名称只是法语或西班牙语,或者波斯语或乌尔都语,它们只是阿拉伯语,发音不同,但拼写相同。)

我们知道主要人类语言中单词的基本问题和技巧,但据我们所知,您数据中的名称: -是随机字母还是混合字母 -包含特殊字符,如“/”或“\通常更可能出现在URL中 -是数字吗

同样有趣的是,它们与团体成员的关系如何。例如,可以是根据字母字符随机生成的名称,或者只是一个英文名称列表,或使用任何其他方法生成,然后随机分配到A类或B类。在这种情况下,无法预测尚未看到的姓名是否为A或B类的成员。也有可能As是以他们出生的那一周的哪一天命名的,而Bs是以他们出生的那一周的哪一天命名的。在这种情况下,这是可能的,但没有更多的信息

在另一种情况下,同样使用相同的生成器,但根据以下条件将名称分配给A或B: -字符/字节/元音/大写字母的长度即数字(<或>=某些截止值) -长度(偶数或奇数)。。。 在这些情况下,必须提取一组完全不同的特征

在另一个场景中,B的名称总是重复出现,比如“johnjohn”。在这种情况下,字符n-gram频率比随机猜测效果更好,但不是最佳方法


所以你总是需要一些关于这个问题的直觉。我们很难对人造世界做出假设,从你给出的两个例子中,我们可能会假设这些名字有点英国口音。最后,您必须尝试不同的方法和特性(理想情况下,您选择的任何分类器都会忽略无用的信号)。至少在现实世界中,像单词计数这样的功能,字符计数和字节计数实际上对这个问题很有用——它们可以扩展字符n-gram方法。

没有模型可以仅从名称预测物种的种族。
您可以使用Wikipedia或DBPedia创建所有可能的字符及其种族的查找字典,然后将名称传递给函数并获得种族。

如果数据量很大,并且您希望在较短的时间内完成此操作,则可以使用join并执行此操作。

Q:我想知道以下哪种方法最适合此情况。A:没有,那么最好的方法是什么?是否向模型提供字符串(名称)?谢谢,恐怕这不是回答,而是评论!我看到的例子都是TF-IDF的矢量化。在您的情况下,它不会失败,但我认为这将是次优的,因为我假设每个字符n-gram的顺序/上下文实际上很重要。我会用(我想你这样做的话,你实际上可以使用单格,即n=1,
['''G','I'…]
)来变换向量。但是如果不知道你的数据,我不能说——你应该试试