Научит вас, как сделать лучшую поисковую систему для электронной коммерции (1) - прогнозирование категорий
введение
Электронная коммерция сегодня играет ключевую роль в нашей жизни, а поисковые системы являются основным порталом трафика системы электронной коммерции.Вопросы поиска играют решающую роль во всей системе.Как оптимизировать поиск и сделать так, чтобы пользователи выполняли поиск чаще? , быстрее, это уже обязательный курс для зрелой системы электронной коммерции.
Ядро и сущность поиска
Что такое хорошая поисковая система для электронной коммерции?
Суть отличной поисковой системы для электронной коммерции заключается в том, чтобы понимать потребности пользователей, помогать пользователям быстро находить нужные им продукты и совершать транзакции.
Так как же поисковые системы понимают намерения пользователя? Есть 3 распространенных метода:
1. Правила и методы на основе словарей и шаблонов
Вручную классифицируйте условия поиска пользователя, например, когда пользователь ищет iphone, он вручную классифицируется в категорию «мобильный телефон». Этот метод обработки точен и эффективен, и он очень эффективен против некоторых популярных товаров/особых существительных, однако по мере увеличения числа пользователей количество ключевых слов, включая ключевые слова с длинным хвостом, становится все более и более сложным, и это больше невозможно обрабатывать такое большое количество ключевых слов вручную.
2. Статистические методы, основанные на поведении пользователей
По поведению пользователя, например, когда пользователи ищут яблоки, большинство из них заказывают мобильные телефоны, а несколько человек заказывают фрукты.По статистике можно сделать вывод, что категории яблок: мобильные телефоны > фрукты. Этот метод основан на поведении пользователя, и, как и в методе 1, сложно подобрать сложные слова. В частности, такой язык, как китайский, с широким и глубоким порядком слов, не повлияет на понимание других, если он немного неправильный.
3. На основе модели машинного обучения для распознавания намерений пользователя.
С развитием искусственного интеллекта, НЛП (обработка естественного языка), обработка естественного языка стала самой важной частью эпохи ИИ. Этот метод в основном использует машинное обучение и глубокое обучение для обучения и изучения корпуса в отмеченной области для получения модели распознавания намерений. Используя эту модель, когда вводится другой набор тестов, она может быстро предсказать соответствующую классификацию корпуса и обеспечить соответствующую достоверность. Одним из преимуществ использования этого метода является то, что точность модели будет продолжать улучшаться после того, как корпус будет непрерывно пополняться.
Сегодня мы в основном говорим о третьем способе.
Этапы обработки поискового запроса
Чтобы получить ключевые слова пользователя для поиска, поисковая система электронной коммерции обычно должна выполнить следующие шаги обработки:
1. Нормализация текста
Общие операции:
(1) Удалите стоп-слова, такие как: специальные символы и знаки препинания, случайно введенные пользователями.
(2). Унифицируйте верхний и нижний регистр, например: Nike/nike,iphone xr/iPhone Xr.
(3) Различное преобразование языка, например: телефон iphone/Apple, Adidas/adidas
2. Исправление текстовых ошибок, например: iphoe => iphone
3. Сегментация слов, например: мужской спортивный свитер с капюшоном Li Ning => мужской спортивный свитер с капюшоном Li Ning
4. Распознавание намерений/распознавание центрального слова, например:
«Мужской спортивный свитер с капюшоном Li Ning», результат сегментации слов: «Мужской спортивный свитер с капюшоном Li Ning»
Результат распознавания:
Толпа: мужчины Категория: Свитер Модификаторы категорий: Спортивные с капюшоном Торговая марка: Ли Нин
5. Предсказание категории/классификация текста, например:
Мужская спортивная толстовка с капюшоном Li Ning => Спортивная одежда
Женская осенне-зимняя пижама => женское нижнее белье/одежда для отдыха
Как один из самых классических сценариев использования в области НЛП, классификация текста накопила множество методов реализации, таких как FastText с открытым исходным кодом Facebook, сверточная нейронная сеть (CNN) и рекуррентная нейронная сеть (RNN) и т. д. Здесь мы в основном рассматриваем глубокие классификация текстов на основе обучения.
Мы не будем вдаваться в подробности принципа, сегодня мы в основном используем FastText, чтобы попрактиковаться в том, как выполнять прогнозирование категорий.
Let's do it!
Практика предсказания категории FastText
структура системы
подготовка данных
Приступаем к сбору данных.
Как мы все знаем, основная проблема машинного обучения состоит в том, чтобы собрать большое количество помеченных образцов.Нелегко обеспечить, чтобы образцы были просты в обращении, своевременно обновлялись и всесторонне охватывались.
Поскольку основным источником товаров в нашей системе является Taobao, в качестве примера я беру товары Taobao, в категории используется категория первого уровня Taobao, а в текстовых данных используется название продукта Taobao.
Что-то вроде этого:
Категория | заглавие |
---|---|
Косметика/Уход за телом/Эфирное масло | Натуральный уход за кожей Lancome Moisture Soothing Softening Gel 50ml Medium Sample Super Watery Moisturizing Gel Gel |
Нам нужен инструмент сегментации слов. Существует много инструментов для сегментации слов, таких как сторонние сервисы, такие как Alibaba Cloud и Tencent Cloud, а также инструменты с открытым исходным кодом, такие как сегментация слов Jamba. Здесь мы используем сегментацию слов Jaba для создания http-слова. интерфейс сегментации.
$ npm init
$ npm install nodejieba --save
$ vim fenci.js
Содержимое fenci.js выглядит следующим образом:
"use strict";
(function () {
const queryString = require('querystring'),
http = require('http'),
nodejieba = require("nodejieba")
const port = process.env.PORT || 8800
const host = process.env.HOST || '0.0.0.0'
const requestHandler = (request, response) => {
let query = request.url.split('?')[1]
let queryObj = queryString.parse(query)
let result = nodejieba.cut(queryObj.text, true)
let res = {
rs: result
}
response.setHeader('Content-Type', 'application/json')
response.end( JSON.stringify(res, null, 2) )
}
const server = http.createServer(requestHandler);
server.listen(port, host, (error) => {
if (error) {
console.error(error);
}
console.log(`server is listening on ${port}`)
})
}).call(this)
Запуск с pm2:
$ pm2 start fenci.js
Проверьте интерфейс сегментации слов (обратите внимание, что параметры должны быть urlencode один раз):
$ curl 'http://127.0.0.1:8800/?text=%E4%BF%9D%E6%9A%96%E5%86%85%E8%A1%A3'
Получен следующий вывод, указывающий на то, что интерфейс работает правильно:
{
"rs": [
"保暖",
"内衣"
]
}
Название продукта выше почти становится таким:
正品 护肤 兰蔻 水份 缘 舒缓 柔肤者 哩 50 ml 中样 超水妍 保湿 啫喱 凝 露水
Если сегментация слов неточна, мы можем собрать некоторые фирменные слова и термины, обычно используемые в электронной коммерции, сохранить их в пользовательском тезаурусе сегментации слов (файл user.dict.utf8) и перезапустить службу сегментации слов.
Библиотека образцов текста
Для удобства управления закинем примерную инвентаризацию в mysql, построим таблицу mysql:
CREATE TABLE `tb_text_train` (
`item_id` bigint(20) NOT NULL COMMENT '淘宝商品ID',
`title` varchar(255) DEFAULT NULL COMMENT '淘宝商品标题',
`level_one_category_name` varchar(255) DEFAULT NULL COMMENT '淘宝商品类目',
`title_split` varchar(1000) DEFAULT NULL COMMENT '标题分词',
`done` tinyint(1) DEFAULT '0' COMMENT '样本已处理为1,未处理为0',
`updatetime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`item_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Таким образом, мы можем использовать сценарии синхронизации для регулярной обработки названий продуктов в библиотеке (удаление стоп-слов, сегментация слов) и синхронизировать их с библиотекой образцов. Вы также можете сделать фон и вручную обрабатывать аннотации в фоновом режиме.
Обработка текста для обучения
После того, как текст помечен, мы можем использовать оператор sql для экспорта отмеченных данных и экспортировать их в виде файла data.txt в соответствии с желаемым форматом, формат выглядит следующим образом:
__label__传统滋补营养品 茯薏芷湿膏 茯清湿 茶芷湿 茶
__label__男装 秋季 裤子 男 休闲 长裤 韩版 潮流 学生 宽松 束脚 裤百搭 运动裤 男 九分裤
__label__住宅家具 大理石 面 功夫茶 茶几 简约 现代中式 多功能 泡茶 一体桌 客厅 办公室 喝茶
__label__服饰配件/皮带/帽子/围巾 蝴蝶结 禁欲 帽子 夏天 遮阳 防晒 渔夫帽 出游 海边 度假 日系 文艺 女 草帽
__label__女鞋 秋冬 真皮 保暖 豆豆 鞋 平底 休闲女鞋 大码 妈妈 鞋 孕妇 白色 护士 棉鞋 女
__label__居家日用 超声波 驱蚊器 家用 灭蚊 神器 智能 电子 驱蚊 驱虫 器 室内 驱鼠灭 苍蝇 蟑螂
__label__女士内衣/男士内衣/家居服 男士 平角 内裤 纯棉 中老年 爸爸 平角 裤 全棉 裤衩 宽松 老人 加肥加大 裤头
Описание формата, по одному в строке:
__label__分类名 已经处理好的标题字符串
Затем мы разделили весь набор данных на 2 части, 90% в качестве обучающего набора и 10% в качестве тестового набора, Код выглядит следующим образом:
import pandas as pd
import numpy as np
# 语料数据集存放路径
data_path = "/usr/local/webdata/fastText/"
# 读取语料数据集文本文件
train = pd.read_csv(data_path+"data.txt", header=0, sep='\r\n', engine='python')
ts = train.shape
# 打乱数据集,拆分为训练集train.txt和测试集test.txt
df = pd.DataFrame(train)
new_train = df.reindex(np.random.permutation(df.index))
# 训练集和测试集比例为9:1
indice_90_percent = int((ts[0]/100.0)* 90)
# 打散到2个文件中
new_train[:indice_90_percent].to_csv(data_path+'train.txt',index=False)
new_train[indice_90_percent:].to_csv(data_path+'test.txt',index=False)
Тренируйтесь с fastText
1. Установите фасттекст:
установка фасттекста очень проста:
$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ make
$ pip install .
2. Используйте ускоренное обучение:
Запустите обучение с помощью командной строки:
$ ./fasttext supervised -input train.txt -output model -label __label__ -epoch 50 -wordNgrams 3 -dim 100 -lr 0.5 -loss hs
Или напишите программу на Python для вызова модуля fasttext:
import fasttext
model = fasttext.train_supervised(input="model",
lr=0.5,
epoch=100,
wordNgrams=3,
dim=100,
loss='hs')
После завершения обучения модели будут сгенерированы файл модели model.bin и текстовый векторный файл model.vec.
3. Набор данных проверки
Обучение почти завершено, давайте используем тестовый набор, чтобы проверить, мул или лошадь вышли на прогулку.
$ ./fasttext test model.bin test.txt
Появятся следующие результаты:
N 1892209
P@1 0.982
R@1 0.982
Хорошо выглядит.
Давайте попробуем это с фактическими поисковыми словами пользователя.Например, мы только что сегментировали слово «термобелье», и результатом сегментации слова было «термобелье», тогда прогноз, отправленный в fasttext, выглядит следующим образом:
$ echo '保暖 内衣' | ./fasttext predict model.bin -
Через несколько секунд вы можете получить такой результат:
__label__女士内衣/男士内衣/家居服
бинго, предсказание идеально!
Советы: Файл model.bin, сгенерированный по умолчанию, будет очень большим.Вы можете использовать команду quantize для сжатия файла модели:
$ ./fasttext quantize -output model
Он сгенерирует файл model.ftz со значительно уменьшенным объемом, и эффект после тестирования очень значителен.Например, я изменил здесь размер с 4,7 ГБ до 616 МБ, и это здорово~~
4.7G model.bin
616M model.ftz
60K model.o
6.1G model.vec
Используйте так же, как и model.bin, например:
$ ./fasttext test model.ftz test.txt
$ echo '保暖 内衣' | ./fasttext predict model.ftz -
4. Предоставлять веб-сервисы
Чтобы пользоваться сервисом прогнозирования было удобнее, мы также делаем функцию прогнозирования http-интерфейсом или используем nodejs.
$ npm install fasttext.js --save
$ vim predict.js
Содержимое pred.js выглядит следующим образом:
"use strict";
(function () {
const queryString = require('querystring'),
FastText = require('fasttext.js'),
http = require('http')
const port = process.env.PORT || 8801
const host = process.env.HOST || '0.0.0.0'
const fastText = new FastText({
loadModel: '/usr/local/webdata/fastText/model.ftz'
})
const requestHandler = (request, response) => {
let query = request.url.split('?')[1]
let queryObj = queryString.parse(query)
fastText.predict(queryObj.text)
.then(labels => {
let res = {
predict: labels
}
response.setHeader('Content-Type', 'application/json')
response.end( JSON.stringify(res, null, 2) )
})
.catch(error => {
console.error("predict error", error)
})
}
const server = http.createServer(requestHandler)
fastText.load()
.then(done => {
console.log("model loaded")
server.listen(port, host, (error) => {
if (error) {
console.error(error)
}
console.log(`server is listening on ${port}`)
})
})
.catch(error => {
console.error("load error", error)
});
}).call(this)
Опять же, мы используем pm2 для запуска службы:
$ pm2 start predict.js
Проверьте эффект (обратите внимание, что параметры должны быть сегментированы с использованием вышеуказанного интерфейса сегментации, а затем один раз urlencode):
$ curl 'http://127.0.0.1:8801/?text=%E4%BF%9D%E6%9A%96%20%E5%86%85%E8%A1%A3'
получить этот результат:
{
"predict": [
{
"label": "女士内衣/男士内衣/家居服",
"score": "1.00005"
},
{
"label": "童装/婴儿装/亲子装",
"score": "0.0543005"
}
]
}
Кажется, что эффект очень хороший, и тот, у кого наибольшее значение балла, в основном соответствует потребностям.
Суммировать
После вышеперечисленных простых шагов мы успешно создали набор услуг прогнозирования классификации товаров Taobao, включая систему сегментации слов и систему прогнозирования классификации. Благодаря интеграции этих услуг в нашу функцию поиска наш поиск станет более точным, а пользователи будут более довольны покупками.
см. кодмой гитхаб