Розуміння хешування функцій


10

Вікіпедія надає наступний приклад при описі хешування функцій ; але відображення не здається відповідним словнику

Наприклад, toслід перетворити 3відповідно до словника, але він кодується як 1замість цього.

Чи є помилка в описі? Як працює функція хешування?

Тексти:

John likes to watch movies. Mary likes too.
John also likes to watch football games.

можна перетворити, використовуючи словник

{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, 
"football": 7, "games": 8, "Mary": 9, "too": 10}

до матриці

[[1 2 1 1 1 0 0 0 1 1]
 [1 1 1 1 0 1 1 1 0 0]]

Відповіді:


10

Матриця побудована таким чином:

  • рядки представляють лінії
  • стовпці представляють функції

і кожна матриця введення (i, j) = k означає:

У рядку i слово з індексом j з’являється k разів.

Так toвідображено в індекс 3. Він з’являється рівно один раз у рядку 1. Тож m (1,3) = 1.

Більше прикладів

  • likesвідображається в індексі 2. У першому рядку він з’являється рівно два рази. Отже m (1,2) = 2
  • also відображається в індексі 6. Він відображається не в рядку 1, а один раз у рядку 2. Тож m (1,6) = 0 і m (2,6) = 1.

Однак у контексті хешування функцій у нас немає словника. У нас є лише хеш-функція. Чи працює це аналогічно в тому сенсі, що ви (1) обчислюєте хеш-значення функції та (2) збільшуєте індекс, заданий хеш-функцією, на 1 щоразу, коли ви бачите точку даних? Наприклад, як @ user20370 зазначено нижче, якщо ви вирішили кодувати свої функції 13 бітами, а хеш-значення "лайків" - 5674, то індекс 5674 збільшується на 1? А якщо ви використовуєте меншу кількість біт, ви просто mod 5674 на 2 ^ (# біт) і збільшуєте цей індекс?
Vivek Subramanian

1
@VivekSubramanian так. Завдання полягає у пошуку хеш-функції без зіткнень (тобто різних слів, але однакове хеш-значення) або зіткнень, що трапляються рідко. Це сфера досліджень інформатики ( en.wikipedia.org/wiki/Perfect_hash_function ).
steffen

4

Як зазначив Штеффен, прикладна матриця кодує кількість разів, коли слово з'являється в тексті. Положення кодування в матриці задається словом (положення стовпця на матриці) та текстом (положення рядка на матриці).

Тепер, хеш-трюк працює так само, хоча вам не потрібно спочатку визначати словник, що містить позицію стовпця для кожного слова.

Насправді саме хеш-функція надасть вам діапазон можливих положень стовпців (хеш-функція дасть вам мінімальне та максимальне можливе значення) та точне положення слова, яке ви хочете закодувати в матрицю. Так, наприклад, давайте уявимо, що слово "лайки" хеширується нашою функцією хешування на номер 5674, тоді стовпець 5674 буде містити кодування відносно слова "лайки".

Таким чином вам не потрібно буде складати словник перед аналізом тексту. Якщо ви використовуєте розріджену матрицю як свою текстову матрицю, вам навіть не доведеться точно визначати розмір матриці. Лише скануючи текст, на ходу ви перетворите слова в позиції стовпців за допомогою функції хешування, і ваша текстова матриця буде заповнена даними (частотами, тобто) відповідно до того, який документ ви прогресивно аналізуєте (положення рядка).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.