2011-05-25 4 views
4

У меня есть список названий компаний, и у меня есть список названий компаний, упоминающих URL.Нечеткий сопоставление строки в большом тексте в Python (url)

Конечная цель - заглянуть в URL-адрес и узнать, сколько компаний на URL-адресе в моем списке.

Пример URL: http://www.dmx.com/about/our-clients

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

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

Где этот новичок должен выглядеть?

ответ

5

Это не звучит для меня, как будто вам нужно «нечеткое» совпадение. И я предполагаю, что когда вы говорите «url», вы имеете в виду «веб-страницу по адресу, на который указывает URL-адрес». Просто используйте Python, встроенный поиск подстроки функциональность:

>>> import urllib2 
>>> webpage = urllib2.urlopen('http://www.dmx.com/about/our-clients') 
>>> webpage_text = webpage.read() 
>>> webpage.close() 
>>> for name in ['Caribou Coffee', 'Express', 'Sears']: 
...  if name in webpage_text: 
...   print name, "found!" 
... 
Caribou Coffee found! 
Express found! 
>>> 

Если вы беспокоитесь о струна капитализации несовпадений, просто преобразовать все это в верхний регистр.

>>> webpage_text = webpage_text.upper() 
>>> for name in ['CARIBOU COFFEE', 'EXPRESS', 'SEARS']: 
...  if name in webpage_text: 
...   print name, 'found!' 
... 
CARIBOU COFFEE found! 
EXPRESS found! 
+0

+1 Это, безусловно, подход грубой силы и довольно эффективный. – jathanism

+1

, что имеет смысл, и хорошее начало. Причина, по которой я думал о нечетком сопоставлении, - это примеры «Sears Inc.» vs. «Sears» ... и т. д. – Kyle

+0

@ Kyle, я вижу вашу точку зрения, но пока ваш список имен содержит кратчайшие однозначные префиксы полных имен компаний, это вряд ли будет большой проблемой. Например, если у вас есть «Сирс» в вашем списке, то «Sears, Inc.» также будет сопоставлен. Есть несколько ситуаций, которые могут вызвать ложные негативы; но с нечетким соответствием вы, вероятно, получите ложные срабатывания, поэтому я думаю, это зависит от того, какой из них вы считаете более терпимым. – senderle

3

Я хотел бы добавить к senderle Ответим, что это может иметь смысл, чтобы нормализовать свои имена каким-то образом (например, удалить все специальные символы, а затем применить его к webpage_text и список строк.

def normalize_str(some_str): 
    some_str = some_str.lower() 
    for c in """-?'"/{}[]()&!,.`""": 
     some_str = some_str.replace(c,"") 
    return some_str 

Если это не достаточно хорошо, вы можете пойти в difflib и сделать что-то вроде:

for client in normalized_client_names: 
    closest_client = difflib.get_closest_match(client_name, webpage_text,1,0.8) 
    if len(closest_client) > 0: 
     print client_name, "found as", closest_client[0] 

произвольное обрезание я выбрал (Ratcliff/Obershelp) отношение 0,8 может быть слишком мягок, о жесткий; играйте с ним немного.

+0

+1 для нормализации - я думал об этом, но мне пришлось уйти. – senderle