Для настраиваемого класса вам необходимо реализовать Equatable protocol.
import Foundation
func ==(l: MyClass, r: MyClass) -> Bool {
return l.id == r.id
}
class MyClass: Equtable {
init(id: String) {
self.msgID = id
}
let msgID: String
}
let item = MyClass(3)
let itemList = [MyClass(1), MyClass(2), item]
let idx = itemList.indexOf(item)
printl(idx)
На самом деле то, что делает Google, очень нетривиально и также сначала парадоксально. Они не делают ничего как проверка по сравнению со словарем, а скорее они используют статистику для идентификации "подобных" запросов, которые возвратили больше результатов, чем запрос, точный алгоритм не, конечно, известен.
существуют различные подпроблемы решить здесь как фундаментальное основание для всей статистики Обработки естественного языка, связанной существует у, нужно быть книга: Основа статистической обработки естественного языка .
Конкретно для решения проблемы подобия слова/запроса у меня были хорошие результаты с использованием Расстояние Редактирования , математическая мера строкового подобия, которое работает удивительно хорошо. Я раньше использовал Levenshtein, но другие может стоить изучить.
Soundex - по моему опыту - является дерьмом.
На самом деле эффективно хранение и поиск большого словаря слов с ошибками и наличия sub второе извлечение снова нетривиальны, Ваш лучший выбор состоит в том, чтобы использовать существующее полнотекстовое индексирование и поисковые системы (т.е. не Ваша база данных одна), которых Lucene в настоящее время является одним из лучших и по совпадению портированный ко многим много платформ.
Реализация исправления орфографических ошибок для поисковых систем эффективным способом не тривиальна (Вы не можете только вычислить edit/levenshtein расстояние до каждого возможного слова). Решение на основе индексов k-грамма описано в Введение в Информационный поиск (полный текст, доступный онлайн).
Существует что-то названное aspell, который мог бы помочь: http://blog.evanweaver.com/files/doc/fauna/raspell/classes/Aspell.html
существует рубиновый драгоценный камень для него, но я не знаю, как говорить, это от python http://blog.evanweaver.com/files/doc/fauna/raspell/files/README.html
Вот кавычка от рубиновой реализации
Использование
, Aspell позволяет Вам проверить слова и предложить исправления. Например:
string = "my haert wil go on" string.gsub(/[\w\']+/) do |word| if !speller.check(word) # word is wrong puts "Possible correction for #{word}:" puts speller.suggest(word).first end end
Это производит:
Возможное исправление для основы: сердечное Возможное исправление для wil: Будет
Soundex хорош для фонетических соответствий, но работает лучше всего с именами народов (он был первоначально разработан для данных переписи)
Также Полнотекстовое индексирование выезда, синтаксис отличается от логики Google, но это очень быстро и может иметь дело с подобными элементами языка.
Soundex и "Носильщик, происходящий" (soundex тривиально, не уверен в носильщике, происходящем).
Если у Вас будет промышленность определенные переводы, Вам, вероятно, будет нужен тезаурус. Например, я работал в ювелирной промышленности и было, сокращают в наших описаниях, таких как kt - карат, ул. - вокруг, cwt - вес карата... Endeca (поисковая система в том задании) имеет тезаурус, который переведет из общих орфографических ошибок, но это действительно требует ручного вмешательства.
Я думаю, что это зависит от как большой Ваш веб-сайт это. На нашей локальной Интранет, которая используется приблизительно 500 членами штата, я просто смотрю на поисковые фразы, которые возвратили нулевые результаты, и введите ту поисковую фразу с новой предложенной поисковой фразой в таблицу SQL.
я их обращаюсь к той таблице, если никакие результаты поиска не были возвращены, однако, это только работает, если сайт является относительно небольшим, и я только делаю это для поисковых фраз, которые наиболее распространены.
Вы могли бы также хотеть посмотреть на мой ответ на подобный вопрос:
Я полагаю, что Google регистрирует все запросы и определяет, когда кто-то делает исправление орфографических ошибок. Это исправление может тогда быть предложено, когда другие предоставляют тот же первый запрос. Это будет работать на любой язык, на самом деле любая строка любых символов.
Я предложил бы смотреть SOUNDEX для нахождения подобных слов в базе данных.
можно также получить доступ к Google собственный словарь при помощи Google API, записывающий запрос предложения .
Можно хотеть посмотреть на Peter Norvig" , Как Записать Орфографический корректор " статья.
Доктор Norvig Google обрисовал в общих чертах, как это работает; он даже дает 20ish строка реализация Python:
http://googlesystem.blogspot.com/2007/04/simplified-version-of-googles-spell.html
http://www.norvig.com/spell-correct.html
доктор Norvig также обсуждает, "сделал Вы имеете в виду" в этот превосходный разговор . Доктор Norvig глава исследования в Google - когда спросили, как "сделал Вы имеете в виду", реализован, его ответ authoritive.
Так его проверка правописания, по-видимому, с динамическим словарем создают из других поисков или даже фактических интернет-фраз и такого. Но это все еще проверка правописания .
SOUNDEX и другие предположения не вкладывают взгляд, людей!
Проверьте этот статья о Википедии о расстоянии Левенштейна. Удостоверьтесь, что Вы бросаете хороший взгляд на Возможные улучшения.
Я был приятно удивлен, когда кто-то спросил, как создать самую современную система подсказок правописания для поисковых систем. Я работаю над этой темой более года для компании, занимающейся поисковыми системами, и могу указать на информацию по этой теме в открытом доступе.
Как упоминалось в предыдущем посте, Google (а также Microsoft и Yahoo!) не используют никаких предопределенных словарей и не нанимают орды лингвистов, размышляющих над возможными орфографическими ошибками в запросах. Это было бы невозможно из-за масштабов проблемы, а также из-за того, что неясно, действительно ли люди могут правильно определить, когда и если запрос написан с ошибкой.
Вместо этого существует простой и довольно эффективный принцип, который также применим для всех Европейские языки. Получите все уникальные запросы в журналах поиска, вычислите расстояние редактирования между всеми парами запросов, предполагая, что ссылочный запрос имеет наибольшее количество.
Этот простой алгоритм отлично подходит для многих типов запросов. Если вы хотите перейти на следующий уровень, я предлагаю вам прочитать статью Microsoft Research по этой теме. Вы можете найти его здесь
В статье есть отличное введение, но после этого вам нужно будет разбираться в таких концепциях, как скрытая марковская модель.
Если вы хотите перейти на следующий уровень, я предлагаю вам прочитать статью Microsoft Research по этой теме. Вы можете найти его здесьВ статье есть отличное введение, но после этого вам нужно будет разбираться в таких концепциях, как скрытая марковская модель.
Если вы хотите перейти на следующий уровень, я предлагаю вам прочитать статью Microsoft Research по этой теме. Вы можете найти его здесьВ статье есть отличное введение, но после этого вам нужно будет разбираться в таких концепциях, как скрытая марковская модель.