2017-02-11 11 views
0

Предположим, у меня есть питон dataframe следующим образом,Найдите подобные тексты по питона dataframe

data['text'] 

abc.google.com 
d-2667808233512566908.ampproject.net 
d-27973032622323999654.ampproject.net 
def.google.com 
d-28678547673442325000.ampproject.net 
i1-j4-20-1-1-13960-2081004232-s.init.cedexis-radar.net 
d-29763453703185417167.ampproject.net 
poi.google.com 
d-3064948553577027059.ampproject.net 
i1-io-0-4-1-20431-1341659986-s.init.cedexis-radar.net 
d-2914631797784843280.ampproject.net 
i1-j1-18-24-1-11326-1053733564-s.init.cedexis-radar.net 

Я хочу найти подобное общие тексты и группа его. например, abc.google.com, def.google.com, poi.google.com будет указывать на google.com и т.д.

Требуемый выход,

google.com 
ampproject.net 
ampproject.net 
google.com 
ampproject.net 
s.init.cedexis-radar.net 
ampproject.net 
google.com 
ampproject.net 
s.init.cedexis-radar.net 
ampproject.net 
s.init.cedexis-radar.net 

Это больше похоже на данных когда я могу очистить нежелательные части. Один из способов - вручную проверить и кодировать каждую возможную группу. Но у меня будут миллионы текстов. Итак, есть ли способ/пакет в python для этого?

Извините, что попросил об этом, не пробовав ничего. Я пытался исследовать это без особого успеха. Не знаю, как мне начать. Если кто-нибудь может сообщить мне подход, который нужно принять, это было бы полезно для меня.

Благодаря

ответ

1

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

Другой подход пытается сопоставить общие шаблоны. Например, во многих текстовых сегментах есть google.com. Вы можете использовать эту информацию во время предварительной обработки.

Пример

lines = ['abc.google.com', 
     'd-2667808233512566908.ampproject.net', 
     'd-27973032622323999654.ampproject.net', 
     'def.google.com', 
     'd-28678547673442325000.ampproject.net', 
     'i1-j4-20-1-1-13960-2081004232-s.init.cedexis-radar.net', 
     'd-29763453703185417167.ampproject.net', 
     'poi.google.com', 
     'd-3064948553577027059.ampproject.net', 
     'i1-io-0-4-1-20431-1341659986-s.init.cedexis-radar.net', 
     'd-2914631797784843280.ampproject.net', 
     'i1-j1-18-24-1-11326-1053733564-s.init.cedexis-radar.net'] 


def commonSubstringFinder(string1, string2): 
    common_substring = "" 
    split1 = string1.split('.') 
    split2 = string2.split('.') 
    index1 = len(split1) - 1 
    index2 = len(split2) - 1 
    size = 0 
    while index1 >= 0 & index2 >= 0: 
     if split1[index1] == split2[index2]: 
      if common_substring: 
       common_substring = split1[index1] + '.' + common_substring 
      else: 
       common_substring += split1[index1] 
      size += 1 
     else: 
      ind1 = len(split1[index1]) - 1 
      ind2 = len(split2[index2]) - 1 
      if split1[index1][ind1] == split2[index2][ind2]: 
       common_substring = '.' + common_substring 
      while ind1 >= 0 & ind2 >= 0: 
       if split1[index1][ind1] == split2[index2][ind2] and split1[index1][ind1].isalpha(): 
        if common_substring: 
         common_substring = split1[index1][ind1] + common_substring 
        else: 
         common_substring += split1[index1][ind1] 
       else: 
        break 
       ind1 -= 1 
       ind2 -= 1 

      break 
     index1 -= 1 
     index2 -= 1 

    if size > 1: 
     return common_substring 
    else: 
     return "" 

output = [] 
for line in lines: 
    flag = True 
    for i in range(len(output)): 
     result = commonSubstringFinder(output[i], line) 
     if len(result) > 0: 
      output[i] = result 
      output.append(result) 
      flag = False 
      break 
    if flag: 
     output.append(line) 

for item in output: 
    print(item) 

В этом выходы:

google.com 
ampproject.net 
ampproject.net 
google.com 
ampproject.net 
s.init.cedexis-radar.net 
ampproject.net 
google.com 
ampproject.net 
s.init.cedexis-radar.net 
ampproject.net 
s.init.cedexis-radar.net 
+0

спасибо за эту идею. Не могли бы вы помочь мне в получении результатов, как я спросил? Мне сложно изменить этот код на это требование – Observer

+0

@Observer Я обновил свой код. Если это вам поможет, не забудьте запереть и, если он будет отвечать вашим потребностям, вы также можете принять его как ответ. –

+0

Спасибо большое! Он работал – Observer