![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Есть задача. Дана строка состоящая из разного набора слов. Пример: "метан, чугун, вода, земля, воздух, дерево".
Набор слов может быть любой. Их обычно всегда не более 10. Есть несколько наборов слов: Первый набор слов: вода земля космос ... Второй набор слов: сайт, компьютер интернет pc принтер ... Третий набор слов: девушка парень приятель друг ... Четвертый набор слов(АНТИ-набор): xxx xxx xxx .... Всего имеется 4 набора слов. Каждый из которых состоит в из 10-50 слов. Слова разделены заданным символом между собой. Мне нужно сделать функцию, которая бы получала на входе строку для анализа, типа: "метан, чугун, вода, земля, воздух, дерево", 4 группы ключевых слов и возвращала бы TRUE или FALSE. TRUE возвращается, когда выполняются ВСЕ 4 условия: 1. Хотя бы одно слово из ПЕРВОГО набора слов присутствует в строке для анализа. 2. Хотя бы одно слово из ВТОРОГО набора слов присутствует в строке для анализа. 3. Хотя бы одно слово из ТРЕТЬЕГО набора слов присутствует в строке для анализа. 4. Ни одно из слов ЧЕТВЕРТОГО набора слов НЕ присутствует в строке для анализа. Очень важное дополнение: Если в каком-либо наборе слов вообще нет слов, то мы пропускаем этот набор слов. Таким образом на одно условие становится меньше. Если хотя бы одно из этих условий не выполняется, то возвращается FALSE. Я понимаю, что хорошо бы учитывать морфологию, но это очень сложная задача для некоторых языков, поэтому все слова представлены в ед. числе и в именительном падеже. Так совпало, что Сардар как раз вчера написал програмку, которая делает половину из нужной работы: http://forum.vingrad.ru/index.php?showtopi...ndpost&p=599645 Для хранения набора слов используется там дерево. Но программа предназначена только для одного дерева слов. Sardar, вопрос к тебе |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
ИМXО тебе не дерево нужно, а простая хеш-таблица, т.к. понятия "цепочка" у тебя нет, слово либо входит в множество, либо нет. Четыре хештаблицы, у четвёртой инвертируем результат поиска. Это лаба или где то понадобилось?
-------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Wowa |
|
||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Это в практическом проекте понадобилось. Важна очень скорость обработки этого. Добавлено @ 16:59
как реализуется хеш-таблица на JavaScript? Добавлено @ 17:00 Что подразумеваешь под цепочкой? Ведь у нас в проекте по недопущению тем с заголовками "Помогите" и т.п. - вроде, как задача 1 в 1. |
||||
|
|||||
| Sardar |
|
||||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Это любой обьект, поле которого твой ключь. Таким образом можно очень быстро узнать входит ли значение во множество:
Цепочка обьектов, вноситься понятие позиция, т.е. слово идущее сразу за другим словом. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||
|
|||||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
SardarСпасибо большое! Сейчас буду эксперементировать дальше
|
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Я вставил Алерт, чтобы вывести значение переменной, т.к. почему-то всегда false выдается.
var words=str.split(/\s*,\s*/g); alert(words[0]); но вместо русских букв - вопросы. Кодировку пробовал windows-1251 и utf-8 ставить. Не помогает.[s] |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
WinXP и старшие все на юникоде поставлены, кракозябр быть не должно. Иначе ничего не поделаешь, придёться getElementById('test').innerHTML=words[0];, где у тебя в документе (выше по определению чем <script>) толжен быть элемент с id='test'
Во втором и в третьем списке нет слов из тестовой строки, по условию должно быть (1&2&3&!4) -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Sardar А как можно определить содержатся ли элементы в d1, d2, d3 ?
Я попробовал так, но не работает
Добавлено @ 19:18 Просто return (d1b&&d2b&&d3b&&d4b); означет ведь, что TRUE будет возвращено только когда все значения true. |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
получается, что если
d1, d2 или d3 без элементов, то мне нужно в этой строчке: var d1b=false, d2b=false, d3b=false, d4b=true; давать им не false значение, а true. |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
или кто-нибудь видит еще решение этой проблемы?
P.S. С русским языков разобрался. Просто редактор чето-то не в той кодировке написал. |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
я придумал решение проблемы. Dict.prototype.add просто после добавления элементов делает return (arguments.length);
Остался всего еще один вопрос с кодировкой. Будет ли скрипт корректно работать, если он сохранен в отдельном файле вместе с данными в кодировке utf-8, но он подключается к странице, которая в кодировке windows-1251. ? |
|||
|
||||
| Sardar |
|
||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Метод contains - возвращает true если значение во множестве, map.length даёт количество элементов во множестве, луше описать конечно своим методом.
Да, по логике вещей: пробегая по всем словам смотрим входит ли слово в 1 из первых трёх множеств, если да, то флаг под множеством устанавливаеться в true; флаг под множеством 4 сбрасываеться в false если значение содержиться во множестве 4. Таково было задание в твоём первом посте. Меняя флаги ты нарушаешь логику, тогда я не понял в чём задача была... С кодировкой проблем под JS нет, т.к. все строки в юникоде. Нужно что бы скрипт был сохранён в той же кодировке что и страница, либо задавай тегу script аттрибут charset по моему. Строки бьються под старой виндой, т.к. системное окошко alert не принимало юникод, потому всё уходило в кракозябры. Под IE6.0 проблем не будет. В повседневной жизни alert не юзаем, выводи все мессаги в страницу, alert только для ошибок. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||
|
|||||
| Wowa |
|
||||||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Флаги менять нужно из-за этого:
ясно. Добавлено @ 20:28 Я сделал подобным образом:
Вроде работает |
||||||||
|
|||||||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
В моём коде add ничего не возвращает и == 0 всегда будет возвращать true... -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
я ведь писал выше
|
|||
|
||||
| Zeroglif |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Wowa
Как вариант. Массив d содержит все словари, первым элементом массива идёт словарь запрещённых слов. Остальное вроде понятно.
|
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Zeroglif Спасибо. А как ты думаешь, какой вариант быстрее?
|
|||
|
||||
| Ciber SLasH |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1813 Регистрация: 9.11.2004 Где: С.-Петербург Репутация: 24 Всего: 67 |
А не надо думать, надо проверять: http://forum.vingrad.ru/index.php?act=modu...el&article=1270 |
|||
|
||||
| Zeroglif |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Wowa
На глаз не скажу. Насколько я понял у тебя объёмы не сильно большие, надеюсь, должно быть быстро. Во всяком случае join() работает очень быстро, indexOf() тоже. Ну, можно ещё array.length в переменную вытащить, потому как IE это любит, функции объединить, передавать исходный текст уже массивом... Вопрос к уважаемым властям - нельзя ли в подсветке кода (Javascript) изменить цвет для string в одинарных кавычках, дабы числа не сливались?
|
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |