Хранение n-граммов в базе данных в количестве <n таблиц - PullRequest
3 голосов
/ 17 мая 2010

Если бы я писал программный продукт, который пытался предсказать, какое слово пользователь собирается набрать next , используя два предыдущих слова, введенных пользователем, я бы создал две таблицы.

Вот так:

== 1-gram table ==
Token | NextWord | Frequency
------+----------+-----------
"I"   | "like"   | 15
"I"   | "hate"   | 20

== 2-gram table ==
Token    | NextWord   | Frequency
---------+------------+-----------
"I like" | "apples"   | 8
"I like" | "tomatoes" | 12
"I hate" | "tomatoes" | 20
"I hate" | "apples"   | 2

Следуя этому примеру, пользователь вводит «I», а программное обеспечение, используя вышеуказанную базу данных, предсказывает, что следующее слово, которое пользователь собирается напечатать, - «ненависть». Если пользователь вводит «ненависть», тогда программное обеспечение прогнозирует, что следующее слово, которое пользователь собирается ввести, - «помидоры».

Однако для этой имплиментации потребуется таблица для каждого дополнительного n-грамма, который я хочу принять во внимание. Если бы я решил, что я хотел бы принять во внимание 5 или 6 предыдущих слов при прогнозировании следующего слова, то мне потребовалось бы 5-6 таблиц и экспоненциальное увеличение пространства на н-грамм.

Как лучше всего представить это только в одной или двух таблицах, у которых нет верхнего предела числа n-грамм, которые я могу поддерживать?

Ответы [ 3 ]

2 голосов
/ 17 мая 2010

Почему бы просто не сохранить их все в одной таблице?

Token    | NextWord   | Frequency
---------+------------+-----------
"I"      | "like"     | 15
"I"      | "hate"     | 20
"I like" | "apples"   | 8
"I like" | "tomatoes" | 12
"I hate" | "tomatoes" | 20
"I hate" | "apples"   | 2

Тогда ваше программное обеспечение решит, что вы передаете для «токена», а также когда вы вставляете новые значения (т. Е. Не вводите частично напечатанное слово). Если вы хотите запутаться, у вас может быть дополнительный столбец для количества слов, но я не думаю, что это на самом деле потребуется (количество пробелов + 1 - это количество слов)

2 голосов
/ 17 мая 2010

Попробуйте таблицу из двух столбцов -

phrase, frequency

Одной из оптимизаций было бы «норамализация» некоторых слов во фразе, например. "не" к "не".

Второй оптимизацией будет использование MD5, CRC32 или аналогичного хеша фразы в качестве ключа.

1 голос
/ 17 мая 2010

Вы можете просто оставить все как есть и использовать только одну таблицу. Два грамма не могут быть равны одному грамму, потому что в нем будет пробел. Точно так же три грамма не будут равны двум граммам, потому что три грамма будут иметь два пробела. До бесконечности.

Таким образом, вы можете поместить все 1-граммовые, 2-граммовые и т. Д. В поле Token, и ни один из них никогда не столкнется.

...