Spark TF-IDF возвращает слова из хэша

Я использую этот пример из документации Spark для расчета TF- ИДФ за кучу документов. Spark использует хэш-трюк для этих вычислений, поэтому в конце вы получаете вектор, содержащий хешированные слова и соответствующий вес, но... Как я могу вернуть слова из хэша?

Мне действительно нужно хэшировать все слова и сохранять их на карте, чтобы позже перебирать ее в поисках ключевых слов? Нет более эффективного способа встроенного Spark?

заранее спасибо


person Quaiks    schedule 09.11.2014    source источник


Ответы (3)


Преобразование строки в хэш в заголовке HashingTF возвращает положительное целое число от 0 до numFeatures (по умолчанию 2^20) с использованием org.apache.spark.util.Utils.nonNegativeMod(int , интервал).

Исходная строка потеряна; нет способа преобразовать полученное целое число во входную строку.

person Tim Hennekey    schedule 22.05.2015
comment
Исходная строка потеряна; невозможно преобразовать полученное целое число во входную строку. Обратите внимание, что это верно для любой хорошей хеш-функции: они преднамеренно односторонние. - person Matt Ball; 22.05.2015
comment
Криптографические хеш-функции — это однонаправленные хэши. Стандартные хеш-функции не заинтересованы в одностороннем свойстве. Например, стандартный хэш Java String довольно легко инвертировать для (очень) коротких строк. Обычно цель состоит в том, чтобы свести к минимуму коллизии в выходном пространстве. - person David; 01.03.2017

Вам нужно создать словарь, который отображает все токены в вашем наборе данных в хэш-значение. Но, поскольку вы используете трюк с хешированием, могут возникнуть коллизии хэшей, и отображение не будет полностью обратимым.

person David    schedule 22.05.2015

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

String[] vocabulary= countVectorizerModel.vocabulary();

чтобы вы знали, как их найти;

Например, имея результирующий SparseVector, подобный (11,[0,1,3],[1.0,... , где [0,1,3] представляет индексы словарных терминов, встречающихся в соответствующих text , то вы можете получить термины, обратившись к:

vocabulary[index]

Если вам нужно сделать это в контексте терминов темы LDA, решение будет таким же.

person marilena.oita    schedule 24.02.2017