Сохранение обученных классификаторов

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

Использование SQLite

В этом разделе мы покажем, как сохранить результаты обучения классификатора в базе данных, в данном случае SQLite. Если у вашего приложения много пользователей, одновременно обучающих и опрашивающих классификатор, то, вероятно, имеет смысл хранить счетчики в базе. SQLite – это та самая СУБД. Если вы этого еще не сделали, загрузите и установите пакет pysqlite; о том, как это сделать, см. приложение А. Доступ к SQLite из Python организуется так же, как к другим СУБД, так что серьезных затруднений у вас не возникнет.

Чтобы импортировать pysqlite, включите в начало файла docclass.py следующее предложение:

from pysqlite2 import dbapi2 as sqlite Код, приведенный в этом разделе, предназначен для замены словарей, которые сейчас имеются в классе classifier, постоянным хранилищем данных. Добавьте в класс classifier метод для открытия базы данных и создания необходимых таблиц. Структура таблиц повторяет структуру заменяемых ими словарей: def setdb(self,dbfile):

self.con=sqlite.connect(dbfile)

self.con.execute(‘create table if not exists fc(feature,category,count)’) self.con.execute(‘create table if not exists cc(category,count)’)

Если вы собираетесь адаптировать классификатор для другой базы данных, то, возможно, потребуется изменить предложения create table в соответствии с диалектом SQL в используемой СУБД. Необходимо заменить вспомогательные методы получения и увеличения счетчиков:

def incf(self,f,cat): count=self.fcount(f,cat) if count==0:

self.con.execute("insert into fc values (‘%s’,’%s’,1)" % (f,cat))

else:

self.con.execute( "update fc set count=%%d where feature=’%s’ and category=’%s’" % (count+1,f,cat))

def fcount(self,f,cat): res=self.con.execute(

‘select count from fc where feature="%s" and category="%s"’ %%(f,cat)).fetchone( ) if res==None: return 0 else: return float(res[0])

def incc(self,cat):

count=self.catcount(cat) if count==0:

self.con.execute("insert into cc values (‘%s’,1)" % (cat)) else:

self.con.execute("update cc set count=%%d where category=’%s’" % (count+1,cat))

def catcount(self,cat):

res=self.con.execute(‘select count from cc where category="%s"’

%(cat)).fetchone( ) if res==None: return 0 else: return float(res[0])

Необходимо также заменить методы для получения списка всех категорий и общего числа документов:

def categories(self):

cur=self.con.execute(‘select category from cc’); return [d[0] for d in cur]

def totalcount(self):

res=self.con.execute(‘select sum(count) from cc’).fetchone( ); if res==None: return 0 return res[0]

Наконец по завершении обучения нужно добавить вызов commit, чтобы сохранить обновленные счетчики. Добавьте следующую строку в конец метода train:

self.con.commit( )

Вот и все! После инициализации классификатора следует вызвать метод setdb, указав имя файла базы данных. Данные, полученные в ходе обучения, автоматически сохраняются и могут быть использованы кем угодно. Можно даже воспользоваться данными из одного классификатора, чтобы выполнить классификацию другого типа: >>> reload(docclass) <module ‘docclass’ from ‘docclass.py’> >>> cl=docclass.fisherclassifier(docclass.getwords) >>> cl.setdb(‘test1.db’) >>> docclass.sampletrain(cl) >>> cl2=docclass.naivebayes(docclass.getwords) >>> cl2.setdb(‘test1.db’) >>> cl2.classify(‘quick money’) u’bad’

Вы можете следить за любыми ответами на эту запись через 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