Форум сайта python.su
Вот тут http://habrahabr.ru/post/30232/ задачка
“Есть лог-файл какого-то чата. Посчитать «разговорчивость» пользователей в нем в виде ник — количество фраз. Посчитать среднее число букв на участника чата.”
Первое что пришло в голову, это взять сохраненную переписку вконтакте. Но возникли вопросы. Как при анализе лог-файла разделить сообщения отдельных участников?
Офлайн
Пример лог-чата надо, так сложно угадать.
Офлайн
ajib6ept
Пример лог-чата надо, так сложно угадать.
Прикреплённый файлы:
111.txt (366 байт)
Офлайн
BIM
ну в том для меня и проблема, что примера нет.
Отредактировано py.user.next (Авг. 16, 2014 21:49:48)
Онлайн
log = ‘'’
Вася Пупкин (22:44:04 03/12/2011):
сообщение
Петя Сидоров (22:44:36 03/12/2011):
еще сообщение
Ололоев (22:50:36 03/12/2011):
первая строка сообщения
вторая строка сообщения
Петя Сидоров (22:54:36 03/12/2011):
еще сообщение
‘'’
# coding: utf-8 import re def main(): log = ''' Вася Пупкин (22:44:04 03/12/2011): сообщение Петя Сидоров (22:44:36 03/12/2011): еще сообщение Ололоев (22:50:36 03/12/2011): первая строка сообщения вторая строка сообщения Петя Сидоров (22:54:36 03/12/2011): еще сообщение ''' out = {} member = set([re.sub('\((.*?)\):', '', m) for m in log.split('\n') if '(' in m]) log = [l.strip() for l in log.split('\n\n')] for l in log: for m in member: if m in l: if out.get(m) is None: out[m] = l.split('\n')[1:] else: out[m].extend(l.split('\n')[1:]) if __name__ == '__main__': main()
Отредактировано ajib6ept (Авг. 16, 2014 22:30:39)
Офлайн
# coding: utf-8 import re import timeit def main(): log = ''' [16:16:16] <DKф555> ты веришь? [16:16:18] <DKф555> я нет [16:22:02] <Yaga> всем привет [16:22:27] <DKф555> Yaga: привет привет [16:23:08] <Yaga> DKф555: аг ага [16:28:42] <Nickel> как тут настрой боевой? [16:29:04] <Yaga> Nickel: а то! [16:31:50] <Nickel> ))) [16:36:36] <Yaga> Nickel: :чифир: [16:48:26] <DKф555> забанить и все тут [16:57:21] <Nickel> меня тока ненадо [16:57:25] <Nickel> ок? [16:59:46] <Nickel> а то я все маме расскажу [17:06:42] <DKф555> коньяк гони тоды не трону [17:08:29] <Nickel> блин у меня уже вторй процесс пошол и доспевает еще 4 дня) [18:48:27] <Nickel> кто тут баралей? [18:57:47] <Nickel> ,fhбармалей имел ввиду [19:42:36] <Nickel> так и не появился бармалей? [19:42:39] <Nickel> ) [19:45:09] <Nickel> всем пока! Труд кормит, лень портит. [19:45:59] <ртс> счастливо, с приятным аппетитом... ''' stats = {} raw_messg_pattern = '.*<{0}>(.*)' nic_r = re.compile('\<[^\>]+\>', re.MULTILINE | re.IGNORECASE) all_nicks = [x[1:-1] for x in nic_r.findall(log)] users = set(all_nicks) for user in users: chars_count = 0 words_count = 0 for mssg in re.finditer(raw_messg_pattern.format(user), log): chars_count += len(mssg.group(1)) words_count += len(mssg.group(1).split()) stats[user] = { 'messages_count': all_nicks.count(user), 'chars': chars_count, 'words': words_count } return stats if __name__ == '__main__': print(timeit.timeit("main()", setup="from __main__ import main", number=100))
Офлайн
BIM
в виде ник — количество фраз. Посчитать среднее число букв на участника чата.
import re import itertools text = ''' [16:16:16] <DKф555> ты веришь? [16:16:18] <DKф555> я нет [16:22:02] <Yaga> всем привет [16:22:27] <DKф555> Yaga: привет привет [16:23:08] <Yaga> DKф555: аг ага [16:28:42] <Nickel> как тут настрой боевой? [16:29:04] <Yaga> Nickel: а то! [16:31:50] <Nickel> ))) [16:36:36] <Yaga> Nickel: :чифир: [16:48:26] <DKф555> забанить и все тут [16:57:21] <Nickel> меня тока ненадо [16:57:25] <Nickel> ок? [16:59:46] <Nickel> а то я все маме расскажу [17:06:42] <DKф555> коньяк гони тоды не трону [17:08:29] <Nickel> блин у меня уже вторй процесс пошол и доспевает еще 4 дня) [18:48:27] <Nickel> кто тут баралей? [18:57:47] <Nickel> ,fhбармалей имел ввиду [19:42:36] <Nickel> так и не появился бармалей? [19:42:39] <Nickel> ) [19:45:09] <Nickel> всем пока! Труд кормит, лень портит. [19:45:59] <ртс> счастливо, с приятным аппетитом... ''' pat = r'\[\d{2}:\d{2}:\d{2}\] <([^>]+)> (.*)' lst = re.findall(pat, text) #lst d = {} grp = itertools.groupby(sorted(lst), lambda i: i[0]) for name, gen in grp: msgs = tuple(i[1] for i in gen) n = len(msgs) a = len(''.join(msgs)) / n d[name] = n, a d
>>> d {'Yaga': (4, 13.25), 'Nickel': (11, 20.818181818181817), 'DKф555': (5, 15.4), 'ртс': (1, 34.0)} >>>
Отредактировано py.user.next (Авг. 21, 2014 03:55:11)
Онлайн
Не спится мне, решил подчистить предыдущий вариант.
# coding: utf-8 import re import timeit log = ''' [16:16:16] <DKф555> ты веришь? [16:16:18] <DKф555> я нет [16:22:02] <Yaga> всем привет [16:22:27] <DKф555> Yaga: привет привет [16:23:08] <Yaga> DKф555: аг ага [16:28:42] <Nickel> как тут настрой боевой? [16:29:04] <Yaga> Nickel: а то! [16:31:50] <Nickel> ))) [16:36:36] <Yaga> Nickel: :чифир: [16:48:26] <DKф555> забанить и все тут [16:57:21] <Nickel> меня тока ненадо [16:57:25] <Nickel> ок? [16:59:46] <Nickel> а то я все маме расскажу [17:06:42] <DKф555> коньяк гони тоды не трону [17:08:29] <Nickel> блин у меня уже вторй процесс пошол и доспевает еще 4 дня) [18:48:27] <Nickel> кто тут баралей? [18:57:47] <Nickel> ,fhбармалей имел ввиду [19:42:36] <Nickel> так и не появился бармалей? [19:42:39] <Nickel> ) [19:45:09] <Nickel> всем пока! Труд кормит, лень портит. [19:45:59] <ртс> счастливо, с приятным аппетитом... ''' def main(log): stats = {} msg_pattern = '(<.*>)(.*)' for msg in re.finditer(msg_pattern, log): user = msg.group(1)[1:-1] msg_body = msg.group(2) chars_count = len(msg_body) words_count = len(msg_body.split()) user_present = user in stats stats[user] = { 'messages': stats[user]['messages'] + 1 if user_present else 1, 'chars': stats[user]['chars']+chars_count if user_present else chars_count, 'words': stats[user]['words']+words_count if user_present else words_count, 'words_per_msg': stats[user]['words']/stats[user]['messages'] if user_present else 0, 'chars_per_msg': stats[user]['chars']/stats[user]['messages'] if user_present else 0, } return stats if __name__ == '__main__': print(timeit.timeit("main(log)", setup="from __main__ import main,log", number=10000)) print(main(log))
Офлайн
Так сложно догадаться, что нужен пример лог-чата.
tunnel rush
Отредактировано kelseyradley (Авг. 29, 2023 06:13:55)
Офлайн