Найти - Пользователи
Полная версия: Лог-файл чата
Начало » Python для новичков » Лог-файл чата
1
BIM
Вот тут http://habrahabr.ru/post/30232/ задачка
“Есть лог-файл какого-то чата. Посчитать «разговорчивость» пользователей в нем в виде ник — количество фраз. Посчитать среднее число букв на участника чата.”

Первое что пришло в голову, это взять сохраненную переписку вконтакте. Но возникли вопросы. Как при анализе лог-файла разделить сообщения отдельных участников?
ajib6ept
Пример лог-чата надо, так сложно угадать.
BIM
ajib6ept
Пример лог-чата надо, так сложно угадать.

ну в том для меня и проблема, что примера нет. Если Вас не затруднит, не могли бы Вы показать какой-нибудь пример?

В вк например можно сохранить переписку в таком виде
py.user.next
BIM
ну в том для меня и проблема, что примера нет.

yandex. лог чата
ajib6ept
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()

Правда как-то сложно получилось
den4ik
# 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))
py.user.next
BIM
в виде ник — количество фраз. Посчитать среднее число букв на участника чата.

Для чата от den4ik.

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)}
>>>
den4ik
Не спится мне, решил подчистить предыдущий вариант.
# 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))
kelseyradley
Так сложно догадаться, что нужен пример лог-чата.
tunnel rush
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB