每行一袋单词

m1m5dgzv  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(352)

我现在有一个巨大的csv文件。其中包含reddit post标题。我想为每个帖子创建一个特征向量。
假设post tile是 "to be or not to be" 它属于 "some_category" . csv文件的格式如下。

"some_category1", "some title1"

"some_category2", "some title2"

"some_category1", "some title3"

我想创建一个特征向量如下。

"some_category" : to(2) be(2) or(1) not(1).

我需要在hadoop上做这一切。我被困在第一步,我如何将每一行转换成一个特征向量(我觉得它类似于字数计算,但我如何将它应用于每一行)。
我对这个问题的最初想法是:每一行(即每一篇文章的标题和类别)是文章的类别,值是标题的特征向量(即标题的字数)。
对于如何解决这个问题,我们非常感谢您的帮助。

aiazj4mn

aiazj4mn1#

我使用两个map reduce函数解决了这个问题,并添加了索引,使每一行对进程都是唯一的。

1, "some_category1", "some title1"

2, "some_category2", "some title2"

3, "some_category1", "some title3"

第一个map的输出减少

"1, some_category" to 2
"1, some_category" be 2
"1, some_category" or 3
"1, some_category" not 1

其中索引和类别是值的键,即标题中的单词。
在第二个Map中,它的最终输出是这种格式的。

"some_category" : to(2) be(2) or(1) not(1).
zvokhttg

zvokhttg2#

回答您的第一部分:阅读hadoop中的csv linewise在本文中得到了回答post:stackoverflow:如何使用java高效地读取hadoop hdfs文件的第一行。只需将最后一行改为:

final Scanner sc = new Scanner(input);
while (sc.hastNextLine()) {
    //doStuff with sc.nextLine()!
}

要创建特征向量,我将使用您提到的计数策略:

/**

* We will use Java8-Style to do that easily
* 0) Split each line by space separated (split("\\s")
* 1) Create a stream: Arrays.stream(Array)
* 2) Collect the input (.collect) and group it by every identical word (Function.identity) to the corresponding amount (Collectors.counting)
* 
* @param title the right hand side after the comma
* @return a map mapping each word to its count
**/

private Map<String, Long> createFeatureVectorForTitle(String title) {
    return Arrays.stream(title.split("\\s").collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
}

将每个类别的关键点设置为所创建的特征向量的想法听起来是合法的。虽然我对hadoop不太熟悉,但也许有人能指出更好的解决方案。

相关问题