2013-02-10 8 views
1

Я пишу приложение, которое использует CC-CEDICT, лицензионный китайский-китайский словарь CC.Отслеживание изменений в данных без первичного ключа

Словарь доступен только как zipped text file (4MB) с записями в следующем формате:

Traditional Simplified [pin1 yin1] /English equivalent 1/equivalent 2/ 

Это выборка данных:

是 是 [shi4] /is/are/am/yes/to be/ 
昰 是 [shi4] /variant of 是[shi4]/used in given names/ 
時 时 [Shi2] /surname Shi/ 
時 时 [shi2] /o'clock/time/when/hour/season/period/ 

Я выбрал эти строки намеренно, чтобы проиллюстрировать мою проблему. У данных нет отрывного ключа, по которому можно идентифицировать отдельное слово.

Английские определения можно изменить, и сделать как словарь постоянно обновляется, но предположим, что в одном обновлении двух определений 時 时 изменения, так что следующий файл содержит строки:

時 时 [Shi2] /last name Shi/ 
時 时 [shi2] /o'clock/time period/when/hour/season/ 

Как я определить, какие записи были обновлены? Это действительно заметно, когда перевод - это одно слово, которое полностью изменяется.

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

+0

Вы не можете - если вы хотите отслеживать изменения - вы ** должны иметь ** первичный ключ. Любая реальная таблица данных должна иметь первичный ключ в любом случае .... –

ответ

0

Это не решение, но может дать вам некоторые идеи (или другие).

Как насчет моделирования этого как иерархии, Word-> Значение-> Перевод. Вычислить хэш перевода, суммировать хэш-значение всех переводов и хранить его в соответствующей записи «значение», а затем суммировать хэш-значения всех значений и хранить их в записи Word. (Да, это денормализованное).

Вам нужно будет каждый раз пересчитывать все значения хэша для всех записей в файле. Затем вы можете просто сравнить имеющееся в данный момент значение хэша для «слова» со значением хэша, которое вы только что вычислили. Если они разные, что-то изменилось. Либо было новое значение, либо новый перевод, либо перевод был удален и т. Д. Вы могли бы либо полностью удалить это слово (каскадировать), либо снова вставить новое «вспомогательное дерево». Если вы хотите усложнить ситуацию, вы также можете спуститься в иерархию и попытаться точно определить, что изменилось.

1

Вопрос является одним из перспективных.

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

Поэтому нет нет обновления только вставки и удаляет.

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


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

Часть (a) проста, добавьте свой собственный суррогатный ключ. Это может быть уникальным для всех определений или только для комбинаций (упрощенный, традиционный).

Часть (b) сложнее. В какой момент вы говорите, что «фамилия Ши» связана с «фамилией Ши»? Я предлагаю придумать какую-то функцию сравнения текста, которая дает числовую оценку. Выберите пороговое значение для этого показателя, в котором вы называете это обновлением вместо удаления и вставки. Это будет произвольно, но вы можете обнаружить, что два человека могут не согласиться с тем, что такое обновление, а что-то не от одного случая к другому.

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