5. Строгие алгоритмы построения базиса, учитывающие зависимость строк
Излагаемый ниже алгоритм применялся (табл. 4) для построения собственно базиса, однако он может быть использован и для построения начального надбазиса в предыдущем методе. Алгоритм основан на учете зависимостей между строками. Нам уже приходилось касаться популярной в компьтерной лингвистике парадигмы «выбора наиболее частого» [4]. Приведенный здесь алгоритм можно считать своего рода иллюстрацией альтернативы этой парадигме.
Основа алгоритма состоит в том, что из возможных зависимостей строк вычленяются некоторые типы и каждый тип зависимости явным образом учитывается (или явно не учитывается).
Строки могут непосредственно зависеть друг от друга по вложенности и по пересечению. Тогда зная, например, частость надстроки w и частость вложенной в нее строки s, можно получить частость s для тех ее вхождений в слова, когда она не является подстрокой w. Возможна и опосредованная зависимость, которая в условиях нашей задачи может быть учтена только путем разложения (см. о матрицах согласованности и несогласованности в 4.2). Начнем с отношения непосредственной вложенности двух строк.
Пусть имеется строка s, которой приписана частость f(s) ее вхождений в слова. Если в (последовательно формируемом) базисе содержатся строки, для которых она является подстрокой, вычислим собственный вклад строки s — частость f*(s) тех ее вхождений в слова, которые не есть вхождения в составе надстрок. Выпишем, начиная с самой короткой, те надстроки, которые содержат вхождения s, непокрытые более короткими надстроками. Так формируется подбазис G = {gi}, предназначенный для коррекции частости строки s. Обозначив r(gi) число непокрытых другими компонентами G вхождений строки s в строку gi, запишем построенную по «включению–исключению» формулу для корректированной частости f*(s)
![]() |
Не вдаваясь в детали, Con(a, b) — условное обозначение каждой из строк вида pqr, таких, что a = pq, b = qr или a = qr, b = pq (подстроки p, q и r непусты), r(w) — число непокрытых вхождений строки s в строку w.
В приведенной формуле можно пренебречь суммами, уже начиная со второй. В алгоритме вторая сумма еще используется, поэтому корректированная частость f*(s) чуть завышена. Перейдем к описанию алгоритма.
Пусть имеется список S — очередь на вхождение в базис. Очередь включает все подстроки слов словаря, и каждой подстроке приписаны частость ее вхождений в слова словаря, вычисленный одним из изложенных в 4.1 способов вес, а также некий вектор обоснования исключения. (Хотя частость назначается с учетом возможности самопересечения строки, на практике это излишне — частость реально встречающихся самопересечений несущественна относительно частости строки без учета самопересечений.) Список упорядочен по убыванию этих весов. Имеется также исходно пустой базис B, строки в котором будут упорядочиваться по убыванию длины. Кроме того, нам потребуется отдельный список F исходных частостей строк.
Начнем с процедуры включения в базис. Возьмем очередную строку s из очереди и выполним коррекцию ее частости, учитывая вложенность строки s в строки базиса.
Если базис не пуст, просмотрим включенные в него строки снизу–вверх, начиная с первой строки, длина которой больше строки s. Построим подбазис коррекции —множество G строк базиса, содержащих s. Именно, если очередная строка w базиса содержит s как подстроку, то подсчитываем число (несамопересекающихся) вхождений s в w. Просматриваем текущий G снизу–вверх (то есть по увеличению длин входящих в него строк) на предмет вхождения очередной строки gi в строку w. Если вхождение имеет место, вычеркиваем его из w. Если после какого-то шага прохода G в w не остается невычеркнутых вхождений s, то продолжим построение G, то есть, взяв в качестве w следующую строку базиса (т. е. стоящую выше текущей w), проверяем вхождение в нее s и если вхождения есть, проверяем w по подбазису G. Если же после прохода текущего подбазиса в w остались k невычеркнутых вхождений s, включаем w в подбазис G, выясняем по списку частостей строк частость f(w) и увеличиваем на kf(w) приписанную G величину коррекции, исходно (при пустом G) приравненную нулю.
Сформировав таким образом подбазис G, просмотрим нет ли попарных пересечений включенных в G строк. Для любой пары пересекающихся строк подбазиса, то есть строк, представимых в виде w1 = ab и w2 = bc (где a, b и c — непустые подстроки), смотрим по списку частостей частость строки w = abc и на f(w) уменьшаем величину коррекции. (Эта занимающая известное время операция в действительности дает уточнение того же порядка малости как и поправка частости строки по самопересечению.)
Выпонив эти операции, наконец уменьшаем на величину коррекции исходное значение частости строки s и вычисляем вес s для откорректированной по G частости. Если вес окажется больше веса строки, стоящей в очереди следом за s, то s вносится в базис и переходим к рассмотрению следующей строки из очереди. Иначе s вместе с исходной частостью, откорректированным весом и заполняемым при отвержении s вектором обоснования исключения (см. ниже) перемещается в очереди на место, соответствующее новому весу.
Мы описали процедуру включения в базис, в которой строка из списка рассматривалась как подстрока строк базиса. Теперь естественно построить основанную на тех же представлениях о зависимости строк процедуру исключения строк из базиса, а точнее их вытеснения включаемой строкой.
Включаемая в базис строка из списка может оказаться надстрокой для каких-то строк базиса. Приняв решение включить строку из очереди в базис, проверим, нет ли в базисе строк, являющихся подстроками включаемой. Обходя базис теперь сверху–вниз (от более длинных строк к коротким), выпишем все удовлетворяющие этому условию строки базиса. Сформировав такой список SB, проделаем с каждой попавшей в него строкой точно те же действия, что со строкой s из очереди S при выяснении возможности включить ее в базис. Когда вес, вычисленный по корректированной частости очередной строки sB из списка SB оказывается меньше веса очередной строки из S, строка sB исключается из базиса и вносится в список S согласно вычисленному весу. Обход списка SB от самых длинных к самым коротким строкам гарантирует нас от ситуации, когда строка из SB сначала используется для принятия решения об исключении какой-то другой строки из SB, а затем оказывается объектом для такого же решения.
Когда строка вытесняется из базиса в список S (как и в случае отвержения строки–претендента из S — см. выше), будем заполнять вектор обоснования исключения идентификаторами тех строк базиса, по которым и было принято решение об ее исключении. Но тогда при исключении строки из базиса нужно пересчитать веса тех строк, в исключении которых эта строка сама участвовала ранее. С этой целью просматриваются вектора обоснования исключения у строк списка S, расположенных ниже текущей. Если исключаемая строка входит в такой вектор строки s, то вес строки s должен быть пересчитан. Все удовлетворяющие этому условию строки s перемещаются в списке S под текущую строку, то есть становятся в начало текущей очереди на попадание в базис. Тем из них, которые имеют нулевой вес, назначается вес, равный 1. Это нужно для корректного выполнения останова, который производится либо в случае, когда текущий размер базиса окажется не меньше требуемого уже после включения очередной строки и вызванной этим попытки выталкивания из него недостаточно весомых компонент, либо же в случае, когда вес очередной строки из очереди равен 0.
Мы описали процедуру включения/исключения строк, основанную на отношении непосредственной вложенности двух строк. Кроме того, было рассмотрено отношение вложенности строки в конкатенацию пары строк, то есть случай, когда возможно представление строки s = cd, и строк базиса b1 = ec, b2 = df (где подстроки e, c, d, f не пусты). Другие варианты отношения пересечения включаемой/исключаемой строки и строк базиса не рассматривались.
Отношение вложенности в конкатенацию, как и отношение непосредственной вложенности, может использоваться при решении вопроса о включении в базис и вопроса об исключении из базиса. В первом случае это означает, что когда про очередную строку из очереди не было решено вернуть ее (на новое место) в очередь, пересчитанная частость f*(s) корректируется дальше — по включенности s в конкатенации строк базиса. Это как бы дополнительный фильтр, оберегающий базис от включения в него строк с небольшим собственным вкладом.
В случае же использования покрытия конкатенациями для исключения строк из базиса возникает необходимость в значительном переборе (действительно, для любой 2– и почти любой 3–строки всегда найдется сколько-то покрывающих ее конкатенаций). По этой причине строгий алгоритм формирования базиса использовался в двух вариантах — «полном» (включение/исключение с учетом вложенности в обеих ее формах) и быстром (включение с учетом вложенности строки s из очереди непосредственно в строки из базиса и вложенности s в конкатенации пар строк базиса, а исключение только по непосредственной вложенности). Так как с расширением учитываемых зависимостей требуется все больший перебор, мы ограничились только вложенностью. Быстрый вариант алгоритма требует немного времени и играет роль эффективного фильтра, только в последнюю очередь пропускающего в базис строки, плохо совместимые с уже имеющимися в базисе строками.
При том, что, как видно из табл. 4, строгий алгоритм построения базиса дал не лучшие результаты, только о нем можно точно сказать, что именно и с какой целью в нем делается, а какие типы зависимостей — сознательно и явно — игнорируются. Собственно, данный алгоритм является логически строгим, но заведомо не является точным, поскольку игнорируемые (чтобы избежать объемного перебора) зависимости весьма существенны.
6. Сравнение методов
Чтобы поставить методы в равные условия, ни в один из них не была включена проверка того, нельзя ли целиком занести словарь в базис заданного размера. С другой стороны, с этой же целью во всех методах, включая метод наичастого, использовалась процедура построения минимального покрытия. Из табл. 4 видно, что лучшие результаты дал метод надбазиса, худшие — метод наичастого. И если к последнему применимы слова Марка Блока об «эмпиризме в обличье здравого смысла» [2], то первый тяготеет к шаманизму, несмотря на подспудное желание авторов узреть в нем «здравый смысл в обличье эмпиризма». Логически прозрачный алгоритм построения базиса, учитывающий зависимость строк, дал промежуточные результаты на всех словарях кроме небольших. На последних он оказался лучшим. В случае Й–словаря, содержащего 24 основы, из которых 20 несовпадающих, результаты всех трех методов оказались одинаковы. Что следует признать большим везением. Действительно, рассмотрим словарь всего из двух основ — одна длиной 24 и вторая длиной 2, не входящая в первую. Первая основа содержит 231 почти наверняка попарно различную подстроку не короче 4 и сколько-то, возможно совпадающих, подстрок меньшей длины. В таком случае базис будет заполнен исключительно подстроками длинной основы плюс алфавитом. Для второй основы, согласно методу наичастого, в 256–компонентном базисе места не найдется.
Что касается скорости методов, то метод надбазиса очевидно самый медленный, не сильно от него отличается «полный» строгий алгоритм построения базиса.. Самый быстрый метод — наичастого, очень близок к нему по скорости быстрый строгий алгоритм построения базиса, отслеживающий непосредственную вложенность и вложенность в конкатенацию при принятии решения о включении в базис и непосредственную вложенность при принятии решения об исключении из базиса. Наконец, надо заметить, что затраты времени для метода надбазиса определяются размером словаря (выборки), а для строгого алгоритма — наличием вложенностей у рассматриваемых строк.
Табл. 4. Результаты применения трех методов нахождения базиса
Общий минимальный тираж | Среднее покрытие | ||||||
Метод наичастого | Метод надбазиса | Строгий алгоритм построения базиса* | Метод наичастого | Метод надбазиса | Строгий алгоритм построения базиса* | Верхняя оценка на 4–, 3– и 2–строках | |
А | 13238 | 11789 | 12104 (11924) | 1.88 | 2.11 | 2.05 (2.09) | 2.40 |
Б | 13934 | 12725 | 13069 | 1.89 | 2.06 | 2.01 | 2.18 |
В | 31936 | 31119 | 31444 (31347) | 1.79 | 1.84 | 1.82 (1.83) | 1.98 |
Г | 11899 | 10739 | 10947 | 1.89 | 2.09 | 2.05 | 2.35 |
Д | 19403 | 18516 | 18894 | 1.89 | 1.98 | 1.94 | 2.24 |
Е | 1259 | 761 | 630 (614) | 1.94 | 3.21 | 3.88 (3.98) | |
Ж | 2258 | 1762 | 1753 | 2.04 | 2.62 | 2.63 | |
З | 25074 | 24129 | 24468 | 1.91 | 1.99 | 1.96 | 2.27 |
И | 14825 | 13008 | 13382 | 1.83 | 2.09 | 2.03 | 2.39 |
Й | 24 | 24 | 24 | 5.17 | 5.17 | 5.17 | |
К | 25551 | 24088 | 24674 | 1.88 | 1.99 | 1.94 | 2.14 |
Л | 7269 | 6211 | 6337 | 1.78 | 2.08 | 2.04 | 2.58 |
М | 17596 | 16404 | 16800 | 1.89 | 2.03 | 1.98 | 2.22 |
Н | 36112 | 34314 | 34701 | 1.85 | 1.95 | 1.93 | 2.11 |
О | 37489 | 36272 | 36735 | 1.77 | 1.83 | 1.80 | 2.05 |
П | 102894 | 99903 | 100961 (100840) | 1.91 | 1.97 | 1.95 (1.95) | 2.14 |
Р | 27166 | 25526 | 25822 | 1.96 | 2.09 | 2.06 | 2.42 |
С | 43582 | 41918 | 42482 | 1.83 | 1.90 | 1.87 | 2.02 |
Т | 13394 | 12215 | 12521 | 1.87 | 2.05 | 2.00 | 2.29 |
У | 12058 | 10679 | 11419 | 1.81 | 2.04 | 1.91 | 2.65 |
Ф | 6237 | 5263 | 5461 | 2.00 | 2.37 | 2.29 | 2.68 |
Х | 4301 | 3442 | 3513 | 1.96 | 2.44 | 2.40 | 3.00 |
Ц | 1682 | 1220 | 1189 | 2.18 | 3.00 | 3.08 | |
Ч | 3365 | 2664 | 2766 | 1.99 | 2.51 | 2.42 | 3.00 |
Ш | 4349 | 3593 | 3774 | 1.91 | 2.31 | 2.20 | 2.85 |
Щ | 332 | 215 | 211 | 2.82 | 4.35 | 4.44 | |
Э | 5301 | 4451 | 4569 (4550) | 2.18 | 2.59 | 2.53 (2.54) | 2.84 |
Ю | 331 | 176 | 143 | 2.24 | 4.22 | 5.20 | |
Я | 601 | 374 | 276 | 2.16 | 3.47 | 4.71 | |
* В нескольких случаях, помимо быстрого алгоритма построения базиса, использовался и полный (с выведением строк из базиса по пересечению конкатенаций). Полученные им результаты приведены в скобках после значений быстрого алгоритма. |
Благодарности
Мы благодарны людям, без чьей помощи наша работа не была бы выполнена: , предоставившей свой компьютер для продолжительных обсчетов словарей, и , практически полностью профинансировавшей работу. Тот факт, что у них не было ни рациональных причин поддерживать эту работу, ни малейшей заинтересованности в ее результатах, лишь увеличивает нашу признательность.
Литература
1. , Кузнецов средства автоматизированных информационных систем. М. 1983.
2. Апология истории. М. 1986.
3. Бузикашвили величины среднего покрытия словаря. // Настоящий сборник.
4. , , N-граммы в лингвистике. // Методы работы с документами. М. 2000.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 |



