2010-05-17 1 views
3

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

Как так:

== 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 

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

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

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

ответ

2

Попробуйте два стол столба -

phrase, frequency 

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

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

+0

+1 для хэш. Если вы используете большой корпус или длинные строки, использование хеша будет * существенным * для адекватной производительности. Увы, все равно нужно сохранить исходную строку из-за неизбежных столкновений, увы. – egrunin

1

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

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

2

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

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 - количество слов)

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

  • Нет связанных вопросов^_^