Структура базы данных для общих связанных слов - PullRequest
0 голосов
/ 27 мая 2019

Мне нужно создать базу данных для хранения " наиболее часто встречающихся слов ".Я буду кормить свое программное обеспечение огромным набором текстов (главным образом, книгами и статьями), разделять их на абзацы и каким-то образом хранить их.После этого пользователь должен иметь возможность искать слово и проверять, какие слова встречаются чаще всего в абзаце с искомым словом.

Пример: пользователь ищет слово «цветок», и система должна что-то вернутьнапример:

Search word: "flower"

Most common matches with "flower":
1. "red" appeared 4918 times in a paragraph with "flower"
2. "white" appeared 3502 times in a paragraph with "flower"
3. "fresh" appeared 2501 times in a paragraph with "flower"
4. "scented" appeared 2499 times in a paragraph with "flower"
...and so on

Какая структура базы данных лучше всего подходит для достижения такой функциональности с приличной скоростью запросов и небольшими потребностями в хранилище?

Может ли это быть одна таблица с отсортированными словами пары и количество появлений?Лучше ли подход с двумя таблицами для хранения слов, words_id и второй таблицы для хранения word1_id, word2_id, count?Есть ли другой общий подход к такой проблеме?

1 Ответ

1 голос
/ 31 мая 2019

Я бы посоветовал не хранить пары. Это привело бы к сложности квадратичного пространства. Если ваши абзацы состоят из 100 слов, то есть примерно 5000 пар слов, поэтому вы должны хранить 5000 записей вместо 100 - увеличение в 50 раз. Скорее, вы могли бы иметь таблицу word и таблицу text_index, цель которых - сопоставить слова с абзацами. Примерно так:

create table word (
  id int not null auto_increment,
  form varchar(100) not null default '',

  primary key (id),
  unique key (form)
);

create table text_index (
  id int not null auto_increment,
  word_id int not null default 0,
  paragraph_id int not null default 0,

  primary key (id),
  key (paragraph_id),
  key (word_id)
);

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

В основном запрос гласит: «дайте мне все слова и количество слов, которые делят идентификатор абзаца с« цветком »»:

select w.form, count(*) as c
from text_index a
join text_index b on a.paragraph_id = b.paragraph_id
join word w on b.word_id = w.id
where a.word_id = 1
  and b.word_id != 1
group by b.word_id;

Вот некоторые примеры данных для игры. Я не проверял запрос на больших наборах данных, но с правильными индексами он должен быть быстрым.

insert into word (form)
values
  ('flower'),
  ('toy'),
  ('candle'),
  ('red'),
  ('white'),
  ('fresh'),
  ('scented');

insert into text_index (word_id, paragraph_id)
values
  (1, 1),
  (1, 2),
  (1, 3),
  (1, 4),
  (2, 5),
  (2, 6),
  (3, 7),
  (4, 1),
  (4, 2),
  (4, 2),
  (4, 2),
  (4, 3),
  (5, 1),
  (5, 4),
  (5, 8),
  (6, 1),
  (6, 2),
  (7, 4),
  (7, 7);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...