Я имел в виду только "лес" - полгода назад серьезно за него получил по рукам Стемминг у меня тогда дал баг и давал шаблончик вроде "лес\w+", по которому я и пролетел По тому, как профессионально меня потом в форуме распекли и какой был ник, я и подумал... в общем, сорри, значит ошибся.
Для этого нужен хороший большой словарь. А пока нету
Тут нужно хотя бы попытаться нормальную четкую морфологию родить
Это стемминг называется. Прямо скажем, решение не совсем удачное, но когда вообще ничего нет и в прикладной лингвистике не разбираешься, на первое время сойдет. Хотя тогда начинают возникать интересные казусы. Например, по запросу 'лес' начинает находиться 'лесби' и т.д. (вон Keva хорошо знает, это его любимый запрос )
А вообще собрать морфологию просто так, на ровном месте, очень трудно, даже если ты семи пядей во лбу - там одних только морфологических таблиц должно быть не менее 700 и взять их можно только у лингвистов или пытаться как-то синтезировать из подручных средств.
Хотя мне, в принципе, уже удалось создать довольно работоспособный
морфологический анализатор для существительных и прилагательных, который, правда, учитывает пока не все аспекты русского языка.
В общем, морфология - это куча хлопот и времени, так что если ее предлагают почти бесплатно, берите
Ссылки по теме:
http://www.zdnet.ru/pcmag/9612/129611.asp
Здесь реализация CRC32 (взята с http://klariosha.narod.ru/PN/DOC/doc-i02.htm):
u_long crc32_table[256];/* Initialized first time "crc32()" is called. If you prefer, you can * statically initialize it at compile time. [Another exercise.] */u_long crc32(u_char *buf, int len){ u_char *p; u_long crc; if (!crc32_table[1]) /* if not already done, */ init_crc32(); /* build table */ crc = 0xffffffff; /* preload shift register, per CRC-32 spec */ for (p = buf; len > 0; ++p, --len) crc = (crc << 8) ^ crc32_table[(crc >> 24) ^ *p]; return ~crc; /* transmit complement, per CRC-32 spec */}/* * Build auxiliary table for parallel byte-at-a-time CRC-32. */#define CRC32_POLY 0x04c11db7 /* AUTODIN II, Ethernet, & FDDI */init_crc32(){ int i, j; u_long c; for (i = 0; i < 256; ++i) { for (c = i << 24, j = 8; j > 0; --j) c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1); crc32_table = c; }}[This message has been edited by Vyacheslav Tikhonov (edited 02-10-2001).][This message has been edited by Vyacheslav Tikhonov (edited 02-10-2001).]
Насчет 'почти' - для циклической суммы нереально. Я здесь привел термин 'почти' для того, чтобы показать, что у каждого слова должен быть свой уникальный код, иначе возникают коллизии. Реально же уникальный код получить сложно и больше для этого подойдет какая-нибудь хэш-функция типа MD5. Или придется разрешать коллизии.
Это в лучшем случае, если уже есть торговая марка. Если нет, то еще +100$
Материал по теме:
http://uatoday.net/kernel/tech/news-6137.html
Циклический код - используется для нахождения контрольной суммы. В данной версии поисковика по слову определяется его почти(!) уникальный числовой код и заносится в базу. Поиск потом идет не по самому слову, а по его коду, что проще.
Широко используется в основном в криптографии наряду с другими подобными хэш-функциями. В поисковых системах я встречал его в HTDig, если не ошибаюсь.
[This message has been edited by Vyacheslav Tikhonov (edited 02-10-2001).]