практически лингвистическая задача

zaartix

Новичок
практически лингвистическая задача

Привет, народ.
В общем имеем:
1. входной текст от юзера (возможен как с html, так и без)
2. базу по существительным (все словоформы каждого существительного)

Нужно:
определить наличие каждого слова в базе, если есть, то заменить это слово на спец. символы (ну к примеру на {id найденной записи})

Вопросы:
1. нету-ли способов алгоритмически определить существительное это или другая часть речи?
2. для поиска по базе можно только кучу запросов посылать? по каждому из слов? или есть что-то более быстрое?

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

может у кого-нибудь есть мысли по более оптимальному алгоритму работы?
 

Линка

Новичок
zaartix
Я делала так:
открыла любую книжку и тупо переписала все союзы, предлоги, междометия... их не так уж много
если слово совподала с одним из них то я его исключала
дальше прилагательные--они кончаються на ой, ай и т.д.
значит слова с такими окончаниями можно исключить
глоголы кончаються на ть, ться, тся тоже их исключаешь.
проше взять учебник русского языка и посмотреть правила
 

KRON

Новичок
Это извращение, а для русскаго языка в двойне, но если удасться поделись.
 

Silent

Новичок
Автор оригинала: Линка
Я делала так:

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

глоголы кончаються на ть, ться, тся тоже их исключаешь.
кровать, зять?

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


zaartix, а в чем конкретно проблема? Если есть словари со всеми словоформами и морфологической информацией, то почему бы просто не пройтись по тексту, для каждого слова ищем совпадение в словаре, если оно есть и уникально, то делаем что хотим. Останутся слова вроде "души", которые могут быть как существительным, так и глаголом, и без учета семантики нет почти никаких способов их разделить. Но их будет не слишком много.
 

Линка

Новичок
Silent
Согласна , я имела в виду не ой а ной и так далее окончания.
есть конечно слова-существительные которые попадут под такой алгоритм и отпадут.
Но я больше чем уверена, что если человек
может опираясь на правила отличить сущ от глагола то и машину можно научить (естественно скакой-то долей потерь слов)
zaartix
Блин, заразил меня своей идеей, надо будет отрыть свои кода по этому делу и наконецто закончить анализатор
 

Silent

Новичок
Человек в основном опирается на свой опыт и словарный запас. Для машины это заменяется словарями, которые, как я понял, у автора вопроса уже есть. Поэтому в первую очередь нужно реализовать словарный алгоритм, а потом уже по необходимости думать о нечетких алгоритмах.
 

Rammstein

PHPClub::News
В плане русского языка это оооочень проблематично.
А, вообще, остаётся делать так как говорит Линка.
 

alexhemp

Новичок
zaartix

Построить инвертированный индекс не очень сложно, есть ispell, aspell для каждого из них есть русские словари.

Генерировать осмысленный текст вряд-ли получиться.

Решил дорвеи генерировать что-ли? Это вообще поисковым спамом называется....
 

zaartix

Новичок
alexhemp
ну генерация текста не только для поисковиков используется, есть к примеру генераторы стихотворений, метод повтора новости, когда событие несколько раз происходит и многое другое. Самое частое сейчас приминение подобных вещей - это дорвеи, согласен. Но мне это не для дорвеев надо.

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

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

таблица словоформ
id - id
form - целиком слово (совместный индекс)
form_4str - первые 4 буквы слова (совместный индекс)
chid - id записи из таблицы морфологических характеристик (индекс) (в случае если запись является исходной формой слова - записывается как -1)

таблица связей словоформ (используется для определения исходной формы заданного слова)
id - id
form_id - id исходной формы слова из таблицы словоформ (индекс)
formTo_id - id слова из таблицы словоформ (индекс)

таблица морфологических характеристик (не планируется использоваться алгоритмом, чисто для информации)
id - id
name - словесная запись характеристики
вот пример записи:
Код:
28;"Винительный неод. - Мужской"
29;"Винительный неод. - Женский"
30;"Винительный неод. - Средний"
31;"Винительный одуш. - Мужской"
32;"Винительный одуш. - Женский"
33;"Винительный одуш. - Средний"
34;"Творительный - Мужской"
35;"Творительный - Женский"
36;"Творительный - Средний"
синонимы я пока не учитываю в структуре, первоочередной задачей является найти исходную форму (ес-но когда с синонимами завяжу структуру - то удалю из базы все те записи, которые не имеют синонимов)

Как вам структура бд? Можно оптимизировать с точки зрения скорости? и попутный вопрос, для этой задачи, так полагаю тип MyIsam для таблиц наиболее оптимальный? ведь строки не планируется заносить, чистый словарь
 

Линка

Новичок
zaartix
Я тут опять решила вернутся к теме.
Я согласна что научить машину определять сущ как это делает чел тяжело, т.к. есть слова которые попалибы (с точки зрения машины )не только в клас сущ но и примеру в прилагательные.
если отлавливать окончаня то слово красной по по окончанию НОЙ прилагательно, и сто пудово привстрече слова КОПНОЙ (имеется в виду под копной) кот являеться сущ машина ошибеться
Silent прав что человек использует знания накопленные за жизнь, и есле у чела была даже 2 по русскому существительное он определит сразу. по этому предлагаю обучать машину таким спомсоб (просто передовая ей свой знания)
задачей было определить существительные в русском тексте.
решение:
берешь любой текстовый файл с большим текстом(оч большим) желатьлно без ошибок.
считываешь его и выводишь на экран пословно(по оному слову)
браузер будет ожидать от тя только 3 движения(их можно поцепить на горячие клавиши)
1.ты смотриш на слово и если ты уверен счто это сущ нажимаешь подтверждение типа кнопка 1 и код заносит это слово в базу как сущ
2 есле это не сущ нажимаеш кнопку 2 и машина не заносит его в базу(если оно сто пудово не сущ)
3 а этот вариант если ты сомневаешься в принадлежности слова тюкю не видишь все предложение ,жми 3 и отправляй в базу как непонятное
из расчета что в языке прим 100 тыс слов считая 1 слова за 1 сек 3600слов в час, где то за неделю ты мрожешь получить неплохую базу существительных, в которых уверен на все сто, и потом по правилам, деля их на группы выделять корень и мутить то что ты задумал
этоже можно применить и к глаголам
P.S. главное перед выводом слова на экран проверять а вдруг оно было и уже в базе.
P.S. S.те которые ты отсеешь лучше тоже заносить в базу что бы опятьже проверять и не выводить по повторно на экран
 

Silent

Новичок
Это только словарных форм примерно 100 тысяч. Всех словоформ больше миллиона. И зачем это все делать, если есть уже готовые словари?
 
Сверху