Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Вниз

список замен   Найти похожие ветки 

 
kiberg   (2008-04-02 13:22) [0]

Нужно сделать список замен для неправильного слова (очепятки):

Возможные очепятки:
1) поставлена лишняя буква
2) пропущена буква
3) поставлена неверная буква
4) две соседние буквы поменялись местами

Я создаю список возможных исправлений, а потом проверяю их в словаре. Найденные считаю верными.

У меня проблема в скорости работы алгоритма.
Если проверять один уровень вложенности ошибок, то впринципе все нормально 66n+31 варианта замен. Но если нужно проверить два уровня вложенности ошибок и слово длинное, то начинаются тормоза.

Как можно оптимизировать алгоритм?


 
Johnmen ©   (2008-04-02 13:23) [1]


> Как можно оптимизировать алгоритм?

Какой алгоритм?


 
Reindeer Moss Eater ©   (2008-04-02 13:24) [2]

надо составить пары строк - регулярное выражение, "узнающее" искаженное слово и само слово с правильной формой.


 
Дмитрий С   (2008-04-02 13:26) [3]

А не проще словарь перебирать?


 
Reindeer Moss Eater ©   (2008-04-02 13:27) [4]

словарь перебрать проще. только что это даст?


 
Дмитрий С   (2008-04-02 13:42) [5]

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


 
Reindeer Moss Eater ©   (2008-04-02 13:45) [6]

я напишу функцию, которая из "мама" сделает "папа"


 
Дмитрий С   (2008-04-02 13:46) [7]


> я напишу функцию, которая из "мама" сделает "папа"
>

А кто виноват, что ты не ту функцию напишешь =)))


 
Reindeer Moss Eater ©   (2008-04-02 13:46) [8]

два раза пункт 3 - и вот мама стала папой.
будем менять?


 
Дмитрий С   (2008-04-02 13:48) [9]

слово МАМА и так в словаре должно быть, зачем чтото с ним делать?


 
Reindeer Moss Eater ©   (2008-04-02 13:53) [10]

Хорошо.
Сканируем словарь пр алфавиту и доходим в нем до "мама"
В тексте встречаем слово "папа" (до него в словаре еще не дошли)
и "папа" этой функцией превращается в "мама"


 
Игорь Шевченко ©   (2008-04-02 14:08) [11]

Если в слове ХЛЕБ сделать четыре ошибки, получится ПИВО.

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


 
kiberg   (2008-04-02 14:15) [12]


> Johnmen ©   (02.04.08 13:23) [1]
>
> > Как можно оптимизировать алгоритм?
>
> Какой алгоритм?


1) Беру неизвестное слов
2) Из него создаю возможный список исправелний, т.е. перебираю все варианты ошибок.
3) Проверяю есть ли в этом списке известные слова. Если да, то возвращаю эти слова и выхожу из алгоритма. Если нет, то для каждого слова из этого списка опять создаю новый список возможных исправлений
4) Проверяю есть ли в новом списке известные слова, если ни одного нет, то выход, если есть вывожу их.


 
Kolan ©   (2008-04-02 14:21) [13]

Лучьше используй какой-нибудь алгоритм нечеткого сравнения строк.


 
Reindeer Moss Eater ©   (2008-04-02 14:22) [14]

1) Беру неизвестное слов
"рара" например

2) Из него создаю возможный список исправелний, т.е. перебираю все варианты ошибок.
мама, папа, пиво, ....

3) Проверяю есть ли в этом списке известные слова. Если да, то возвращаю эти слова и выхожу из алгоритма. Если нет, то для каждого слова из этого списка опять создаю новый список возможных исправлений4)
есть есть. причем до фига есть.

Проверяю есть ли в новом списке известные слова, если ни одного нет, то выход, если есть вывожу их.

Есть, и не одно.

что дальше?


 
Johnmen ©   (2008-04-02 14:22) [15]


> kiberg   (02.04.08 14:15) [12]

1.ХЛЕБ
 |
2. ПЛЕБ, ХИЕБ, ХЛВБ, ХЛЕО, ПИВО
 |
3. известное слово есть, это ПИВО. Выводим ПИВО, выходим.

Я правильно понял?


 
Reindeer Moss Eater ©   (2008-04-02 14:24) [16]

Неправильно. Пляшем от неузнанного слова.


 
Johnmen ©   (2008-04-02 14:25) [17]

Неузнанное слово - ХЛЕБ.
Кстати, что значит "неузнанное"?


 
Reindeer Moss Eater ©   (2008-04-02 14:26) [18]

"хлеб" есть в словаре. оно "узнанное"


 
Johnmen ©   (2008-04-02 14:27) [19]

Хорошо.
Пусть неузнанное слово - ХЛЁБ.


 
Reindeer Moss Eater ©   (2008-04-02 14:28) [20]

Тогда [14]


 
kiberg   (2008-04-02 14:29) [21]


> Kolan ©   (02.04.08 14:21) [13]
> Лучьше используй какой-нибудь алгоритм нечеткого сравнения
> строк.



> Reindeer Moss Eater ©   (02.04.08 14:22) [14]
> Есть, и не одно.
>
> что дальше?


Все, результат получен, вывожу на экран


> Johnmen ©   (02.04.08 14:22) [15]
>
> > kiberg   (02.04.08 14:15) [12]
>
> 1.ХЛЕБ
>  |
> 2. ПЛЕБ, ХИЕБ, ХЛВБ, ХЛЕО, ПИВО
>  |
> 3. известное слово есть, это ПИВО. Выводим ПИВО, выходим.
>
>
> Я правильно понял?


Правильно так

1.ХЛИБ
|
2. ПЛИБ, ХИИБ, ХЛВБ, ХЛЕБ B т.д
|
3. известное слово есть, это ХЛЕБ. Выводим ХЛЕБ, выходим.


 
Johnmen ©   (2008-04-02 14:29) [22]

[14] похоже на [15]


 
Reindeer Moss Eater ©   (2008-04-02 14:30) [23]

Все, результат получен, вывожу на экран

всех экранов федерации не хватит на такой результат


 
Johnmen ©   (2008-04-02 14:31) [24]


> kiberg   (02.04.08 14:29) [21]

По какому алшоритму сформировался волшебный список 2. ПЛИБ, ХИИБ, ХЛВБ, ХЛЕБ?
И что, если в этом списке будет ХЛЕВ?


 
kiberg   (2008-04-02 14:31) [25]


> Reindeer Moss Eater ©   (02.04.08 14:30) [23]
> Все, результат получен, вывожу на экран
>
> всех экранов федерации не хватит на такой результат


Да ладно!

У меня максимум получается штук десять.


 
Reindeer Moss Eater ©   (2008-04-02 14:32) [26]

И что, если в этом списке будет ХЛЕВ?

Там будут вообще все слова из словаря из четырех букв и даже наверное не только из четырех.


 
Рамиль ©   (2008-04-02 14:35) [27]


> Пусть неузнанное слово - ХЛЁБ.

Получаем ХЛЕБ, есть в словаре, выходим.


 
Mystic ©   (2008-04-02 14:35) [28]

> Проверяю есть ли в этом списке известные слова.

Вот тут подробнее. Список отсортирован? Поиск бинарный?


 
Рамиль ©   (2008-04-02 14:35) [29]


> Рамиль ©   (02.04.08 14:35) [27]

Сорри, страницу не посмотрел.


 
Reindeer Moss Eater ©   (2008-04-02 14:36) [30]

У меня максимум получается штук десять.

потому что алгоритм с условностями и исправляет варианты, которые ты просчитал сам.


 
kiberg   (2008-04-02 14:36) [31]


> Johnmen ©   (02.04.08 14:31) [24]
>
> > kiberg   (02.04.08 14:29) [21]
>
> По какому алшоритму сформировался волшебный список 2. ПЛИБ,
>  ХИИБ, ХЛВБ, ХЛЕБ?
> И что, если в этом списке будет ХЛЕВ?


1) удаляю одну букву из слова = n вариантов
2) добавляю одну букву алфавита в какое нибудь место слова = 32(n+1) варианта
3) меняю соседние буквы = n-1 вариант
4) заменяю какую-нибудь букву в слова на другую 32n варианта

если будет два или больше подходящих слова, то вывожу на экран


 
Johnmen ©   (2008-04-02 14:36) [32]


> Рамиль ©   (02.04.08 14:35) [27]

Пора прочитать и осознать [14], [15] и [24].


 
Reindeer Moss Eater ©   (2008-04-02 14:38) [33]

1) удаляю одну букву из слова = n вариантов
2) добавляю одну букву алфавита в какое нибудь место слова = 32(n+1) варианта
3) меняю соседние буквы = n-1 вариант
4) заменяю какую-нибудь букву в слова на другую 32n варианта

если будет два или больше подходящих слова, то вывожу на экран


У тебя там будет не два и более слова, а весь словарь.


 
kiberg   (2008-04-02 14:38) [34]


> > Проверяю есть ли в этом списке известные слова.
>
> Вот тут подробнее. Список отсортирован? Поиск бинарный?


Список замен не отсортирован, я его перебираю весь. Словарь хеширован.


 
Reindeer Moss Eater ©   (2008-04-02 14:39) [35]

или почти весь. все зависит от лимита ошибок на слово.


 
Johnmen ©   (2008-04-02 14:40) [36]


> kiberg   (02.04.08 14:36) [31]

+
Как можно оптимизировать алгоритм?

Этот алгоритм надо выкинуть.


 
kiberg   (2008-04-02 14:41) [37]


> Reindeer Moss Eater ©   (02.04.08 14:38) [33]
> У тебя там будет не два и более слова, а весь словарь.


Как там может быть весь словарь. Возьмем, например, слово ХЛИБ. Сколько ты можешь сходу придумать правильных вариантов кроме как ХЛЕБ?


 
kiberg   (2008-04-02 14:42) [38]


> Reindeer Moss Eater ©   (02.04.08 14:39) [35]
> или почти весь. все зависит от лимита ошибок на слово.


Максимум две ошибки на слово, и то с ограничениями.


> Johnmen ©   (02.04.08 14:40) [36]
>
> > kiberg   (02.04.08 14:36) [31]
>
> +
> Как можно оптимизировать алгоритм?
>
> Этот алгоритм надо выкинуть.


Предложи другой


 
Reindeer Moss Eater ©   (2008-04-02 14:43) [39]

все слова из словаря из четырех букв - раз
все слова на три буквы - ошибка с пропущеной буквой
все слова на пять букв - ошибка с лишней буквой.

а если учесть, что пропасть может не одна и лишних может быть не одна, то считай сам.


 
kiberg   (2008-04-02 14:49) [40]


> Reindeer Moss Eater ©   (02.04.08 14:43) [39]
> все слова из словаря из четырех букв - раз
> все слова на три буквы - ошибка с пропущеной буквой
> все слова на пять букв - ошибка с лишней буквой.
>
> а если учесть, что пропасть может не одна и лишних может
> быть не одна, то считай сам.


Как можно сделав всего две ошибки в слове получить все слова из 3, 4 и 5 букв? При том, что проверив только на возможность одной ошибки получаем правильный вариант, т.е. две ошибки сразу же не рассматриваются.


 
Reindeer Moss Eater ©   (2008-04-02 14:51) [41]

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


 
Johnmen ©   (2008-04-02 14:52) [42]


> kiberg   (02.04.08 14:42) [38]
> Предложи другой

Это надо думать. А мне лень :))


 
kiberg   (2008-04-02 14:56) [43]


> Reindeer Moss Eater ©   (02.04.08 14:51) [41]
> а ты заранее заложился на то, что может быть допущена только
> определенная комбинация двух ошибок?


Любая комбинация двух ошибок.


 
Johnmen ©   (2008-04-02 14:57) [44]

Кстати, а такие случаи - УГРОЗА/УГРО ЗА/У,ГРОЗА - как?
Являются ли пробел и запятая "буквами"?


 
Reindeer Moss Eater ©   (2008-04-02 14:58) [45]

ну ок.
как ты будешь проверять такую комбинацию:
- любые две буквы возможно переставлены местами
- возможно пропущена одна буква.


 
Johnmen ©   (2008-04-02 15:00) [46]


> kiberg   (02.04.08 14:56) [43]
> Любая комбинация двух ошибок.

Слово ХОРОМ. Это что? ХРОМ или ХОРОМЫ? Или оставим его в покое, ибо правильное?


 
Mystic ©   (2008-04-02 15:02) [47]

> Список замен не отсортирован, я его перебираю весь. Словарь
> хеширован.


Интуитивно кажется, что это не самое лучшее решение. Во-первых, когда ты сгенерируешь все возможные "ошибки", то в этом списке будет очень много слов, которые будут начинаться так же, как и исходное слово. Так что возможно более быстрым будет такой вариант:

(1) Отсортировать замены
(2) Разбить список замен на два. В первый список должны войти слова, у которых первые три буквы совпадают с тем, что встречается в слове. Во второй список все остальные слова
(3) Потом пройтись по всем словам, что начинаются с первых трех букв. И искать эти слова в списках замены
(4) А по остальным словам просто искать по словарю.


 
kiberg   (2008-04-02 15:02) [48]


> Johnmen ©   (02.04.08 14:57) [44]
> Кстати, а такие случаи - УГРОЗА/УГРО ЗА/У,ГРОЗА - как?
> Являются ли пробел и запятая "буквами"?


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


 
MBo ©   (2008-04-02 15:04) [49]

1. Почитать о дистанции редактирования (edit distance) - ДП-алгоритм
2. Найти в инете описание алгоритма, используемого в Google ("возможно, вы имели в виду ...")


 
Reindeer Moss Eater ©   (2008-04-02 15:05) [50]

длинное слово (скажем букв 12) с уже упомянутой комбинацией
сколько будет вариантов интерпретации?

любые две соседние могут быть переставлены.
после чего одна из переставленных опущена.
или наоборот.
опущена, а потом переставлены не соседние в исходном слове.

сколько вариантов?


 
Mystic ©   (2008-04-02 15:07) [51]

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


 
kiberg   (2008-04-02 15:08) [52]


> Reindeer Moss Eater ©   (02.04.08 14:58) [45]
> ну ок.
> как ты будешь проверять такую комбинацию:
> - любые две буквы возможно переставлены местами
> - возможно пропущена одна буква.


Могут поменяться только две соседние буквы. Этот вариант все равно проверится правильно.


> Johnmen ©   (02.04.08 15:00) [46]
> Слово ХОРОМ. Это что? ХРОМ или ХОРОМЫ? Или оставим его в
> покое, ибо правильное?


Такое слово оставим в покое - оно есть в словаре.


 
Reindeer Moss Eater ©   (2008-04-02 15:10) [53]

Могут поменяться только две соседние буквы. Этот вариант все равно проверится правильно.

У нас по твоим же условиям могут быть две любые ошибки.

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


 
Reindeer Moss Eater ©   (2008-04-02 15:12) [54]

Или наоборот. Меняю местами, потом теряю одну поменявшую свое место.


 
Eraser ©   (2008-04-02 15:12) [55]


> Kolan ©   (02.04.08 14:21) [13]

+1

вот простейший пример http://www.delphikingdom.com/asp/viewitem.asp?catalogid=722
для простых задач вполне достаточно.


 
kiberg   (2008-04-02 15:13) [56]


> Mystic ©   (02.04.08 15:02) [47]


Надо попробовать. Какие еще есть идеи?


> MBo ©   (02.04.08 15:04) [49]
> 1. Почитать о дистанции редактирования (edit distance) -
>  ДП-алгоритм
> 2. Найти в инете описание алгоритма, используемого в Google
> ("возможно, вы имели в виду ...")


Про алгоритм Google читал, я так понял у них то же самое что и у меня, только они еще учитывают частоту встречаемости слов.


> Reindeer Moss Eater ©   (02.04.08 15:05) [50]
> длинное слово (скажем букв 12) с уже упомянутой комбинацией
> сколько будет вариантов интерпретации?
>
> любые две соседние могут быть переставлены.
> после чего одна из переставленных опущена.
> или наоборот.
> опущена, а потом переставлены не соседние в исходном слове.
>
>
> сколько вариантов?


677329


 
Johnmen ©   (2008-04-02 15:15) [57]


> kiberg   (02.04.08 15:08) [52]
> Такое слово оставим в покое - оно есть в словаре.

Т.е. в словаре будут все склонения/спряжения/... - все известные словоформы???

ЗЫ
Скажи, это задача учебная или рабочая?


 
Reindeer Moss Eater ©   (2008-04-02 15:16) [58]

677329

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


 
kiberg   (2008-04-02 15:25) [59]


> Eraser ©   (02.04.08 15:12) [55]
>
> > Kolan ©   (02.04.08 14:21) [13]
>
> +1
>
> вот простейший пример http://www.delphikingdom.com/asp/viewitem.
> asp?catalogid=722
> для простых задач вполне достаточно.


Т.е. вы предлагаете неизвестное слово сравнивать этим алгоритмом со всеми словами из словаря. Я не проверял, но думаю что это будет еще медленне.


> Johnmen ©   (02.04.08 15:15) [57]
>
> > kiberg   (02.04.08 15:08) [52]
> > Такое слово оставим в покое - оно есть в словаре.
>
> Т.е. в словаре будут все склонения/спряжения/... - все известные
> словоформы???
>
> ЗЫ
> Скажи, это задача учебная или рабочая?


Это рабочая задача. Для одной возможно ошибки она успешно решена. Даже когда учитывается две ошибки и слово не очень длинное до 5 символов, то тормозов не заметно, но для слова из 20 символов задержка 6 сек.


 
Mystic ©   (2008-04-02 15:27) [60]

Еще идея схожая с [47], только индексировать не только начало слова, но и конец. Правда в русском языке слова часто оканчиваются одинаково, так что толку с этого индекса будет немного. Но можно попытаться прикрутить индексы по словам, начинающихся со второй букве, с третьей и т. п. Потом по этим индексам брать списки со словаря и вычислять количество несоответствий.


 
Reindeer Moss Eater ©   (2008-04-02 15:34) [61]

Если задача рабочая, то значит есть характерные опечатки. Точнее слова - кандидаты на то, что в них вероятно будут опечатки. Я бы просто завел пополняемый словарь таких слов с регулярками для их узнавания. Это было бы намного эффективнее бесполезного перебора всех возможных вариантов совершения опечаток в неузнанных словах.


 
kiberg   (2008-04-02 15:37) [62]


> Mystic ©   (02.04.08 15:27) [60]
> Еще идея схожая с [47], только индексировать не только начало
> слова, но и конец. Правда в русском языке слова часто оканчиваются
> одинаково, так что толку с этого индекса будет немного.
> Но можно попытаться прикрутить индексы по словам, начинающихся
> со второй букве, с третьей и т. п. Потом по этим индексам
> брать списки со словаря и вычислять количество несоответствий.
>

Спасибо, попробую.


> Reindeer Moss Eater ©   (02.04.08 15:34) [61]
> Если задача рабочая, то значит есть характерные опечатки.
>  Точнее слова - кандидаты на то, что в них вероятно будут
> опечатки. Я бы просто завел пополняемый словарь таких слов
> с регулярками для их узнавания. Это было бы намного эффективнее
> бесполезного перебора всех возможных вариантов совершения
> опечаток в неузнанных словах.

Такой механизм уже есть. Пользователи хотят исправления любых случайных ошибок :(


 
Reindeer Moss Eater ©   (2008-04-02 15:38) [63]

любых? или любых двух? :)


 
kiberg   (2008-04-02 15:41) [64]


> Reindeer Moss Eater ©   (02.04.08 15:38) [63]
> любых? или любых двух? :)


Я думаю, если у меня не получится для двух сделать, то они согласятся и на одну :)


 
Johnmen ©   (2008-04-02 15:46) [65]


> kiberg  

Такая фраза
"Откусив хлеВа краюху, он пРожевал её немного, подумал, и пошёл повесился"
Здесь есть ошибки?


 
kiberg   (2008-04-02 15:52) [66]


> Johnmen ©   (02.04.08 15:46) [65]
>
> > kiberg  
>
> Такая фраза
> "Откусив хлеВа краюху, он пРожевал её немного, подумал,
> и пошёл повесился"
> Здесь есть ошибки?


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


 
Reindeer Moss Eater ©   (2008-04-02 15:54) [67]

а "прожевал" заменишь на "проживал" ?

или нет?


 
kiberg   (2008-04-02 16:00) [68]


> Reindeer Moss Eater ©   (02.04.08 15:54) [67]
> а "прожевал" заменишь на "проживал" ?
>
> или нет?


Нет, заменю на "прожевал".


 
Reindeer Moss Eater ©   (2008-04-02 16:06) [69]

значит и ошибочное "проживал" на "прожевал"  тоже не заменишь.
хотя всего одна элементарная ошибка.

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

к тому же нет никакого ограничения на количество опечаток.


 
Johnmen ©   (2008-04-02 16:08) [70]


> kiberg   (02.04.08 15:52) [66]

Я не про регистр.
Я про слово ХЛЕВ, хотя д.б. ХЛЕБ, и про ПРОЖЕВАЛ, хотя д.б. ПОЖЕВАЛ.
Так как здесь будет?


 
kiberg   (2008-04-02 16:15) [71]


> Johnmen ©   (02.04.08 16:08) [70]
>
> > kiberg   (02.04.08 15:52) [66]
>
> Я не про регистр.
> Я про слово ХЛЕВ, хотя д.б. ХЛЕБ, и про ПРОЖЕВАЛ, хотя д.
> б. ПОЖЕВАЛ.
> Так как здесь будет?


Грамматические ошибки не проверяются, только орфографические.


 
Johnmen ©   (2008-04-02 16:28) [72]


> kiberg   (02.04.08 16:15) [71]
> Грамматические ошибки не проверяются, только орфографические.

Т.е. если опечатка порождает легитимную словоформу, то ошибки нет, не смотря на то, что написана получается полная ерунда?


 
kiberg   (2008-04-02 16:30) [73]


> Johnmen ©   (02.04.08 16:28) [72]
> Т.е. если опечатка порождает легитимную словоформу, то ошибки
> нет, не смотря на то, что написана получается полная ерунда?


ага


 
Reindeer Moss Eater ©   (2008-04-02 16:33) [74]

ага

программирование ради программирования.


 
VirEx ©   (2008-04-02 16:38) [75]

Словарь - это последнее дело.
Сравнивай возможность правильного/неправильного сочетания букв, как это делает пунтосвичер.
пиво, сочетания пи, ив и во
пвио, пв (?)


 
Игорь Шевченко ©   (2008-04-02 16:39) [76]

мсяо


 
kiberg   (2008-04-02 16:43) [77]


> Reindeer Moss Eater ©   (02.04.08 16:33) [74]
> ага
>
> программирование ради программирования.


Нет. Проверка грамматики там не очень нужна, и пользователи ее слава богу не требуют.


> VirEx ©   (02.04.08 16:38) [75]
> Словарь - это последнее дело.
> Сравнивай возможность правильного/неправильного сочетания
> букв, как это делает пунтосвичер.
> пиво, сочетания пи, ив и во
> пвио, пв (?)


О! А, об это по подробнее, пожалуйста.


 
Mystic ©   (2008-04-02 16:47) [78]

> программирование ради программирования.

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


 
Reindeer Moss Eater ©   (2008-04-02 16:53) [79]

отчасти потому, что решая задачу в конкртеной области решили написать "универсальный решатель задач"


 
VirEx ©   (2008-04-02 17:09) [80]


> О! А, об это по подробнее, пожалуйста.

Лучше проверять такие сочетания в слогах, а то бывают такие словечки, что язык сломаешь.
Была здесь раньше такая тема:
Gydvin ©   (09.07.07 17:49)
Нигде случайно не попадался словарь переносов русского языка? В текстовом формате самое оно.
Очень нужно.


Предлагал такой код:

function WordToSlog(str:string;words_iskl:TStrings):string;
function UpString(str:string):string;
var
i:integer;
begin
result:=str;
for i:=1 to length(Result) do
case Result[i] of
  "а".."я":   Dec(Result[i], 32);
end;
end;

//ищет в строке str с позиции index комбинацию из всех комбинаций согласной s и гласной g
function slog(str:string; index:integer; s,g:array of string):boolean;
//проверяет, гласная ли буква
function IsGlasn(c:char;g:array of string):boolean;
var
  i:integer;
begin
result:=false;
  for i:=low(g) to high(g) do
    if c=g[i] then begin
    result:=true;
    exit;
    end;
end;
var
i,y:integer;
s_,l_:string;
begin
result:=false;
for i:=low(s) to high(s) do
  for y:=low(g) to high(g) do begin
    s_:=UpString((s[i]+g[y]));
    l_:=UpString(copy(str,index,2));
      if s_=l_ then
        {если перед слогом стоит гласная, то}
        {if IsGlasn(str[index-1],g) then} begin
        result:=true;
        exit;
        end;
    end;

end;

//проверяет, по индексу в строке, стоит ли предлог, и передает через len его длину
function IsPredlog(str:string; index:integer; p:array of string; var len:integer):boolean;
var
i:integer;
begin
result:=false;
for i:=low(p) to high(p) do
  if copy(str,index,length(p[i]))=p[i] then begin
  len:=length(p[i]);
  result:=true;
  exit;
  end;
end;

//ищет корень, точно такой же поиск как поиск предлога
function IsKoren(str:string; index:integer; c:array of string; var len:integer):boolean;
begin
result:=IsPredlog(str,index,c,len);
end;

//количество слогов
function GetSlogCount(str:string; s,g:array of string):integer;
var
i:integer;
begin
result:=0;
for i:=1 to length(str) do
  if slog(str,i,s,g) then inc(result);
end;

//вставляет стоку substr в искомую str в позицию index
procedure InsStr(var str:string; substr:string; index:integer);
begin
if index=0 then exit;
str:=copy(str,1,index)+substr+copy(str,index+length(substr),length(str))
end;

const
//а б в г д е ё ж з и к л м н о п р с т у ф х ц ч щ ь ъ э ю я
s : array[1..19] of string =("б","в","г","д","ж","з","к","л","м","н","п","р","с","т","ф","х","ц","ч","щ"); //согласные
g : array[1..10] of string =("а","е","ё","и","о","у","э","ю","я","ы");//гласные
p : array[1..3] of string =("пре","пере","под"); //предлоги
c : array[1..3] of string =("прав","нос","воскл");//корни

var
i,y,z:integer;
begin
result:=str;
for i:=0 to words_iskl.Count-1 do
  if UpString(str)=UpString(words_iskl[i]) then exit;

//если меньше одного слога то не переносится
if GetSlogCount(str,s,g)<2 then exit;

i:=1;y:=0;
while i<length(str) do begin
z:=0;
  if IsPredlog(str,i,p,z) then inc(i,z) else //предлоги не переносим
  if IsKoren(str,i,c,z) then inc(i,z) else   //также как и корни
  if slog(str,i,s,g) then begin
  inc(y);
  if y>1 then //избавляемся от просто --> п-рос-то
    InsStr(str,"-",i-1);
  inc(i);
  end;
inc(i);
end;
result:=str;
end;


результат работы:
Москва Москва
Идиот Идиот
Лохотрон Лохотрон
Квазимодо Ква-зи-мо-до
Параллелепипед Па-рал-ле-ле-пи-пед
Изобретатель Изоб-ре-та-тель
слово сло-во
мангал ман-гал
трапеция тра-пе-ция
караганда ка-ра-ган-да
переносимый переноси-мый
эксгибиционист эксги-би-цио-нист
неправдоподобный неправдоподоб-ный
восклицание восклица-ние
абстракция абстрак-ция
странный стран-ный

икслючения:
Азия
узнаю
фойе
Москва
Лохотрон

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


 
clickmaker ©   (2008-04-02 17:21) [81]


> пвио, пв (?)

"мой папа служит в ПВО: и морда - во, и жопа - во"


 
Johnmen ©   (2008-04-02 17:28) [82]

"а потому, что пьёт он ПИВО"


 
VirEx ©   (2008-04-02 17:31) [83]


>  [81] clickmaker ©   (02.04.08 17:21)
>
> > пвио, пв (?)
>
> "мой папа служит в ПВО: и морда - во, и жопа - во"

ЭТО НИРАЗУ НЕ СЛОВО РУССКОГО ИЗЫКА, ПОЭТОМУ ДАЖЕ ВОРД ИГНОРИРУЕТ


 
VirEx ©   (2008-04-02 17:33) [84]


> [82] Johnmen ©   (02.04.08 17:28)
> "а потому, что пьёт он ПИВО"

вот поэтому и было предложено

> [80] VirEx ©   (02.04.08 17:09)


 
Johnmen ©   (2008-04-02 17:38) [85]


> ЭТО НИРАЗУ НЕ СЛОВО РУССКОГО ИЗЫКА, ПОЭТОМУ ДАЖЕ ВОРД ИГНОРИРУЕТ

А какого языка это слово? Сам я даже боюсь предположить...
И чт о за слово "ВОРД"? Игнорируем...


 
VirEx ©   (2008-04-02 17:51) [86]


>  [85] Johnmen ©   (02.04.08 17:38)

это аббревиатура


 
Johnmen ©   (2008-04-02 18:00) [87]


> VirEx ©   (02.04.08 17:51) [86]
> это аббревиатура

А аббревиатура - это трансглюкавые мымрики?


 
Anatoly Podgoretsky ©   (2008-04-02 18:11) [88]

> Дмитрий С  (02.04.2008 13:42:05)  [5]

Из слова хлеб элементарно получается пиво, путем всего лишь четырех замен.


 
Anatoly Podgoretsky ©   (2008-04-02 18:13) [89]

> Игорь Шевченко  (02.04.2008 14:08:11)  [11]

О и ты туда же.
Вообще то парень на ноблевку тянет, а получит шнобелевку..


 
VirEx ©   (2008-04-02 18:13) [90]


>  [87] Johnmen ©   (02.04.08 18:00)
>
> > VirEx ©   (02.04.08 17:51) [86]
> > это аббревиатура
>
> А аббревиатура - это трансглюкавые мымрики?

Да, потомучто ОБХСС, КГБ, ГИБДД и тому подобные мымрики могут нарушать абсолютно любые правила русского словообразования, потому как это не слова (еще раз повторяюсь)


 
Anatoly Podgoretsky ©   (2008-04-02 18:13) [91]

> kiberg  (02.04.2008 14:15:12)  [12]

Тебе пример с хлебом привели, не понятно?


 
Anatoly Podgoretsky ©   (2008-04-02 19:28) [92]

> kiberg  (02.04.2008 14:49:40)  [40]

Тебе привести хрестоматийный пример с Екатериной 2, она в слове из трех букв, сделала четыре ошибки, и не одной правильной буквы их оригинала не было, пример с хлебом мелкие брызги, более вероятный, чем у нее.


 
Anatoly Podgoretsky ©   (2008-04-02 19:28) [93]

> Johnmen  (02.04.2008 15:00:46)  [46]

Это горы, одна лишняя буква, и две замененыF0иной 2, она в слове из трех букв, сделала четыре ошибки, и не одной правильной буквы их оригинала не было, пример с хлебом мелкие брызги, более вероятный, чем у нее.


 
Johnmen ©   (2008-04-02 22:59) [94]


> VirEx ©   (02.04.08 18:13) [90]
> Да, потомучто ОБХСС, КГБ, ГИБДД
> и тому подобные мымрики могут нарушать абсолютно любые правила
> русского словообразования, потому как это не слова (еще
> раз повторяюсь)

Это чё за логика такая интересная - "это не слова, потому что могут нарушать абсолютно любые правила русского словообразования"?
Правила спряжения не нарушают, к примеру.
Так что же это? Если не слова и не мымрики?


 
VirEx ©   (2008-04-03 17:30) [95]


>  [94] Johnmen ©   (02.04.08 22:59)
> Так что же это? Если не слова и не мымрики?

Это и есть мымрики. Если я увижу в словаре ГОУ ДОСН СДЮШОР, тогда это будет словами, а сокращение это и есть сокращение, аббревиатура - ничем кроме аббревиатуры не является.

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

заглянем в вики:
Слово — центральная единица языка. Это основная номинативная и когнитивная единица языка, служащая для именования и сообщения о предметах, признаках, процессах и отношениях.

Пиво - единица языка, потомучто в русском языке оно означает предмет (жидкий мутный противный напиток).
ПВЗ - это солянка из единиц языка, в русском языке такого нет. Смысл этой аббревиатуры характеризует одно из слов в его "составе". Притом ПВЗ можно расшифровать как угодно, хоть ПеньковоВаленковый Завод.

> Правила спряжения не нарушают, к примеру.
Так ведь перед тем как утвердить аббревиатуру, немного мозгами шевелят, чтобы благозвучней было.
Что-то такой аббревиатуры я не видел: ЪХЙЬ


 
Игорь Шевченко ©   (2008-04-03 17:43) [96]


> Пиво - единица языка, потомучто в русском языке оно означает
> предмет (жидкий мутный противный напиток).


Сам ты противный


 
Johnmen ©   (2008-04-03 17:50) [97]


> VirEx ©   (03.04.08 17:30) [95]

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

ЗЫ
Википедию читаешь - это хорошо. Посмотри на досуге определение аббревиатуры.


 
VirEx ©   (2008-04-03 18:13) [98]


>  [97] Johnmen ©   (03.04.08 17:50)
>
> > VirEx ©   (03.04.08 17:30) [95]
>
> Ну с логикой ты не очень дружишь. Русский язык не очень
> знаешь. Пиво не любишь. Это мы увидели, спасибо.
> Но зачем постить здесь продукты жизнедеятельности личных
> мозговых извилин?
>
> ЗЫ
> Википедию читаешь - это хорошо. Посмотри на досуге определение
> аббревиатуры.

Логика:
Слово это слово, т.е. единица языка, значение название или определение чего-либо.
Набор букв из слов - это набор букв из слов. Не более. Как бы аббревиатура не "уважала" правила словообразования, она не станет словом, пока не войдет в язык в виде одного понятия, после чего начнет считаться словом.
Пример: эсэсовец - это слово, т.к. означает человека имеющего принадлежность к вооруженному формированию СС. А "СС" это аббревиатура, и означать она может что угодно:
СС (нем. Schutzstaffel, охранные отряды) — вооружённые формирования нацистов в 1923—1945 годах.
СС — система счисления
СС — название электровоза (Сурамский Советский)
СС - Советский Союз в сокращении КПСС
CC — сокращённое название организации и лицензий Creative Commons

Про вики:
Википедия и является "свободно редактируемым" сервисом, потомучто ошибкам предрасположен любой вбивающий туда текст.

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


 
uniken1 ©   (2008-04-03 18:16) [99]


> Как можно оптимизировать алгоритм?

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


 
VirEx ©   (2008-04-03 18:37) [100]


> [96] Игорь Шевченко ©   (03.04.08 17:43)
>
> > Пиво - единица языка, потомучто в русском языке оно означает
>
> > предмет (жидкий мутный противный напиток).
>
>
> Сам ты противный

Пиво вобще немецкое изобретение (я так думаю).
Наш выбор: квас и медовуха.


 
uniken1 ©   (2008-04-03 19:31) [101]


> Пиво вобще немецкое изобретение (я так думаю).

http://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D0%B2%D0%BE
исторически немцы к происхождению пива не имеют отношения


 
Игорь Шевченко ©   (2008-04-03 19:36) [102]


> Пиво вобще немецкое изобретение (я так думаю).
> Наш выбор: квас и медовуха.


И шовинист к тому же


 
VirEx ©   (2008-04-03 21:01) [103]


>  [101] uniken1 ©   (03.04.08 19:31)
>
> > Пиво вобще немецкое изобретение (я так думаю).
>
> http://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D0%B2%D0%BE
> исторически немцы к происхождению пива не имеют отношения

Там же:
Однако некоторые римские историки в начале нашей эры упоминали, что кельтские, германские и другие племена пили пиво.


 
uniken1 ©   (2008-04-03 21:47) [104]

Исходное

> Пиво вобще немецкое изобретение



> Однако некоторые римские историки в начале нашей эры упоминали,
>  что кельтские, германские и другие племена пили пиво.

Теперь еще раз пречитай и сравни время германия 2-7 в.н.э и Египет 5-4 в. ДО.Н.Э.
С таким подходом, я только что изобрел Электиричество, я настолько суров...


 
VirEx ©   (2008-04-03 22:12) [105]


> [104] uniken1 ©   (03.04.08 21:47)
> Исходное
>
> > Пиво вобще немецкое изобретение
>
>
>
> > Однако некоторые римские историки в начале нашей эры упоминали,
> >  что кельтские, германские и другие племена пили пиво.
>
> Теперь еще раз пречитай и сравни время германия 2-7 в.н.э
> и Египет 5-4 в. ДО.Н.Э.
> С таким подходом, я только что изобрел Электиричество, я
> настолько суров...

"И вновь лампочка Ильича осветила его мрачную хижину".
Будь по твоему. Ты мое мнение изменил.



Страницы: 1 2 3 вся ветка

Форум: "Прочее";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.76 MB
Время: 0.052 c
15-1207480308
Real
2008-04-06 15:11
2008.05.18
Может ли Apache отдавать файл с другим именем?


2-1208530727
che
2008-04-18 18:58
2008.05.18
Вопрос жизни и смерти


15-1207309630
Zvr@b
2008-04-04 15:47
2008.05.18
Правила составления ТЗ для программистов


15-1206998230
Германн
2008-04-01 01:17
2008.05.18
Кстати. Поздравляю всех, кто читает мой пост!


15-1207627805
Slider007
2008-04-08 08:10
2008.05.18
С днем рождения ! 8 апреля 2008 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский