Подсчет количества слов в RSS-канале

Почти все блоги можно читать напрямую или с помощью RSS-каналов. RSS-канал – это простой XML-документ, содержащий информацию о блоге и всех записях в нем. Первый шаг процедуры получения счетчиков слов – проанализировать эти каналы. На наше счастье, существует библиотека Universal Feed Parser, которая прекрасно справляется с этой задачей. Ее можно скачать с сайта http://www.feedparser.org.

Этот модуль позволяет легко получить заголовок, ссылки и записи из любого канала в формате RSS или Atom. Следующий шаг – написать функцию, которая будет извлекать отдельные слова. Создайте новый файл generatefeedvector.py и включите в него такой код:

import feedparser import re

# Возвращает заголовок и словарь слов со счетчиками для RSS-канала def getwordcounts(url):

#    Проанализировать канал 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

В каналах формата RSS и Atom всегда имеется заголовок и список записей. В каждой записи обычно есть тег summary или description, внутри которого находится собственно текст записи. Функция getwordcounts передает содержимое этого тега функции getwords, которая отфильтровывает HTML-разметку и выделяет слова, считая словом последовательность символов, ограниченную с двух сторон небуквенными символами. На выходе получается список слов. Добавьте функцию getwords в файл generatefeedvector.py: def getwords(html):

#       Удалить все HTML-теги txt=re.compile(r'<[^>]+>’).sub(”,html)

#       Выделить слова, ограниченные небуквенными символами words=re.compile(r'[^A-Z^a-z]+’).split(txt)

#       Преобразовать в нижний регистр

return [word.lower( ) for word in words if word!=”]

Теперь нам нужен список каналов, с которыми можно работать. Если хотите, можете составить список URL каналов самостоятельно, а можете взять готовый список, содержащий 100 URL. В этот список были включены каналы самых цитируемых блогов, а затем удалены те, что не содержали полный текст записи или содержали в основном изображения. Скачать список можно со страницы http://kiwitobes.com/clusters/ feedlist.txt.

Это обычный текст, содержащий по одному URL в каждой строке. Если у вас есть свой блог или какие-нибудь особо любимые и вы хотите узнать, как они соотносятся с наиболее популярными блогами в Сети, можете добавить URL в файл.

Код для обхода каналов и генерирования набора данных – это главный код в файле generatefeedvector.py (то есть он не является функцией). Сначала мы в цикле перебираем все строки файла feedlist.txt и генерируем счетчики слов в каждом блоге, а также количество блогов, в которых встречается каждое слово (apcount). Добавьте следующий код в конец файла generatefeedvector.py: apcount={} wordcounts={}

for feedurl in file(‘feedlist.txt’): title,wc=getwordcounts(feedurl) wordcounts[title]=wc for word,count in wc.items( ): apcount.setdefault(word,0) if count>1:

apcount[word]+=1

Далее генерируется список слов, которые учтены в счетчиках для каждого блога. Поскольку слова типа the встречаются практически в каждом блоге, а такие слова, как flim-flam – разве что в одном, то можно уменьшить общее количество слов, оставляя только те, для которых

процент вхождений лежит между нижним и верхним порогом. Например, для начала можно в качестве нижнего порога выбрать 10%, а в качестве верхнего – 50%, а потом варьировать их, если выяснится, что количество общих слов или странных словообразований слишком велико.

wordlist=[]

for w,bc in apcount.items( ): frac=float(bc)/len(feedlist) if frac>0.1 and frac<0.5: wordlist.append(w)

Последний шаг состоит в том, чтобы на основе списка слов и списка блогов создать текстовый файл, содержащий большую матрицу счетчиков слов для каждого блога:

out=file(‘blogdata.txt’,’w’) out.write(‘Blog’)

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’)

Для генерирования файла со счетчиками слов запустите программу generatefeedvector.py из командной строки:

c:\code\blogcluster>python generatefeedvector.py На загрузку всех каналов может уйти несколько минут, но в конечном итоге вы получите файл blogdata.txt. Откройте его и убедитесь, что он содержит таблицу, в которой столбцы соответствуют словам, а строки – блогам, причем элементы разделены табуляторами.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

2 коммент. »

 
  • Ферзеску says:

    а что за переменная ‘feedlist’? Компилятор на неё выдаёт ошибку, говоря, что она не описана

  • Toma says:

    это строковая переменная включающая содержимое файла “feedlist.txt”

 

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100