近年来,开源软件得到了越来越广泛的使用.通常一个开源软件社区有几十万的开源软件,比如:开源软件社区Ohloh中有超过50万个开源软件项目,代码总量超过200亿行;开源软件社区Sourceforge中有超过43万个开源软件项目;开源软件社区Freecode中有超过4万个开源软件项目.全世界开源软件的总量已经超过200万个.如此巨大的数据量,使得用户想要正确地检索到所需的开源软件成了一个巨大的挑战.因此,许多开源社区开始使用标注(tag)进行软件检索. 标注是一个语义很明确的词,它通常指软件具有某种功能或特性.用一个或一组标注就可以精确描述某种类型的开源软件,这样,用户就能够精确地检索到所需的软件.现在,给软件加标注是人工完成的.人工的过程代价很大并且很耗时,所以,软件开发者在上载软件项目时不愿意为软件提供充分多的标注.因此,为了便于用户检索开源软件,为刚上传的软件自动从备选标注中挑选合适的标注成为了关键.
已经有一些工作是关于开源软件自动标注[1,2],这些工作都是将其建模为一个标注推荐问题,首先计算出各个软件与各个标注之间的相关性,然后为每个软件推荐k个最相关的标注.标注数量k是人为设定的,比如5或者10.然而,开源社区中的软件标注数量通常是不固定的,有的软件只有两三个标注,有的软件却有几十个标注.给开源软件加固定数量的标注显然是不合适的,有的软件会获得过多的标注,有的软件则会漏掉一些标注.如果能够为开源软件正确提供恰当数量的标注,则会降低数据的噪声,有利于软件检索性能的提高.
为了实现上述目标,本文把开源软件自动标注形式化为一个代价敏感多标记学习问题.图 1是开源软件社区Freecode中对软件Linux的介绍,注意到:图上方的一段文字是对软件的总体描述,描述下面是对软件的标注,软件描述与软件标注是相互补充的[1].把从软件的描述信息中提取出属性看作示例,把软件的多个标注(tag)当作多个标记(label).ML-KNN[3]是一种有效的多标记学习方法,在很多文本的多标记分类中取得了良好的性能[4,5,6].然而,在开源软件自动标注问题上直接使用ML-KNN却难以获得较好的性能.其原因在于:开源软件社区中软件的功能和用途往往多种多样,这造成了学习器面临的备选标注集合相对较大且具有某个标注的示例往往远少于不具有该标注的示例.图 2是3个开源软件社区Freecode,Ohloh,Sourceforge中不同标注的分布,横轴表示对于某个标签而言具有该标注的示例数量占总示例数量的比例,纵轴表示不同标注的数量.从图 2中可以看到:对于绝大多数标注而言,具有该标注的示例数量占总示例数量比例少于5%.这会直接造成对于每个标注而言,示例具有该标注的先验概率很小,而因为ML-KNN是根据后验概率来决定某个示例是否具有某个标注,所以结果导致ML-KNN趋向于把所有示例都预测为不具有该标注.
![]() | Fig. 1 The profile of Linux in Freecode图 1 Freecode中Linux的介绍 |
![]() | Fig. 2 The tag distributions in 3 open source repositories 图 2 3个开源软件社区中标注的分布 |
针对这一问题,本文提出了一种代价敏感多标记学习方法ML-CKNN(multi-label cost-sensitive k nearest neighbors).该方法受ML-KNN启发,通过引入错误分类代价,让学习器更加关注对于每个标注而言具有该标注的示例,在一定程度上缓解因标注数量众多造成的示例分布不均衡给多标记学习造成的影响.在3个开源软件社区上的实验结果表明:本文提出的ML-CKNN方法能够为新上载的开源软件提供高质量的标注,其标注性能显著优于现有方法.
本文第1节介绍相关工作.第2节正式提出算法ML-CKNN.第3节汇报实验结果.第4节总结全文.
1 相关工作 1.1 软件标注推荐已有一些研究工作是关于开源软件的标注推荐问题.Wang等人[1]使用话题模型Labeled LDA来进行开源软件的标注推荐,在其工作中,首先利用Labeled LDA发现软件标注和软件描述的语义相关性,然后构建基于标注的话题与词之间的矩阵,根据产生的矩阵,使用一个简单的算法来检测软件潜在的话题,这些话题也就是软件的标注.Xia等人[2]提出了一种软件标注推荐的方法TagCombine,这种方法包含3个部分:一是多标记排序组件,这个组件把软件标注推荐看作一个多标记排序问题;二是基于相似度的标注排序组件,它使用相似的对象来推荐标注;三是基于标注-词的标注排序组件, 它考虑了不同词与标注之间的关系,比如标注与词的共生关系,然后根据对象中的词推荐标注.与本文工作不同,上述工作的目标是软件标注推荐,所推荐的软件标注数量是人为提前设定的,这样通过人为设定的标注数量可能与软件真实的标注数量并不匹配,比如:人为设定推荐的标注数量通常为5或者10,而软件真实的标注数量可能为1~30之间的任意一个数.而本文使用代价敏感的多标记分类来解决这个问题,并不需要预先设定推荐的标注数量.
1.2 多标记学习已经有很多多标记学习算法被提出来.BR(binary relevance)算法是一种常用的问题转换算法,它为标注集合中每个不同的标注学习一个二元分类器.原始的数据集被转换为q个数据集,q为标注的数量,每个标注对应一个数据集.在转换得到的数据集中,如果示例具有对应的标注,则被标记为正类;否则,被标记为负类.BR把q个二元分类器的分类结果合并起来,得到最终的分类结果[7].这样,就能把一个多标记学习问题转化为一个单标记学习问题.LP(label powerset)算法使用了另外一种问题转换方式,它把训练集中每个独特的标注集合看成一类,这样多标记学习问题就转化为一个单标记多类学习问题[7].LP算法的计算复杂度与独特标注集合的数量有关,这可能会导致复杂度问题.RAkEL算法(random k-label sets)[8]是一个集成方法,它的基分类器是LP分类器,每个LP分类器使用标注集合的不同子集.这样,RAkEL算法既能考虑到不同标注之间的相互关系,也能够有效避免LP算法的计算复杂度问题.这些方法与本文提出的ML-CKNN的区别在于:这些方法处理的是一般的多标记学习问题,在类别平衡的数据集上能够取得很好的效果;而本文提出的ML-CKNN是一个代价敏感的多标记学习方法,尤其适用于类不平衡的数据集.开源软件数据集是一个类很不平衡的数据集,对于每个标注而言,具有该标注的示例远少于不具有该标注的示例,所以适合使用ML-CKNN来解决开源软件分类问题.
Lo等人[9]提出了一种代价敏感的多标记学习方法,但是他们处理的问题与本文是完全不同的.他们认为:一段音频被标注过多次,其标注具有很高的置信度;被标注过较少次的标注具有较低的置信度,可能为噪声数据.对于一段音频,他们把某个标注被标注的次数看作误分类的代价,这样,具有较高置信度的标注就不太容易被误分类.而ML-CKNN要处理的是类别不平衡问题,对于每一个标注,把具有该标注的示例预测为不具有该标注会产生较大的代价;反之,则只会产生较小的代价.这样,分类器就不再趋向于把所有软件都预测为不具有该标注.
2 代价敏感的k近邻多标记分类方法ML-CKNN本文使用X表示样本空间,使用Y表示标注的集合.使用T表示训练集,S表示测试集.训练集T与测试集S都可以看作是从一个未知分布D中独立同分布采样得到.多标记学习算法的任务是:根据训练集T,训练得到一个多标记分类器h:X®2Y,h在测试集S上最优化某种评价指标.
ML-CKNN受著名的多标记学习算法ML-KNN[3]启发,在ML-KNN的基础上引入了代价敏感性,并且改变了距离度量的方式,更加适合解决开源软件多标记分类问题.
使用yi表示示例xi所具有的标注向量,如果标注l为示例xi的标注,则yi(l)取值为1;否则,yi(l)取值为0.使用N(xi)表示示例xi在训练集T中所具有的k近邻.基于示例xi近邻的标注集合,可以得到一个计数向量Ci(l),Ci(l)表示示例xi近邻中具有标注l的示例数量,定义如下:
对于每个测试示例xi,ML-CKNN首先使用余弦距离找到示例xi在训练集T中的k近邻N(xi).这里与ML-KNN使用欧几里得距离不同,余弦距离更适合本文所处理的开源软件分类问题,因为示例的属性是从文本中提取出来的.使用来表示示例xi具有标注l,与其对应,使用表示示例xi不具有标注l.使用(jÎ{0,1,2,…,k})来表示示例xi的k近邻中恰好有j个示例具有标注l.根据计数向量Ci(l),标注向量yi可以用如下的最大后验概率准则得到:
利用贝叶斯定理,公式(2)可以写成这样的形式:
由于分母对最终的结果没有影响,所以公式(3)与下式等价:
ML-CKNN与ML-KNN一样都使用了贝叶斯概率,ML-KNN直接使用了公式(4)做出最后的分类和排序,这在类别平衡的情况下能够取得很好结果;但在开源软件分类问题上却并不十分适合.在开源软件问题上,一个标注只被很少一部分软件所具有,比如在有5 000个软件的开源软件数据集中,很大一部分标注只被10个软件所具有.这样,对某个标注l而言,示例xi的最近邻N(xi)可能全部不具有该标注,这样就不太可能预测示例xi带有标注l.除此之外,的值往往要比小很多,即使与
相近,分类器也趋向于把示例xi预测为不具有标注l.所以,这里不能直接使用公式(4)来做出最后的分类.
以往有很多研究工作通过改变原始训练数据的分布来引入代价敏感性[10],但这种方式在多标记学习问题中很难使用.因为对于不同的标注而言,正类样本与负类样本是不同的,也就很难进行重采样.本文的创新之处在于并没有通过重采样来引入代价敏感性,而是通过改变示例具有标注的置信度的方式来引入代价敏感性.具体来说,假设c为代价值,那么可以让最终示例xi具有标注l的置信度为(即为了提高示例xi被预测为具有标注l的可能性):
其中,为原始ML-KNN预测示例xi具有标注l的后验概率(略去了分母,对最终结果没有影响),这里将这个值增大了c倍,同时对其进行了规范化,使得最终的置信度大于等于0并且小于等于1.分母中,
为原始ML-KNN预测示例xi不具有标注l的后验概率(略去了分母),这样提高了算法预测示例xi具有标注l的可能性.而示例xi不具有标注l的置信度为
这使得的取值范围也在0到1之间,并且保证
与
的和为1.如果
,即
≥ 0.5,则判定示例xi具有标注l;否则,判定示例xi不具有标注l.
这样取得的效果与改变原始数据的分布相似,使得最终的分类器不再趋向于把示例预测为不具有标注l.
算法1是算法ML-CKNN的伪代码,ML-CKNN与ML-KNN的算法框架基本相同,在关键的部分却有着本质的不同.ML-CKNN的输入T表示训练集,k表示用户设定的最近邻数量,xt表示测试示例,s表示平滑因子,c是用户设定的代价值.算法的输出yt表示示例xt的标注向量,rt表示标注与示例xt的相关度值向量,越相关的标注值越大.算法的第(1)行、第(2)行首先计算出先验概率,即对每个标注而言,具有该标注的示例与不具有该标注的示例在训练集中出现的概率.接着,第(3)行使用余弦距离在训练数据T中找出示例xi的k近邻,这与ML-KNN使用欧几里得距离是不同的.然后,第(4)行~第(13)行计算了条件概率
,bÎ{0,1},jÎ{0,1,2,…,k}.算法的第(14)行~第(18)行计算了测试示例xt的标注向量yt和测试示例xt对应的标注相关度值向量rt,其中:第(14)行使用余弦距离在训练集中找出测试示例xt的k近邻N(xt),这与原始的ML-KNN是不同的.算法的第(17)行计算示例xt是否具有标注l,这里与原始的ML-KNN显著的不同,原始的ML-KNN使用最大后验概率原则计算出每个示例xt是否具有标注l;而ML-CKNN引入了代价敏感性,使用下面这种方式计算出示例xt是否具有标注l:
算法1. MK-CKNN.
输入:
T:训练数据;k:最近邻的数量;xt:测试示例;s:平滑因子;c:代价值;
输出:
yt:标注向量;rt:标注相关度值向量.
//首先从训练数据中计算出先验概率
(1) for lÎY
(2)
//计算条件概率
(3) 使用余弦距离在训练集中找出最近邻N(xi),iÎ{1,2,…,n};
(4) for lÎY
(5) for jÎ{0,1,…,k}
(6) d[j]=0; d¢[j]=0;
(7) for iÎ{1,2,…,n}
(8)
(9) if (yi(l)==1) then d[m]=d[m]+1;
(10) else d¢[m]=d¢[m]+1;
(11) for jÎ{0,1,…,k}
(12)
(13)
//计算示例xt的标注向量yt和标注相关度值向量rt
(14) 使用余弦距离在训练集中找出最近邻N(xt);
(15) for lÎY
(16)
(17)
(18)
如今,全世界已经有很多开源软件社区,比较著名的有Sourceforge,Ohloh,Freecode和Googlecode.这些开源软件社区都包含上万甚至几十万的开源软件.每个开源软件都包括描述信息和标注信息.图 1展示了开源软件社区Freecode中Linux的介绍,其中包括软件的文本描述信息和标注信息.注意到软件的文本描述信息和标注信息通常是相互补充的[1],本文想利用软件的文本描述信息自动地给软件加标注.正式地说,本文把每一个开源软件看作一个示例,把描述信息看作示例的属性,把标注信息看作示例的多个标记.因为开源软件的标注数量是不固定的,所以数据集中每个示例的标记数量也是不固定的.
目前还没有直接可用的开源软件数据集,我们实现了一个爬虫程序,从Sourceforge,Ohloh,Freecode网站上把每一个软件的文本描述信息和标注信息都爬取了下来,保存在3个不同的文件中.从文本中抽取出属性进行分类通常会使用TF-IDF属性,TF-IDF即词频乘以逆向文件频率.我们把一个软件的描述信息看作一个文档,把不同的软件的描述信息看作不同的文档,从中抽取出TF-IDF属性.当然,在抽取出TF-IDF属性之前需要先对原始数据进行预处理,首先将描述信息中的停止词去掉,然后对描述中的词进行主干化,主干化是为了让英文中同一个词的不同形式,还原到同一个主干形式.这样不仅能降低属性的维度,也能提高分类的 效果.接着,我们选择了出现频率最高的3 000多个词作为词集.选择出现频率较大的标注加入到标注集合,比如标注的出现频率大于10.然后删除了描述长度过短或标注数量过少的软件,比如描述词的数量少于20,标注的数量少于2.最终,经过预处理后得到的3个开源软件数据集,见表 1.
![]() |
Table 1 The preprocessed datasets 表 1 预处理后得到的数据集 |
目前已经有很多的多标记学习算法,但是几乎没有代价敏感的多标记学习算法,所以这里与一些典型的多标记学习算法进行比较,包括BR算法、LP算法、RAkEL算法[8]和原始的ML-KNN算法[3].BR算法是一种流行的问题转换算法,它把多标记学习问题转换为q个独立的二元分类问题,这里,q是不同标注的数量.BR算法为每个标注训练一个分类器,如果某个示例包含标注l,则对于标注l而言,这个示例是正类;否则,对于标注 l而言,这个示例是负类.最终将q个分类器预测的结果合并起来作为最终的预测结果.LP算法把训练集中每个独特的标注集合看作一个标注,然后把问题转化为单标注的多类分类问题,给定一个测试示例,LP分类器就能输出一个最有可能的类,这个类实际上就是一组标注.RAkEL算法是一组LP分类器的集成方法,每个LP分类器在一组小的随机标注子集上训练.这样,RAkEL算法不仅能够考虑标注之间的相互关系,还避免了LP算法的性能问题[8].BR算法、LP算法、RAkEL算法使用的MULAN[12]中的实现,它们的基分类器都是线性核的支持向量机,在实验中使用的是LibLINEAR实现[13],参数使用的是默认参数.LibLINEAR非常适用于高维度的文本数据分类.原始的ML-KNN算法与本文提出的ML-CKNN基本框架是相似的,不同之处在于:原始的ML-KNN没有引入代价敏感性,而本文提出的ML-CKNN方法引入了代价敏感性.ML-KNN和ML-CKNN最近邻的数量k都设为30,光滑因子s都设为1.ML-CKNN的代价值c设为4.
3.3 评价标准本文使用了7种评价标准,其中,3种用于评价多标记分类性能,分别是基于样本的查准率(example-based precision)、基于样本的召回率(example-based recall)、基于样本的F1(example-based F1)[7];另外4种是用于评价多标记学习算法的标记排序性能,分别是1-错误率(one-error)、覆盖率(coverage)、排序损失(ranking loss)、平均精确率(average precision)[7].
这里使用m表示测试样本的数量,L表示全体标注集合,Yi表示多标记分类器预测测试样本xi具有的标注集合,Zi表示测试样本xi实际的标注集合.
· 基于样本的查准率(example-based precision)直观上可以看作所有样本查准率的平均值,如下式所示:
· 基于样本的召回率(example-based recall)和基于样本的F1(example-based F1)与之类似,如下式所示:
· 1-错误率(one-error)用来评价排序最高的标注有多少次不在测试示例实际的相关标注集合中,见式(11):
其中,ranki表示测试样本xi的标注排序,I函数如下式所示:
· 覆盖率(coverage)是指平均需要标注排序列表的前多少个标注才能覆盖测试样本的所有标注,如下式所示:
· 排序损失(ranking loss)是指平均有多少次不相关的标注排在相关的标注前面,如下式所示:
这里,是标注集合Yi在全体标注集合L中的补集.
· 平均精确率(average precision)评价在某一个标注l(lÎYi)之前的标注实际上也属于Yi的比率.
开源软件数据集是类不平衡的数据集,对于每个标注而言,具有该标注的示例远少于不具有该标注的示例.一般的多标记学习算法趋向于把所有示例预测为不具有某个标注,这样分类器也能得到很高的准确率(accuracy).但是在开源软件分类问题上,分类器取得的准确率结果并不特别重要,因为即使分类器把所有的示例都预测为不具有标注,也能取得90%以上的准确率.但是这样的预测结果是没有任何意义的,最终没有得到任何预测标注.类似的,使用海明损失作为评价标准也不合适,一个多标记分类器把所有的测试示例都预测为不具有标注,也能得到很低的海明损失.软件标注问题更关心的是分类器预测出的标注有多少实际上确实是软件的标注,软件实际上具有的标注有多少被分类器预测出来.所以在评价算法分类性能时,本文使用的是基于样本的查准率、基于样本的召回率以及基于样本的F1, 实验结果见表 2~表 4.此外,为了对比多标记学习的有效性,本文还采用多标记学习中常用的4种评价准则——1-错误率、覆盖率、排序损失和平均准确率来对软件分类性能进行评估,结果见表 5~表 8.其中,每个单元格中的第1个数值表示10折交叉验证的均值,第2个数值表示10折交叉验证的标准差,每一行最好的结果用粗体表示.
![]() |
Table 2 The example-based precision results of comparing algorithms (the larger,the better) 表 2 对比算法在基于样本查准率上的性能比较(数值越高越好) |
![]() |
Table 3 The example-based recall results of comparing algorithms (the larger,the better) 表 3 对比算法在基于样本召回率上的性能比较(数值越高越好) |
![]() |
Table 4 The example-based F1 results of comparing algorithms (the larger,the better) 表 4 对比算法在基于样本F1上的性能比较(数值越高越好) |
![]() |
Table 5 The one-error results of comparing algorithms (the smaller,the better) 表 5 对比算法在1-错误率上的性能比较(数值越低越好) |
![]() |
Table 6 The coverage results of comparing algorithms (the smaller,the better) 表 6 对比算法在覆盖率上的性能比较(数值越低越好) |
![]() |
Table 7 The ranking loss results of comparing algorithms (the smaller,the better) 表 7 对比算法在排序损失上的性能比较(数值越低越好) |
![]() |
Table 8 The average precision results of comparing algorithms (the larger,the better) 表 8 对比算法在平均精确率上的性能比较(数值越高越好) |
表 2~表 4中的实验结果表明:ML-CKNN在3个数据集上都取得了最好的基于样本的召回率和F1结果,在2个数据集上取得了最好的基于样本的查准率结果.值得一提的是:从表 5~表 8所给出的4种多标记学习常用的评价准则上,ML-CKNN方法都明显优于所有对比方法.特别地,本文提出的代价敏感多标记学习方法ML- CKNN在开源软件分类问题上要显著好于非代价敏感的ML-KNN,这表明:在开源软件分类问题上合理引入代价增加学习器对具有标注的示例的敏感性,能够有效提升学习性能.
下面讨论代价值c对ML-CKNN性能的影响.图 3是ML-CKNN取得的基于样本F1结果随代价值c的变化情况.图 3(a)是在Freecode数据集上的结果,图 3(b)是在Ohloh数据集上的结果,图 3(c)是在Sourceforge数据集上的结果.从图 3中可以看到:当代价值c在4~6之间时,ML-CKNN能取 得最高的基于样本F1结果.所以,在实验中设置代价值c为4.另外,代价值c在2~10之间变化的过程中,ML-CKNN在绝大部分情况下都取得了最高的基于样本F1结果.
![]() | Fig. 3 The example-based F1 results of ML-CKNN with different cost value c图 3 ML-CKNN取得的基于样本F1结果随代价值c的变化 |
准确有效地为上载至开源软件社区的软件提供描述其功能、用途、特性等的标注,是帮助用户快速寻找所需软件的关键.本文把开源软件自动标注形式化为一个代价敏感多标记学习问题,并提出了一种代价敏感多标记学习方法——ML-CKNN.该方法通过引入错误分类代价,有效缓解了对于每个标注而言,示例分布非均衡性给多标记学习带来的影响.实验结果表明,ML-CKNN能够获得较对比方法更优的软件自动标注性能.
在将来的工作中,可以使用度量学习的方式来学习一种度量,使得具有相同标注的样本在这种度量中尽可能靠近,具有不同标注的样本在这种度量中尽可能远.此外,利用不同标注之间的相互关系来帮助进一步提升学习性能,也值得在将来的工作中进一步探索.
[1] | Wang T, Yin G, Li X, Wang H. Labeled topic detection of open source software from mining mass textual project profiles. In: Proc. of the 1st Int’l Workshop on Software Mining. New York: ACM Press, 2012. 17-24 . |
[2] | Xia X, Lo D, Wang X, Zhou B. Tag recommendation in software information sites. In: Proc. of the 10th Int’l Workshop on Mining Software Repositories. Piscataway: IEEE Press, 2013. 287-296. |
[3] | Zhang ML, Zhou ZH. ML-KNN: A lazy learning approach to multi-label learning. Pattern Recognition, 2007,40(7):2038-2048 . |
[4] | De Souza AF, Pedroni F, Oliveira E, Ciarelli PM, Henrique WF, Veronese L, Badue C. Automated multi-label text categorization with VG-RAM weightless neural networks. Neurocomputing, 2009,72(10):2209-2217 . |
[5] | Ciarelli PM, Oliveira E, Badue C, De Souza AF. Multi-Label text categorization using a probabilistic neural network. Int’l Journal of Computer Information Systems and Industrial Management Applications, 2009,1:133-144. |
[6] | Jiang JY, Tsai SC, Lee SJ. FSKNN: Multi-Label text categorization based on fuzzy similarity and k nearest neighbors. Expert Systems with Applications, 2012,39(3):2813-2821 . |
[7] | Tsoumakas G, Katakis I, Vlahavas I. Mining multi-label data. In: Data Mining and Knowledge Discovery Handbook. 2010. 667-685 . |
[8] | Tsoumakas G, Vlahavas I. Random k-label sets: An ensemble method for multilabel classification. In: Proc. of the 18th European Conf. on Machine Learning. Berlin, Heidelberg: Springer-Verlag, 2007. 406-417 . |
[9] | Lo HY, Wang JC, Wang HM, Lin SD. Cost-Sensitive multi-label learning for audio tag annotation and retrieval. IEEE Trans. on Multimedia, 2011,13(3):518-529 . |
[10] | Liu AY. The effect of oversampling and undersampling on classifying imbalanced text datasets [Ph.D. Thesis]. Austin: The University of Texas at Austin, 2004. |
[11] | Yang Y. An evaluation of statistical approaches to text categorization. Information Retrieval, 1999,1(1-2):69-90 . |
[12] | Tsoumakas G, Spyromitros-Xioufis E, Vilcek J, Vlahavas I. MULAN: A Java library for multi-label learning. The Journal of Machine Learning Research, 2011,12:2411-2414. |
[13] | Fan RE, Chang KW, Hsieh CJ, Wang XR, Lin CJ. LIBLINEAR: A library for large linear classification. The Journal of Machine Learning Research, 2008,9:1871-1874. |
[14] | Tsoumakas G, Katakis I. Multi-Label classification: An overview. Int’l Journal of Data Warehousing and Mining, 2007,3(3):1-13 . |
[15] | Trohidis K, Tsoumakas G, Kalliris G, Vlahavas IP. Multi-Label classification of music into emotions. In: Proc. of the 9th Int’l Conf. on Music Information Retrieval. Philadelphia, 2008. 325-330. |