Фильтрация блогов

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

Хотя в записях блога спама может и не быть, но многие блоги содержат как интересующие вас заметки, так и не представляющие никакого интереса. Например, иногда вы хотите читать только материалы из какой-то одной категории или написанные определенным автором, хотя часто ситуация бывает и сложнее. Как и раньше, можно задать правила, описывающие, что именно представляет для вас интерес, а что нет, – например, при чтении блога, посвященного электронным устройствам, вы хотите пропускать все записи, содержащие фразу cell phone (сотовый телефон). Но гораздо проще воспользоваться классификатором, который сам выработает такие правила. Классификация записей в RSS-каналах удобна тем, что можно воспользоваться каким-нибудь инструментом поиска по блогам, например Google Blog Search, и подготовить результаты поиска для подачи на вход программе чтения канала. Многие делают так для отслеживания товаров, других интересных для них вещей и даже собственных имен. Однако при этом вы будете находить заспамленные или бесполезные блоги, создатели которых пытаются сделать деньги на трафике. В примере, описываемом ниже, вы можете взять любой канал, хотя надо иметь в виду, что во многих каналах слишком мало записей для эффективного обучения. Мы остановились на результатах поиска по слову Python, возвращенных Google Blog Search и представленных в формате RSS. Загрузить их можно со страницы http://kiwitobes.com/feeds/ python_search.xml.

Создайте файл feedfilter.py и включите в него такой код:

import feedparser import re

# Принимает URL канала блога и классифицирует записи def read(feed,classifier): # Получить и в цикле перебрать записи f=feedparser.parse(feed) for entry in f[‘entries’]: print

print ‘– ‘

#       Распечатать содержимое записи

print ‘Заголовок: ‘+entry[‘title’].encode(‘utf-8’) print ‘Автор: ‘+entry[‘publisher’].encode(‘utf-8’) print

print entry[‘summary’].encode(‘utf-8’)

#       Объединить весь текст с целью создания одного образца для

#       классификатора

fulltext=’%s\n%s\n%s’ %% (entry[‘title’],entry[‘publisher’ ], entry[‘summary’])

#       Напечатать наилучшую гипотезу о текущей категории print ‘Гипотеза: ‘+str(classifier.classify(fulltext))

#       Попросить пользователя ввести правильную категорию и обучиться

#       на его ответе

cl=raw_input(‘Введите категорию: ‘) classifier.train(fulltext,cl)

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

Построенный классификатор по природе своей весьма общий. Мы воспользовались в качестве примера фильтрацией спама, чтобы объяснить все детали кода, но, в принципе, категории могут быть любыми. Так, в файле python_search.xml можно выделить четыре категории: о языке программирования, о комедийном шоу «Monty Python», о питонах и обо всем остальном. Попробуйте запустить интерактивный фильтр в сеансе интерпретатора, обучить классификатор и передать его программе feedfilter: >>> import feedfilter

>>> cl=docclass.fisherclassifier(docclass.getwords)

>>> cl.setdb(‘python_feed.db’) # Только если реализовали интерфейс с SQLite >>> feedfilter.read(‘python_search.xml’,cl)

Заголовок: My new baby boy!

Автор: Shetan Noir, the zombie belly dancer! – MySpace Blog

This is my new baby, Anthem. He is a 3 and half month old ball <b>python</b>,

orange shaded normal pattern. I have held him about 5 times since I brought

him home tonight at 8:00pm…

Гипотеза: None

Введите категорию: snake

Заголовок: If you need a laugh… Автор: Kate&#39;s space

Even does ‘funny walks’ from Monty <b>Python</b>. He talks about all the ol’

Гипотеза: snake

Введите категорию: monty

Заголовок: And another one checked off the list..New pix comment ppl Автор: And Python Guru – MySpace Blog

Now the one of a kind NERD bred Carplot male is in our possesion. His name is Broken (not because he is sterile) lol But check out the pic and leave one Гипотеза: snake Введите категорию: snake

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

вероятности для указанного признака – как вероятность слова при условии категории, так и вероятность категории при условии слова:

>>> cl.cprob(‘python’,’prog’)

0.33333333333333331 >>> cl.cprob(‘python’,’snake’) 0.33333333333333331 >>> cl.cprob(‘python’,’monty’) 0.33333333333333331 >>> cl.cprob(‘eric’,’monty’) 1.0

>>> cl.fprob(‘eric’,’monty’)

0.25

Вероятности для слова python распределены равномерно, поскольку оно встречается в каждой записи. Слово Eric встречается в 25% записей, относящихся к шоу «Monty Python», и ни разу не встречается в других записях. Следовательно, вероятность этого слова при условии категории равно 0,25, а вероятность категории при условии слова равна 1,0.

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

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

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