2016-09-07 2 views
0

Я реализую скрытый семантический анализ LSA, используя eclipse Mars, java 8 и искровую искровую сборку-1.6.1-hadoop2.4.0.jar Я передал документы в качестве токенов, затем получил SVD и так далееHashingTF не дает уникальных индексов

HashingTF hf = new HashingTF(hashingTFSize); 
    JavaRDD<Vector> ArticlesAsV = hf.transform(articles.map(x->x.tokens)); 
    JavaRDD<Vector> ArticlesTFIDF = idf.fit(ArticlesAsV).transform(ArticlesAsV); 
RowMatrix matTFIDF = new RowMatrix(ArticlesTFIDF.rdd()); 
    double rCond= 1.0E-9d; 
    int k = 50; 
    SingularValueDecomposition<RowMatrix, Matrix> svd = matTFIDF.computeSVD(k, true, rCond); 

каждая вещь работает отлично, за исключением одного, что, когда я пытаюсь получить индексы терминов из hashingTF

int index = hf.indexOf(term); 

я обнаружил, что есть много терминов, у которых имеются тот же индекс, некоторые из них я получил

0: Термин
1: все
1: Следующий
2: тт
3:
7: документ
9: например
9: Матрица
11: Документ
11: около
11: каждый
12: функция
12: случайный
14: this
14: обеспечивает
означает, что, когда я пытаюсь получить вектор термина с чем-то с ним, я могу получить вектор другого с тем же индексом, я сделал это после лемматизации и удаления остановки слово, но по-прежнему имеет ту же ошибку, есть ли что-то, что я пропустил, или ошибка с компонентами (например, MLip), которые необходимо обновить; как я могу сохранить уникальный для каждого термина.

ответ

2

Искры класса HashingTF использует hashing trick.

Необработанная функция отображается в индекс (термин), применяя функцию хеша . Затем рассчитываются терминные частоты на основе отображаемых индексов . Этот подход позволяет избежать вычисления глобальной карты , которая может быть дорогостоящей для большого корпуса, но она страдает от потенциальных хеш-коллизий, где разные параметры обработки могут стать такими же терминами после хэширования. Чтобы уменьшить вероятность столкновения , мы можем увеличить размер целевого объекта, то есть количество ведер хэш-таблицы. Размер функции по умолчанию равен 2^20 = 1 048 576.

Таким образом, группы терминов могут иметь одинаковый индекс.

Относительно комментариях ниже, если вам нужно все термины, которые вы можете использовать CountVectorizer вместо HashingTF. CountVectorizer также может использоваться для получения векторов частоты. Чтобы использовать CountVectorizer, а затем IDF , вы должны использовать DataFrame вместо JavaRDD, потому что CountVectorizer поддерживается только в мл.

Это пример DataFrame с колоннами Ид и слова:

id | words 
---|---------- 
0 | Array("word1", "word2", "word3") 
1 | Array("word1", "word2", "word2", "word3", "word1") 

Так что если вы переводите статьи JavaRDD в DataFrame с колоннами Ид и слова, где каждая строка мешок слов из предложения или документа, вы можете вычислить TfIdf с таким кодом:

CountVectorizerModel cvModel = new CountVectorizer() 
    .setInputCol("words") 
    .setOutputCol("rawFeatures") 
    .setVocabSize(100000) // <-- Specify the Max size of the vocabulary. 
    .setMinDF(2) // Specifies the minimum number of different documents a term must appear in to be included in the vocabulary. 
    .fit(df); 

    DataFrame featurizedData = cvModel.transform(articles); 

    IDF idf = new IDF().setInputCol("rawFeatures").setOutputCol("features"); 
    IDFModel idfModel = idf.fit(featurizedData); 
+0

Я получил его, я установил размер max() из 1048576, и он работал для 14696 уникальных терминов, и я получил 14453 уникальных указателей без 243 терминов, но будет ли он делать то же самое для 671333 уникальных условий. так как у меня есть больший размер данных для тестирования, будет ли он пропустить много терминов? – Yas

+0

для 671333 я получил 489302, пропал без вести 185031, все еще не очень хорошо, мне нужен индекс для каждого термина, недостающие термины могут быть важными, любой способ работать с ним ??? – Yas

+0

Вы можете увеличить максимальный размер более 1048576 с помощью конструктора ** HashingTF (numFeatures: Int) ** и надеяться, что он генерирует несколько столкновений. Даже если HashingTF пропущено много терминов, есть [две причины, по которым он все еще работает] (http://blog.someben.com/2013/01/hashing-lang/) –

Смежные вопросы