Кластериризация данных и Unicode в Python
И снова книга Тоби Сегарана "Программируем
коллективный разум"... Ну нравится она мне :)
Возникло желание разобраться с кластеризацией
данных. Вроде все просто. Скопировал из книги код, вставил и запустил.
И тут начались пляски с бубном. Как "неожиданно оказалось" код (а он написан на Python-е) изначально предполагал работу только с латиницей, а кириллицу автор книги в расчёт не принимал. По некоторым причинам я работаю с Python версии 2.7 а версию 3.* (где использование кириллицы не вызывает проблем ) использовать не могу.
После долгого гугления решение было найдено. Код нормально работает с кириллическими символами., по крайне мере в Python 2.7.
Пытался ещё улучшить результат работы скрипта удалением из текста предлогов и стоп-слов, но увы, это слабо помогло и этот фрагмент кода был удалён.
коллективный разум"... Ну нравится она мне :)
Возникло желание разобраться с кластеризацией
данных. Вроде все просто. Скопировал из книги код, вставил и запустил.
И тут начались пляски с бубном. Как "неожиданно оказалось" код (а он написан на Python-е) изначально предполагал работу только с латиницей, а кириллицу автор книги в расчёт не принимал. По некоторым причинам я работаю с Python версии 2.7 а версию 3.* (где использование кириллицы не вызывает проблем ) использовать не могу.
После долгого гугления решение было найдено. Код нормально работает с кириллическими символами., по крайне мере в Python 2.7.
Пытался ещё улучшить результат работы скрипта удалением из текста предлогов и стоп-слов, но увы, это слабо помогло и этот фрагмент кода был удалён.
# -*- coding: utf-8 -*- import sys import feedparser import re def setup_console(sys_enc="utf-8"): reload(sys) try: # для win32 вызываем системную библиотечную функцию if sys.platform.startswith("win"): import ctypes enc = "cp%d" % ctypes.windll.kernel32.GetOEMCP() #TODO: проверить на win64/python64 else: # для Linux всё, кажется, есть и так enc = (sys.stdout.encoding if sys.stdout.isatty() else sys.stderr.encoding if sys.stderr.isatty() else sys.getfilesystemencoding() or sys_enc) # кодировка для sys sys.setdefaultencoding(sys_enc) # переопределяем стандартные потоки вывода, если они не перенаправлены if sys.stdout.isatty() and sys.stdout.encoding != enc: sys.stdout = codecs.getwriter(enc)(sys.stdout, 'replace') if sys.stderr.isatty() and sys.stderr.encoding != enc: sys.stderr = codecs.getwriter(enc)(sys.stderr, 'replace') except: pass # Ошибка? Всё равно какая - работаем по-старому... # Возвращает заголовок и словарь слов со счетчиками для RSS-канала def getwordcounts(url): # Распарсим RSS канал d=feedparser.parse(url) wc={} # Цикл по всем записям for e in d.entries: if 'summary' in e: summary=e.summary else: summary=e.description # Формируем список слов words=getwords(e.title+' '+summary) for word in words: wc.setdefault(word,0) wc[word]+=1 return d.feed.title,wc def getwords(html): # Удаляем HTML теги, знаки пунктуации, предлоги и подобное txt=re.compile(r'<[^>]+>').sub(' ',html) txt=re.compile(r'\&[a-z]+\;').sub(' ',txt) txt=re.compile(r'[:;,-."\[)(\]!?/\r]+').sub(' ',txt) # Выделить слова, ограниченные небуквенными символами words=re.compile(u'[^А-Я^а-я]+').split(txt) # Преобразовываем все слова в нижний регистр return [word.lower( ).encode('utf-8') for word in words if word!=''] setup_console(sys_enc="utf-8") apcount={} wordcounts={} feedlist=[line for line in file('ru-feedlist.txt')] for feedurl in feedlist: try: title,wc=getwordcounts(feedurl) wordcounts[title]=wc for word,count in wc.items(): apcount.setdefault(word,0) if count>1: apcount[word]+=1 except: print('Failed to parse feed %s' % feedurl) wordlist=[] for w,bc in apcount.items(): frac=float(bc)/len(feedlist) if frac>0.2 and frac<0.5: wordlist.append(w) out=file('blogdata.txt','w') for word in wordlist: out.write('\t%s' % word) out.write('\n') for blog,wc in wordcounts.items(): out.write(blog) for word in wordlist: if word in wc: out.write('\t%d' % wc[word]) else: out.write('\t0') out.write('\n')
Пользуйтесь на здоровье ! Тестировалось в Ubuntu 12.04 Python 2.7
Комментарии
Отправить комментарий