2016-02-16 4 views
0

У меня в настоящее время огромный файл csv. который содержит reddit заголовки сообщений. Я хотел бы создать вектор функций для каждого сообщения.Сумка слов для каждой строки

Предположим, что после плитки "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. Я застрял на первом шаге. Как преобразовать каждую строку в вектор функции (я чувствую, что он похож на число слов, но как я применяю его для каждой строки).

Мои первоначальные мысли по отношению к этой проблеме были ключевыми для каждой строки (то есть названия и категории каждого сообщения) - это категория сообщения, а значение - это вектор функции заголовка (т. Е. Количество слов названия).

Любая помощь приветствуется в отношении того, как подойти к этой проблеме.

+0

ли это быть программа Hadoop Java, или вы можете использовать другие инструменты Hadoop как [Apache Pig] (https://pig.apache.org)? –

ответ

1

Чтобы ответить на вашу первую часть: Чтение csv linewise в Hadoop было отвечено на этот пост: StackOverflow:how-to-read-first-line-in-hadoop-hdfs-file-efficiently-using-java. Просто измените последнюю строку на:

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, возможно, кто-то может указать на лучшее решение.

0

Я решил это, используя две функции уменьшения карты и добавив индекс, чтобы каждая строка была уникальной для обработки.

1, "some_category1", "some title1" 

2, "some_category2", "some title2" 

3, "some_category1", "some title3" 

Выход первой карты уменьшить

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

, где индекс и категории являются ключами к значениям т.е. слов в названии.

На второй карте уменьшите его окончательный вывод этого формата.

"some_category" : to(2) be(2) or(1) not(1). 
Смежные вопросы