2016-03-22 3 views
1

Я пытаюсь написать функцию для вычисления вероятности того, что две строки означают одно и то же. Для этого я конвертирую в нижний регистр и удаляя специальные символы из строк, прежде чем сравнивать их. В настоящее время я удаление строки «.com» и „“ с помощью String.replace(substring, '') и специальных символов с помощью String.replace(regex, '')Эффективно удалять общие шаблоны из строки

str = str.toLowerCase() 
     .replace('.com', '') 
     .replace('the', '') 
     .replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ''); 

Есть ли более регулярное выражение, которое я могу использовать, чтобы удалить общие закономерности, как «.com» и « ', а также специальные символы? Или каким-то другим способом сделать это более эффективным?

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

Примеры:

Рыба & Чипсы? => Рыба чипсы

= stackoverflow.com> StackOverflow

Властелин Колец => Властелин колец

+0

Вы можете поделиться несколькими примерами? – gurvinder372

+0

Почему бы не сохранить ваши общие/бессмысленные шаблоны в массиве, а затем преобразовать их в шаблон регулярного выражения набора символов, прежде чем выполнять замену, чтобы вы могли просто заменить соответствия этому шаблону пробелами? –

+0

Вы можете использовать регулярное выражение с OR между строками. – Itamar

ответ

3

Вы можете подключить заменить вызовы к одному один с rexexp, как это:

str = str.toLowerCase().replace(/\.com|the|[&\/\\#,+()$~%.'":*?<>{}]/g, ''); 

Различные строки для удаления находятся в круглых скобках() и разделены трубами |

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

Если вы храните слова, чтобы удалить в массиве, вы можете создать регулярное выражение с помощью RegExp конструктора, например:

var words = ["\\.com", "the"]; 
var rex = new RegExp(words.join("|") + "|[&\\/\\\\#,+()$~%.'\":*?<>{}]", "g"); 

Затем повторно использовать рекс для каждой строки:

str = str.toLowerCase().replace(rex, ""); 

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

+0

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

+0

@ T.J.Crowder Это была моя мысль; нет необходимости включать все наборы символов в вызов метода фактической замены. –

+0

@ t-j-crowder, вы правы. Отредактировано группа захвата. –

0

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

Я думаю, что лучше всего было бы использовать другое сравнение методов и другую структуру данных, чем строку. Очень простой пример состоит в том, чтобы сконденсировать ваши строки с наборами set('string'), а затем сравнить установленное сходство/разницу. Другим методом может быть создание Directed Acyclic Graph или подстроки Trei. Главное, что, вероятно, нормально уменьшить информацию из исходной строки и сохранить/сравнить это - однако не стоит недооценивать значение сохранения исходной строки, так как это поможет вам спуститься по дороге, если вы хотите изменить способ вы сравниваете. Наконец, если ваши строки действительно действительно очень длинные, вы можете использовать хеш-перцепцию, которая похожа на хеш-файл MD5, за исключением похожих строк, имеющих похожие хэши.Тем не менее, вам, скорее всего, придется сворачивать свои собственные для коротких строк и определять, что вы считаете важными данными, и что лишнее.

+0

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

Смежные вопросы