программа была написана так, что все то, что не является буквой заменялась на пробел и искались слова разделеные пробелами
Единица на основании того, что, данная в (А) и присутствующая в (В) не найдена: как так, если выходит на основании того(два пробела)что и то же самое в (В)? Но единица на сновании находится. Что у нас граница слова, почему первое не найдено, второе найдено?
Ок.
Цитата (MCH)
В данном случае сложно понять, что является границей слов
Это трудно, если вы хотите определить эту границу каким-либо конкретным знаком. При таком подходе это ВООБЩЕ НЕВОЗМОЖНО. Посмотрите на текст на любом существующем языке, и сможете ли вы сказать, какой конкретно знак является границей слова. Нет. Почему? Потому что границы слова как таковой не существует. В основном это пробелы (перед словом или после). Это любые знаки препинания (после). Это абзацы (перед или после). Все это - границы слова. Можно также сказать, что одна граница - первая буква слова, а другая - последняя буква (лингвистически, но логически: после чего? перед чем? откуда считать?). Еще мы знаем, что такое слово. Это непрерывный определенный набор букв или дефисов. Как только в эту последовательность вклинивается любой знак (даже буква), то это уже другое слово или два разных слова. Обратите внимание на слова "определенный" набор (это значит, что машина никогда не определит слово, пока мы ей не определим этот набор, напр. функция проверки правописания), на кол-во разных знаков, которые могут быть границей слова, на разницу "логически/лингвистически" и т.д. Граница слова - это все что угодно, кроме самого слова как оно есть (при этом буквы или дефисы меняют слова, т.к. они "части", а знаки разделяют, т.к. они знаки). Поэтому, вы нереально сложную задачу хотите решить, пытаясь выразить границу одним конкретным знаком и искать что-то в пределах этих эфемерных границ. Заменить все, что не является буквой, на пробел и сделать его границей. Резонно. Но у меня изначально в первом примере исходные данные содержат отдельные слова плюс слова, разделенные пробелами, и запятые (в начале сообщения пример - результат такой замены).
Цитата (MCH)
либо не заморачиватся, и искать все вхождения буквосочетаний, даже если они не образуют отдельные слова
Почти так. У нас разные по структуре данные. Поэтому, на первом этапе нам нахрен не нужны никакие границы. Мы берем то, что есть. Это - основа. Ищем это.
Цитата (MCH)
но тогда получим: в силу обстоятельств
Все правильно, как же обойтись без границ?;) Их может быть масса. Пусть будут. У нас есть основа - исходные данные. Мы их нашли, не заморачиваясь. После них могут быть любые знаки, это ничего не меняет. Но если они слитны с буквами, дефисами или цифрами, то это уже не то. Поэтому отсеиваем их: если после них буква, дефис (т.е. то, что является ЧАСТЯМИ СЛОВА, и оно принципиально ИЛИ входит в эту определенную последовательность, ИЛИ НЕ входит в нее; с цифрами делайте как хотите, но лучше прописать в условие и их) - это граница 2; если перед ними буква или дефис - это граница 1. Буквы у нас - все обычные привычные а-я, a-z и непривычные шесть штук с диакритиками. Все. Так мы найдем исходное в любой позиции, мы никогда не найдем лишнего, и у нас не будет никаких вхождений буквосочетаний. И по сути, вот вам и "границы" слова, которые вы искали. МСН, жду комментариев. Как вы думаете, все ли правильно я тут прикинул?
Цитата (MCH)
программа была написана так, что все то, что не является буквой заменялась на пробел и искались слова разделеные пробелами
Единица на основании того, что, данная в (А) и присутствующая в (В) не найдена: как так, если выходит на основании того(два пробела)что и то же самое в (В)? Но единица на сновании находится. Что у нас граница слова, почему первое не найдено, второе найдено?
Ок.
Цитата (MCH)
В данном случае сложно понять, что является границей слов
Это трудно, если вы хотите определить эту границу каким-либо конкретным знаком. При таком подходе это ВООБЩЕ НЕВОЗМОЖНО. Посмотрите на текст на любом существующем языке, и сможете ли вы сказать, какой конкретно знак является границей слова. Нет. Почему? Потому что границы слова как таковой не существует. В основном это пробелы (перед словом или после). Это любые знаки препинания (после). Это абзацы (перед или после). Все это - границы слова. Можно также сказать, что одна граница - первая буква слова, а другая - последняя буква (лингвистически, но логически: после чего? перед чем? откуда считать?). Еще мы знаем, что такое слово. Это непрерывный определенный набор букв или дефисов. Как только в эту последовательность вклинивается любой знак (даже буква), то это уже другое слово или два разных слова. Обратите внимание на слова "определенный" набор (это значит, что машина никогда не определит слово, пока мы ей не определим этот набор, напр. функция проверки правописания), на кол-во разных знаков, которые могут быть границей слова, на разницу "логически/лингвистически" и т.д. Граница слова - это все что угодно, кроме самого слова как оно есть (при этом буквы или дефисы меняют слова, т.к. они "части", а знаки разделяют, т.к. они знаки). Поэтому, вы нереально сложную задачу хотите решить, пытаясь выразить границу одним конкретным знаком и искать что-то в пределах этих эфемерных границ. Заменить все, что не является буквой, на пробел и сделать его границей. Резонно. Но у меня изначально в первом примере исходные данные содержат отдельные слова плюс слова, разделенные пробелами, и запятые (в начале сообщения пример - результат такой замены).
Цитата (MCH)
либо не заморачиватся, и искать все вхождения буквосочетаний, даже если они не образуют отдельные слова
Почти так. У нас разные по структуре данные. Поэтому, на первом этапе нам нахрен не нужны никакие границы. Мы берем то, что есть. Это - основа. Ищем это.
Цитата (MCH)
но тогда получим: в силу обстоятельств
Все правильно, как же обойтись без границ?;) Их может быть масса. Пусть будут. У нас есть основа - исходные данные. Мы их нашли, не заморачиваясь. После них могут быть любые знаки, это ничего не меняет. Но если они слитны с буквами, дефисами или цифрами, то это уже не то. Поэтому отсеиваем их: если после них буква, дефис (т.е. то, что является ЧАСТЯМИ СЛОВА, и оно принципиально ИЛИ входит в эту определенную последовательность, ИЛИ НЕ входит в нее; с цифрами делайте как хотите, но лучше прописать в условие и их) - это граница 2; если перед ними буква или дефис - это граница 1. Буквы у нас - все обычные привычные а-я, a-z и непривычные шесть штук с диакритиками. Все. Так мы найдем исходное в любой позиции, мы никогда не найдем лишнего, и у нас не будет никаких вхождений буквосочетаний. И по сути, вот вам и "границы" слова, которые вы искали. МСН, жду комментариев. Как вы думаете, все ли правильно я тут прикинул?Yuzhniy
Век живи - век учись.
Сообщение отредактировал Yuzhniy - Пятница, 12.04.2013, 09:07
В данном случае, лучше разобратся с алгоритмом, а затем уже с его реализацией Для этого необходимо понять, а для чего это все вообще нужно, какова конечная цель? Нужно знать, какими могут быть исходные данные и на что обращать внимание?
Цитата (Yuzhniy)
Потому что границы слова как таковой не существует. В основном это пробелы (перед словом или после). Это любые знаки препинания (после). Это абзацы (перед или после). Все это - границы слова.
В том то и дело, что все то что не является буквой - это граница слова, отсюда в условиях отсутствия достаточной информации мной и было предложено соответствующее решение.
Для понимания ситуации вопросы: 1. Если ищем слово "под" а)нужно чтобы выделялось только это слово, отделенное от других пробелами/точками/запятыми/и т.п.? б) или допустимо чтобы выделялись части слов "поднос", "антипод", "преподаватель"? Второй вариант реализовать значительно легче
2. Если ещем слово "кто?" аналогичная ситуация с п. 1а выделяем или нет в фразе написанной без пробелов "кто?здесь"
В качестве предлогаемого алгоритма могу предложить следующий вариант (реализовывать пока не буду, иначе опять не угадаю): Ищем точное совпадение фраз из столбца А в столбце В, если фраза найдена и символ левее и правее фразы не является буквой то выделяем данную фразу, если исходная фраза начинается/заканчивается небуквой, то на символы левее/правее найденной фразы не обращаем внимание и фразу выделяем
В данном случае, лучше разобратся с алгоритмом, а затем уже с его реализацией Для этого необходимо понять, а для чего это все вообще нужно, какова конечная цель? Нужно знать, какими могут быть исходные данные и на что обращать внимание?
Цитата (Yuzhniy)
Потому что границы слова как таковой не существует. В основном это пробелы (перед словом или после). Это любые знаки препинания (после). Это абзацы (перед или после). Все это - границы слова.
В том то и дело, что все то что не является буквой - это граница слова, отсюда в условиях отсутствия достаточной информации мной и было предложено соответствующее решение.
Для понимания ситуации вопросы: 1. Если ищем слово "под" а)нужно чтобы выделялось только это слово, отделенное от других пробелами/точками/запятыми/и т.п.? б) или допустимо чтобы выделялись части слов "поднос", "антипод", "преподаватель"? Второй вариант реализовать значительно легче
2. Если ещем слово "кто?" аналогичная ситуация с п. 1а выделяем или нет в фразе написанной без пробелов "кто?здесь"
В качестве предлогаемого алгоритма могу предложить следующий вариант (реализовывать пока не буду, иначе опять не угадаю): Ищем точное совпадение фраз из столбца А в столбце В, если фраза найдена и символ левее и правее фразы не является буквой то выделяем данную фразу, если исходная фраза начинается/заканчивается небуквой, то на символы левее/правее найденной фразы не обращаем внимание и фразу выделяемMCH
В п. 1 а). В п. 2 НЕ выделяем. По поводу алгоритма даже не знаю, что сказать. Если реально проверить символы левее и правее фразы, давайте просто проверим их там для любых исходных, и все. По-моему, это лучший вариант, я о нем говорил в пред. сообщ. На первый взгляд, условий даже меньше, чем в алгоритме, и он одновременно разрешает задачу п. 1 и п. 2. Имейте в виду, что я могу "подготовить" данные в определенной мере, если необходимо. Ну напр., если это как-то упростить поиск исходника в начале и в конце ячейки В, где перед и после вообще нет знаков, добавить изначально пробелы в начало и конец (В) и т.д. Может быть есть смысл использовать какой-нибудь подстановочный знак типа *, поискать *исходное*, проверить * по условию или сразу прописать, на что она like или нет. Могу сразу добавить ее в исходник с двух сторон (а в (В) пробелы), вы пропишете для нее условие, и погнали искать. Но это наверное морока даже больше, она будет выделяться в итоге и т.п. Самый лучший вариант, на мой взгляд, найти как есть и проверить левые и правые знаки. Все.
В п. 1 а). В п. 2 НЕ выделяем. По поводу алгоритма даже не знаю, что сказать. Если реально проверить символы левее и правее фразы, давайте просто проверим их там для любых исходных, и все. По-моему, это лучший вариант, я о нем говорил в пред. сообщ. На первый взгляд, условий даже меньше, чем в алгоритме, и он одновременно разрешает задачу п. 1 и п. 2. Имейте в виду, что я могу "подготовить" данные в определенной мере, если необходимо. Ну напр., если это как-то упростить поиск исходника в начале и в конце ячейки В, где перед и после вообще нет знаков, добавить изначально пробелы в начало и конец (В) и т.д. Может быть есть смысл использовать какой-нибудь подстановочный знак типа *, поискать *исходное*, проверить * по условию или сразу прописать, на что она like или нет. Могу сразу добавить ее в исходник с двух сторон (а в (В) пробелы), вы пропишете для нее условие, и погнали искать. Но это наверное морока даже больше, она будет выделяться в итоге и т.п. Самый лучший вариант, на мой взгляд, найти как есть и проверить левые и правые знаки. Все.Yuzhniy
Век живи - век учись.
Сообщение отредактировал Yuzhniy - Пятница, 12.04.2013, 17:57