我需要预处理原始twitter数据集(大约1 GB的文本文件)。预处理(包括删除停止词、特殊符号、URL)后,我将使用lucene对它们执行索引。
你们中的任何人能建议一下净化推文的最佳方法吗?
以下是数据示例:
60730027 6298443824 thank you echo park. you've changed A LOT, but as long as I'm getting paid to make you move, I'm still with it! 2009-12-03 02:54:10
60730027 6297282530 fat Albert Einstein goin in right now over here!!! 2009-12-03 01:35:22
60730027 6283122724 SATURDAY NIGHT AT THE TAVERN: http://yfrog.com/4aka3cj 2009-12-02 16:21:40
60730027 6283105517 FRIDAY NIGHT AT THE GRIFFIN: http://yfrog.com/3glqzj 2009-12-02 16:21:04
第一列编号对应于用户位置。然而,我不确定第二列的编号对应于什么。
为了对数据进行消毒,我会用城市名称替换用户位置代码,删除时间戳,删除停止字符、URL等。
请就如何进行提出建议。
提前感谢!
首先需要加入位置代码列,将其替换为城市名称。由于locationCode-city
元组(映射)的数量相对较小(约400),因此可以进行映射侧联接。
在作业提交之前,首先将映射文件添加到缓存中。根据Hadoop版本使用:
// prior to 2.2.0
DistributedCache.addCacheFile(new Path(path/cityCode_NameMappings.txt).toUri(), conf);
//OR 2.2.0 onwards. DistributedCache is deprecated
job.addCacheFile(new Path(filename).toUri());
使用在Mapper的setup
方法中检索
Path[] cacheFiles = DistributedCache.getLocalCacheFiles(job);
// OR
Path[] cacheFiles = context.getLocalCacheFiles();
通过名称识别文件,读取文件并将内容放入静态HashMap<code,name>
中,并使用它来替换map
方法中实际twitter数据文件传入行中的代码。当可能的映射数量相对较少时,可以采用相同的策略来替换第二列(当前超出范围)。
最后,只选择实际tweet的正文,regex和简单的字符串操作似乎就足够了。现在您有两个选项:
使用Reducer类进行文本提取。此方式代码替换推特正文提取将以单独的抽象形式进行。
在Mapper本身中进行处理,并将减速器的数量设置为零。这将是一个只有地图的作业,虽然看起来会更快有点乱。
选择权在你。同样,如果您的城市代码映射数量很大,那么您别无选择,只能执行reduce-side联接。这将是相对的实现起来很复杂。
第二个想法:如果您可以自由选择除原始Lucene之外的其他索引工具,我建议您使用ElasticSearch(基于Lucene构建)。然后,您可以使用配置单元进行连接,并使用配置单元ES集成将数据加载到索引中。尽管如此,你还是必须进行文本处理(也许蜂箱serde可以做到这一点)。