Файл словаря Mahout TFIDF - PullRequest
2 голосов
/ 13 марта 2012

Я пытаюсь выполнить TFIDF для набора документов (в виде текстовых файлов), используя mahout для выполнения вычислений, следуя этому руководству .

Я успешно создал словарь и векторвесов, и теперь я пытаюсь получить доступ к выводу.В руководстве говорится, что «вы, например, можете легко загрузить содержимое сгенерированного файла словаря в карту с индексом токена в качестве ключей и токенов в качестве значений».

Я не уверен, как выполнить загрузку вэтот файл на карту, как он предлагает, кто-нибудь знает, как это делается?

Я создал свои векторы из каталога текстовых файлов, одна проблема, с которой я столкнулся при запуске "./mahout seq2sparse ..." былафлаг -a, управляющий анализатором, который должен быть StandardAnalyzer lucene.При попытке запустить с этим флагом я получил ClassNotFoundException, но удаление флага решило проблему, и я думаю, что анализатор по умолчанию также является этим, поэтому вывод должен быть таким же, как в примере.

Если кто-нибудьзнает как загрузить этот словарь в карту Буду вечно благодарен!

Джеймс

Ответы [ 3 ]

6 голосов
/ 15 марта 2012

Я разработал это, поэтому я поднимаю это для всех, кто сталкивался с этим в Google.

        SequenceFile.Reader read = new SequenceFile.Reader(fs, new Path("<path do dictionary>"), conf);
        IntWritable dicKey = new IntWritable();
        Text text = new Text();
        Map<Integer, String> dictionaryMap = new HashMap();
        while (read.next(text, dicKey)) {
            dictionaryMap.put(Integer.parseInt(dicKey.toString()), text.toString());
        }
        read.close();

Это работало для меня, позволяя мне читать отображение идентификатора в текст в моем словарефайл от mahout.

1 голос
/ 12 июня 2015

Поскольку в приведенном выше коде отсутствуют операторы импорта и т. Д., Необходимые для его компиляции, здесь приведена более полная версия, которая работает из командной строки для чтения и вывода выходных данных файла dict

dumpdict.java:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;

class DumpDict {
  public static void main(String[] args) {
    try {
      Configuration conf = new Configuration();
      FileSystem fs = FileSystem.get(conf);
      SequenceFile.Reader read = new SequenceFile.Reader(fs, new Path(args[0]), conf);
      IntWritable dicKey = new IntWritable();
      Text text = new Text();
      // HashMap dictionaryMap = new HashMap();
      while (read.next(text, dicKey)) {
        // dictionaryMap.put(Integer.parseInt(dicKey.toString()), text.toString());
        System.out.println(dicKey.toString()+" "+text.toString());
      }
      read.close();
    } catch (IOException e) {
      System.out.println(e.toString());
    }
  }
}

Я обнаружил, что необходимо явно указать java, где находятся все файлы jar:

export CLASSPATH=`find /path/to/mahout /usr/share/java -name '*.jar' | perl -ne 'chomp; push @jars, $_; END { print "\".:",(join ":",@jars),"\$CLASSPATH\"\n"; }'`

Компилировать так:

javac dumpdict.java

Выполнить так:

java -cp .:$CLASSPATH DumpDict {path to dict}

(Это может быть излишним для людей, которые используют Java, но это может сэкономить время для тех из нас, кто не использует его так часто.)

1 голос
/ 24 марта 2012

Mahout создан org.apache.mahout.vectorizer.DefaultAnalyzer , который основан на StandardAnalyzer, так что вы можете использовать это в флаге -a.Вы не можете использовать StandardAnalyzer, потому что у него нет конструктора без аргументов, это является причиной вашей ошибки.

...