Программная реализация системы

 

ТРЕБОВАНИЯ К ПРОГРАММНОМУ ОБЕСПЕЧЕНИЮ

 

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

Для работы программы требуется:

- операционная система Windows 98/2000/XP;

- установленная среда Python 2.6;

- установленный SQL Server 2005.

Для запуска программы необходимо запустить программу Python 2.6 и затем найти необходимый файл с программой. Для того, чтобы проект работал правильно необходимо подключить базу данных, указав при этом верный путь к ней. После правильной установки связи с базой данных проект необходимо запустить на выполнение.

 

ТЕСТИРОВАНИЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ И ПОЛУЧЕННЫЕ РЕЗУЛЬТАТЫ

 

Главная форма программы «Apriori», как показано на рисунке 3.1, отображает все продукты, добавленные в базу данных, а также кнопки с дополнительными сервисами. С главной формы можно перейти к корзине, где можно подобрать продукцию (рис. 3.2), просмотреть популярные наборы (рис. 3.3), а также посмотреть правила (рис. 3.4).

В данной программе также можно добавлять категорию в базу данных, с пользовательского интерфейса (рис. 3.5), добавлять товары в главную форму программы, также посмотреть список транзакций (рис. 3.6).

 


Рисунок 3.1 – Главная форма

 

Рисунок 3.2 – Подбор продукции

 

Рисунок 3.3 Популярные наборы (с учетом уровня поддержки 2-5)

 


Рисунок 3.4 Правила

 

Рисунок 3.5 – Добавление категории

 

Рисунок 3.6 – Список транзакций


ПРИМЕР ОФОРМЛЕНИЯ ЗАКАЗА

персонализация интеллектуальный товар ассоциативный

Для того, чтобы пользователю совершить покупку, в данной программе необходимо воспользоваться «экспертом выбора» или «вручную» ввести нужный продукт самостоятельно. Рассмотрим оба варианта:

а) Оформление заказа с помощью «Эксперта выбора».

Для того чтобы воспользоваться «Экспертом выбора» необходимо на главной форме программы нажать кнопку корзина. На экране появится окно, где есть кнопка «Эксперт выбора» (рис. 3.7).

 

Рисунок 3.7 – «Эксперт выбора»

 

После нажатие данной кнопки, пользователю предлагается ответить на три вопроса. Вопрос №1 представлен на рисунке 3.8, вопрос №2 представлен на рисунке 3.9, вопрос №3 представлен на рисунке 3.10.

 

Рисунок 3.8 – Вопрос №1


Рисунок 3.9 – Вопрос №2

 

Рисунок 3.10 – Вопрос №3

 

После ответов на данные вопросы, программа покажет интересующие пользователя продукты. Пользователь выбирает соответствующий продукт и нажимает кнопку «Добавить в корзину» (рис. 3.11).

 

Рисунок 3.11 – Выбор продукта


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

 

Рисунок 3.12 – Покупка продукции

 

В случае, если пользователь решил завершить покупку, то после нажатия кнопки «оформить покупку», автоматически добавляется в список транзакций (рис. 3.6). В случае если хочет добавить к своему заказу еще продукт, то нажимает на кнопку «Эксперт выбора», и проходит снова три вопроса.

б) Оформление заказа «вручную».

Для оформления заказа «вручную» необходимо на главной форме системы нажать кнопку «Транзакции», которую можно увидеть на рисунке 3.6. После чего следует нажать на кнопку «Добавить данные» (рис 3.13), и через запятую следует ввести необходимые товары.

 

Рисунок 3.13 – Добавление транзакции


Такой способ покупки продукции имеет свои положительные и отрицательные стороны. К положительным относится то, что пользователь, который знает, что именно он хочет заказать, достаточно быстро формирует транзакцию. Тот факт, что при использовании такого метода покупки система не будет рекомендовать дополнительные товары, что может быть как и положительно (сохранит время клиента), так и отрицательно (клиент не увидит рекомендуемые продукты, которые могли бы его заинтересовать).

 


ВЫВОДЫ

В данной бакалаврской работе была разработана интеллектуальная системы подбора товаров, работа которой базируется на использовании ассоциативных правил. При заданном запросе система подбирает клиенту необходимый продукт и предлагает дополнительные товары в зависимости от интересов. Для этого клиент должен описать критерии, по которым система определит потребности.

Интеллектуальная система создана с использованием средств СУБД SQL SERVER, а также среды Python 2.6. Работа с системой не требует от пользователей особых знаний в области баз данных. При заданном запросе система подбирает клиенту необходимый продукт и предлагает дополнительные товары в зависимости от интересов. Для этого клиент должен описать критерии, по которым система определит потребности. Программа является легкой в освоении и эксплуатации, что достаточно важно для конечного пользователя.

 


ПЕРЕЧЕНЬ ССЫЛОК

1. Agrawal R. Mining Association Rules Between Sets of Items in Large Databases. / R. Agrawal, T. Imielinski, A. Swami. // SIGMOD Conference 1993. Р. 207-216.

2. Hipp J. Algorithms for association rule mining – A general survey and comparison. / J. Hipp, U. Güntzer, G. Nakhaeizadeh. // SIGKDD Explorations. №2(2). – 2000. – Р. 1-58.

3. Omiecinski E. Alternative interest measures for mining associations in databases. / E. Omiecinski. // IEEE Transactions on Knowledge and Data Engineering. – 2003. – №15(1). – Р. 57-69.

4. Поиск ассоциативных правил: [Электрон. ресурс]. Режим доступа: http://wiki.auditory.ru/.

5. Поиск ассоциативных правил при интеллектуальном анализе данных: [Электрон. ресурс]. Режим доступа: www.rammus.ru/products/arda/.

6. Области применения ассоциативных правил: [Электрон. ресурс]. Режим доступа: www.rammus.ru/products/arda/article_review_ar_applications/.

7. Association rule learning: [Электрон. ресурс]. Режим доступа: http://en.wikipedia.org/wiki/Association_rule_learning/.

8. Методы поиска ассоциативных правил: [Электрон. ресурс]. Режим доступа: www.intuit.ru/department/database/datamining/15/.

9. Введение в анализ ассоциативных правил: [Электрон. ресурс]. Режим доступа: www.basegroup.ru/library/analysis/association_rules/intro/.

10. Apriori – масштабируемый алгоритм поиска ассоциативных правил: [Электрон. ресурс]. Режим доступа: www.basegroup.ru/library/association_rule/.

11. Apriori: [Электрон. ресурс]. Режим доступа: ru.wikipedia/Apriori/.

12. Персонализация данных: [Электрон. ресурс]. Режим доступа: www.copy-market.ru/index.php?page...dannyh/.

13. Персонализация данных: [Электрон. ресурс]. Режим доступа: http://www.copy-market.ru/personalizatsiya-dannyh/.

14. Персонализация: [Электрон. ресурс]. Режим доступа: www.lscorp.ru/.

15. Data Mining: [Электрон. ресурс]. Режим доступа: www.int.ru/datamining/.

16. Data Mining – интеллектуальный анализ данных: [Электрон. ресурс]. Режим доступа: www.inftech.webservis.ru/it/database/datamining/ar2.html/.

17. Apriori algorithm source code: [Электрон. ресурс]. Режим доступа: msug.vn.ua/blogs/datamining/archive/2009/08/02/apriori-algorithm/.

18. Data Mining: [Электрон. ресурс]. Режим доступа: http://habrahabr.ru/blogs/data_mining/66016/.

19. Боуман Дж. Практическое руководство по SQL. / Дж. Боуман, С. Эмерсон, М. Дарновски. К.: Диалектика, 1998. – 565 с.

20. Введение в стандарты языка баз данных SQL. [Электрон. ресурс]. Режим доступа: www.citforum.ru/database/sqlbook/index.shtml/.

 


ПРИЛОЖЕНИЕ

 

Программный код файла «qt»

 

#!/usr/bin/python2.6

# -*- coding: utf-8 -*-

FROM __future__ IMPORT unicode_literals

IMPORT platform

IMPORT sys

FROM PyQt4 IMPORT QtCore, QtGui

IMPORT resource_rc

FROM models IMPORT Category, Item

FROM FormResult IMPORT FormResult

FROM FormTransactions IMPORT FormTransactions

FROM FormCategories IMPORT FormCategories

FROM FormItem IMPORT FormItem

FROM FormCart IMPORT FormCart

FROM FormRules IMPORT FormRules

FROM FormPopular IMPORT FormPopular

FROM FormSupp IMPORT FormSupp

__version__ = "1.0.0"

class Form(QtGui.QDialog):

def __init__(self, parent=NONE):

SUPER(Form, self).__init__(parent)

addAction = QtGui.QAction(QtGui.QIcon(":/edit_add.png"), "&Добавить", self,

triggered=self.add_item)

delAction= QtGui.QAction(QtGui.QIcon(":/remove.png"), "&Удалить", self,

triggered=self.delete_item)

categoryAction=QtGui.QAction(QtGui.QIcon(":/category.png"), "&Категории", self,

triggered=self.show_categories)

TRANSACTION=QtGui.QAction(QtGui.QIcon(":/database.png"), "&Транзакции", self,

triggered=self.show_transactions)

popularAction=QtGui.QAction(QtGui.QIcon(":/chart_bar.png"), "&Популярные товары", self,

triggered=self.show_popular)

rulesAction=QtGui.QAction(QtGui.QIcon(":/calculator.png"), "&Правила", self,

triggered=self.show_rules)

cartAction=QtGui.QAction(QtGui.QIcon(":/cart2.png"), "&Корзина", self,

triggered=self.show_cart)

itemsAction=QtGui.QAction(QtGui.QIcon(":/refresh.png"), "&Товары", self,

triggered=self.show_items)

aboutAction=QtGui.QAction(QtGui.QIcon(":/help.png"),"&О программе", self,

triggered=self.help_about)

toolBar = QtGui.QToolBar()

#QStyle.SH_TitleBar_NoBorder

toolBar.addAction(addAction)

toolBar.addAction(delAction)

toolBar.addAction(categoryAction)

toolBar.addAction(TRANSACTION)

toolBar.addAction(popularAction)

toolBar.addAction(rulesAction)

toolBar.addAction(cartAction)

toolBar.addAction(itemsAction)

toolBar.addAction(aboutAction)

#init grid

self.tableWidget = QtGui.QTableWidget()

self.refreshTable()

layout = QtGui.QVBoxLayout()

layout.addWidget(toolBar)

layout.addWidget(self.tableWidget)

self.setLayout(layout)

self.connect(self.tableWidget,

QtCore.SIGNAL("itemDoubleClicked(QTableWidgetItem*)"),

self.edit_item)

self.setWindowTitle(u"Apriori. Помощь в подборе товара при покупке")

self.setGeometry(250, 250, 950, 400)

screen=QtGui.QDesktopWidget().screenGeometry()

size=self.geometry()

self.move((screen.width()-size.width())/2,(screen.height()-size.height())/2)

def refreshTable(self):

self.tableWidget.clear()

self.tableWidget.setSortingEnabled(True)

self.tableWidget.setRowCount(0)

self.tableWidget.enabledChange(False)

self.tableWidget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection); self.tableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows);

self.tableWidget.setEditTriggers(QtGui.QTableWidget.NoEditTriggers)

elf.tableWidget.setColumnCount(3)

self.tableWidget.setHorizontalHeaderLabels(["№","Название",'Категория'])

self.tableWidget.setColumnWidth(0, 40)

self.tableWidget.setColumnWidth(1, 400)

self.tableWidget.setColumnWidth(2, 400)

for item in Item.get():

no=self.tableWidget.rowCount()

self.tableWidget.insertRow(no)

self.tableWidget.setItem(no, 0, QtGui.QTableWidgetItem(str(item.id)))

self.tableWidget.setItem(no, 1, QtGui.QTableWidgetItem(item.name))

self.tableWidget.setItem(no, 2, QtGui.QTableWidgetItem(Category.get (item.category_id).get_name()))

self.tableWidget.setRowHeight(no, 20)

def show_rules(self):

forms = FormSupp()

if forms.exec_():

form=FormRules(minsupp=forms.minText.text().toInt()[0], maxsupp=forms.maxText.text().toInt()[0])

form.exec_()

def show_popular(self):

forms = FormSupp()

if forms.exec_():

form=FormPopular(minsupp=forms.minText.text().toInt()[0], maxsupp=forms.maxText.text().toInt()[0])

form.exec_()

def show_cart(self):

form = FormCart()

form.exec_()

def add_item(self):

form = FormItem()

form.exec_()

self.refreshTable()

def edit_item(self):

no = self.tableWidget.currentRow()

if no != -1:

id = self.tableWidget.item(no, 0).text()

form = FormItem(model=Item.get(id))

form.exec_()

self.refreshTable()

def delete_item(self):

reply = QtGui.QMessageBox.question(self,

"Удаление",

"Запись будет удалена! Вы уверены?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

if reply == QtGui.QMessageBox.Yes:

no = self.tableWidget.currentRow()

no != -1:

id = self.tableWidget.item(no, 0).text()

Item(id=id).delete()

self.refreshTable()

def show_items(self):

form = FormResult()

form.exec_()

def show_transactions(self):

form = FormTransactions()

form.exec_()

def show_categories(self):

form = FormCategories()

form.exec_()

def help_about(self):

QtGui.QMessageBox.about(self, "Apriori – О программе",

"""<b>Apriori</b> v {0}

<p>&copy; 2010, Евгений Лукашевский.

Все права защищены.

<p>Python {1} – Qt {2} – PyQt {3} on {4}""".format(

__version__, platform.python_version(),

QtCore.QT_VERSION_STR, QtCore.PYQT_VERSION_STR,

platform.system()))

app = QtGui.QApplication(sys.argv)

form = Form()

form.show()

app.exec_()

 

Программный код файла «Models»

 

MPORT ConfigParser, os

FROM autumn.db.connection IMPORT autumn_db

FROM autumn.model IMPORT Model

FROM autumn.db.relations IMPORT ForeignKey, OneToMany

FROM autumn IMPORT validators

IMPORT DATETIME

config = ConfigParser.ConfigParser()

config.readfp(OPEN('app.cfg'))

autumn_db.conn.connect('mysql', HOST=config.get('Database', 'host'), \

USER=config.get('Database', 'user'), \

db=config.get('Database', 'db'), \

passwd=config.get('Database', 'passwd'), \

CHARSET='utf8')

class ORDER(Model):

items = OneToMany('OrderItem', 'order_id')

class Meta:

TABLE = 'orders'

class OrderItem(Model):

ORDER = ForeignKey(ORDER, 'order_id')

class Meta:

TABLE = 'order_items'

class Item(Model):

class Meta:

TABLE = 'items'

class Category(Model):

class Meta:

TABLE = 'categories'

def get_name(self):

IF self.lvl == 1:

RETURN self.name

IF self.lvl == 2:

sub_category = Category.get(self.parent_id)

RETURN sub_category.name + ' -> ' + self.name

IF self.lvl == 3:

RETURN sub_category2.name + ' -> ' + sub_category.name + ' -> ' + self.name

def get_parent_name(self):

IF self.lvl == 2:

sub_category = Category.get(self.parent_id)

RETURN sub_category.name

IF self.lvl == 3:

sub_category = Category.get(self.parent_id)

sub_category2 = Category.get(sub_category.parent_id)

RETURN sub_category2.name + ' -> ' + sub_category.name

 

Программный код файла «Apriori»

 

-*- coding: utf-8 -*-

FROM models IMPORT ORDER, OrderItem

class Apriori:

def __init__(self, minsupp=0, maxsupp=1000):

self.orders = NONE

self.items = NONE

self.max_items = 0

self.minsupp = minsupp

self.maxsupp = maxsupp

def transactions(self):

""" Формирование списка транзакций"""

orders = []

FOR ORDER IN Order.get():

_items = []

FOR item IN order.items:

orders.append(_items)

self.orders = orders

max_items = 0

FOR ORDER IN orders:

IF len(ORDER) > max_items: max_items = len(ORDER)

self.max_items = max_items

RETURN self.orders

def items_(self):

items = {}

IF self.orders == NONE:

self.transactions()

FOR ORDER IN self.orders:

FOR item IN ORDER:

IF item NOT IN items:

items[item] = 1

ELSE:

items[item] = items[item] + 1

RETURN self.items

def calc(self):

IF self.items == NONE:

self.items_()

k = {}

result = []

k[1] = [{'elements': [d], 'cnt': n} FOR d, n IN self.items.iteritems()]

FOR NO IN xrange(2, self.max_items):

k[NO] = self.Apriorigen(k[NO – 1], self.orders, self.minsupp, self.maxsupp)

result = result + k[NO]

RETURN result

def Apriorigen(self, DATA, orders, minsupp, maxsupp):

""" Генерация k+1 элементных кандидатов.

Размер k определяется размером списка DATA

"""

IF candidate == tmp:

is_exist = TRUE

FOR c IN candidates:

IF c['elements'] == item:

c['cnt'] = c['cnt'] + 1

break

ELSE:

candidates.append({'cnt': 1, 'elements': item[:]})

FOR item IN candidates:

supp = self.find_supp(item['elements'][:len(item['elements']) – 1], DATA)

item['supp'] = FLOAT(item['cnt']) / supp * 100

candidates_filter = [line FOR line IN candidates IF line['cnt'] >= minsupp AND line['cnt'] <= maxsupp]

RETURN candidates_filter

def find_supp(self, el, DATA):

FOR i IN DATA:

IF el == i['elements']:

RETURN i['cnt']

RETURN 0

def popular(self):

k = self.calc()

items = sorted(k, KEY = lambda X: -X['supp'])

RETURN items

Размещено на Allbest.ru