## 写在前面:研究设定
我从Yelp 上收集了一些用户评论,现在希望从这些评论中提取出我想要的信息,特别是与用户的位置和社会网络相关的信息。目前,我设想的是训练一个分类模型,输入用户评论,输出0-1变量,告诉我这个评论中是否有我想要的信息。如果有的话,当然我可以继续深入下去,最终从模型中提取出这些信息。但是我现在想先从最简单的情况入手,只要模型能够告诉我输入项里是否存在我感兴趣的信息即可。目前,我还不知道具体怎么定义信息存在或不存在。我有的只是一个大致的想法。我知道我想要最终找到的句子是下面两类:
关于位置的:
- This place is close to my place/home/apartment/work.
- I live close by.
- This is a local restaurant.
关于社会网络的:
- I came with people from my work.
- I came to celebrate my birthday with my family.
- This place was recommended by my boss/coworker.
简单点说,我希望判断用户提交的评论中是否包含这样的信息,让我能够据此推测出他的住址/工作地址或社交情况。有可能这可以简化成一个关键词提取问题,但是我初步想了一下,感觉只是判断关键词是否存在似乎太简单了一点,模型的准确度可能很低,不过如果我最终想做一个分类模型的话,这无疑可以作为其中一个特征传进去。在关键词的选择上,我可能也需要多考虑一下。因为我的直觉告诉我,像apartment, home, work, coworker这样的关键词可能是比local, live, close等要更relevant一点。名词似乎更重要,但是只有这些名词也不行,因为我还需要知道这些名词的使用情景,只是告诉我他家的情况并不够,我希望他告诉我的是,他家住在附近,所以word embedding无疑是有必要的。但是more than embedding of any word, 也许我需要赋予我所关注的那些关键词的embedding更多的权重?我还需要再想一下细节,但是问题的关键应该就是关键词定位,并确定它们的使用情景。我之前有想过,用语言模型的方法来formalize使用情景,但是我看了相关文献,感觉也许embedding的想法更容易实现、效果也可能更好一些,毕竟网上已经有成型的实现embedding的工具了,而具体要定义什么样的语言模型、怎么定义,我还需要自己去摸索。后一种方式感觉吃力不讨好,工作量大不说,还存在不确定性,不知道效果怎么样。
我现在关注的虽然有两组信息,但是其实只要做出来其中一组的分类模型,第二组就会很容易了。我决定从位置信息入手,集中精力建一个能够work的位置分类模型。
## 待解问题1:文本断句
建这个模型碰到的第一个问题是,到底是以句子为单位还是以整个评论文本为单位。其实我关注的应该是句子,但是如果要建以句子为单位的模型的话,我就需要有一个非常快的sentence tokenizer。而我初步试验了一下spaCy,它的performance完全跟不上我的需求。因为这个package里面附属了太多其他的东西,虽然我一把文本传进它的nlp model,就可以得到一个sentence list, 但是它同时也返给我很多其他我暂时不想要的东西,这些附属的功能现在看来就成了一个累赘,不必要的占用了资源。
事实上,我刚刚做了一下试验,估算了一下如果要用spacy给我所有的文本断句的话,需要大概10,000秒, 也就是166分钟,大概3个小时。这个时间倒也不是完全不能接受,但是转念一想,我现在还只有大概30万的用户评论。30万就已经需要这么久了,可以预见,如果我以后扩大样本量的话,光断句这个最basic的步骤就要花天长地久那么久,实在不合理。
所以我需要迅速的figure out 怎么能又快又好的实现断句功能。