LDA是什么? 我也不懂.. 大概就是, 一堆article, 每个都是由word们组成, 想给它们聚类成K(超参数)个topic, 还能求出一个p(word|topic). 计算过程大概就是玩{article, word, topic}之间的各种概率, 迭代计算, 细节玄机茫茫多.
目标: 跑一遍流程, 有个初步了解, 能算出一个勉强能看的topic下的key word list.
分词
找一些article语料呗. 我找的有label—为了下一步做特征选择—在label上分布不均的30万短文本.
离线MR时候注意手动设置mapper个数, 因为感觉yarn没法准确给计算密集型任务合理分配cpu资源, container的资源还是以内存为主要分配单位?特征选择
因为词典太大呗. 一会儿size(vocab) * size({topic}) 要爆炸了. 矩阵再dense也扛不住给的内存小啊, 轻松OOM.
于是搞个特征选择吧, 弄了个简易卡方检验Chi-Square, 随便挑了一些词(x百万量级), 别的扔掉.
把article映射到特征空间上, 存个libsvm格式.开spark跑
原理也先不纠结, 调用包, 跑.
代码照着官网的例子抄. 发现K值太大, 或者分的mem太少, 或者executors太少, 会OOM.
羞耻地随便改了几下, 趁着夜深不会被撸, 设置成K=200,--num-executors 200 --driver-memory 6g --executor-memory 6g
, 能出结果.
发现了个GC时间太长, 影响发送心跳包的情形. 好多missing parents, 反复resubmit stage(resilient feature). 可以修改一些网络通信参数跑通? GC不懂, 明天仔细看看. @TODO看看这些个数据
- 看看p(word|topic), 可以用这个来给article分类(聚类), 看看同一类的像不像. @TODO
- 反着归一化一下(for each word, sum over topic), 看看每个topic下面的key word. 瞅了一眼, 勉强能看. 脑补一下, 貌似跟能用还是有距离.
- 明显的错误还是有几处的, 累了, 明天再看.