我正在编写一个ML模块(python)来预测stackoverflow问题(标签+正文)的标签。我的语料库有大约500万个问题,每个问题都有标题,正文和标签。我将这个3:2拆分为训练和测试。我被curse of dimensionality所困扰。
ngram关联: 每个 unigram和bigram在标题和每个问题的正文中,我维护一个列表相关标签。存入redis。这导致大约一百万个独特的unigrams和两千万个独特的双桅轮,每个都有相应的标签频率列表。实施例
"continuous integration": {"ci":42, "jenkins":15, "windows":1, "django":1, ....}
注意:这里有2个问题: a)并非所有unigrams和bigrams都很重要, b)并非所有与之关联的标签ngram很重要,虽然这并不意味着频率为1的标签都是等价的,或者可以随意删除。与给定ngram相关联的标签数量很容易达到成千上万 - 其中大多数不相关且无关紧要。
tfidf:以帮助选择要保留的ngram,我为每个unigram和bigram计算了整个语料库的tfidf分数,并将相应的idf值与相关标签一起存储。实施例
"continuous integration": {"ci":42, "jenkins":15, ...., "__idf__":7.2123}
tfidf分数存储在documentxfeature
sparse.csr_matrix中,我目前还不确定如何利用它。 (它由fit_transform()生成)
一旦功能集减少,我计划使用它的方式如下:
有没有关于如何改进的建议?分类器可以派上用场吗?
我是一台16核,16GB的RAM机器。 redis-server(我将移动到另一台机器)存储在RAM中,大约为10GB。上面提到的所有任务(除了tfidf)都是使用ipython集群并行完成的。
答案 0 :(得分:1)
答案 1 :(得分:0)
基线统计方法会将此视为分类问题。功能是由最大熵分类器(如Mallet http://mallet.cs.umass.edu/classification.php)处理的词袋。 Maxent(又名逻辑回归)擅长处理大型特征空间。获取与每个标记相关联的概率(即类标签),并选择一些决策阈值,为您的项目提供精确/召回权衡。一些Mallet文档甚至提到了主题分类,这与你想要做的非常相似。
开放式问题是Mallet如何处理您的数据大小(这不是那么大)以及这个特定工具是否与您提到的技术堆栈无关。您可以离线训练(将Reddis数据库转储到Mallet的特征格式的文本文件中)并在Python中运行Mallet学习模型。评估maxent模型很简单。如果你想继续使用Python并使其更加自动化,那么在NLTK中有基于Python的maxent实现,可能还有scikit-learn。这种方法并不是最先进的,但它可以正常工作,并且可以用来比较更复杂的方法。