Skip to content

Instantly share code, notes, and snippets.

@tvorogme
Last active April 19, 2019 17:49
Show Gist options
  • Save tvorogme/1add4360448073119b7577dc03840a7f to your computer and use it in GitHub Desktop.
Save tvorogme/1add4360448073119b7577dc03840a7f to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Базовое решение второго кейса\n",
"\n",
"https://www.kaggle.com/c/studhackvv2/"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T21:07:06.450902Z",
"start_time": "2019-04-18T21:07:06.445889Z"
}
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import re\n",
"import numpy as np\n",
"from collections import *\n",
"from random import sample, random\n",
"from tqdm import tqdm\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.metrics import mean_squared_error\n",
"from datetime import datetime\n",
"from zipfile import ZipFile, ZIP_DEFLATED\n",
"import os"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:12.398371Z",
"start_time": "2019-04-18T20:43:12.266986Z"
}
},
"outputs": [],
"source": [
"# Загрузим данные\n",
"train = pd.read_csv('./task2_data/train.csv', index_col='buyer')\n",
"meta = pd.read_csv('./task2_data/meta.csv', index_col='id_tov')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:12.451433Z",
"start_time": "2019-04-18T20:43:12.437411Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>items</th>\n",
" </tr>\n",
" <tr>\n",
" <th>buyer</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>101 1933 1828 1135 1367 1906 1629 1533 1874 17...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>1795 844 1214 1527 447 77 1925 719 1385 1475 1...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <td>1596 389 31 269 658 801 109 185 220 296 962 35...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <td>1234 453 1214 680 1706 1708 1506 1151 1949 117...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44</th>\n",
" <td>249 1234 986 824 437 975 676 1447 413 282 1743...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" items\n",
"buyer \n",
"4 101 1933 1828 1135 1367 1906 1629 1533 1874 17...\n",
"11 1795 844 1214 1527 447 77 1925 719 1385 1475 1...\n",
"34 1596 389 31 269 658 801 109 185 220 296 962 35...\n",
"37 1234 453 1214 680 1706 1708 1506 1151 1949 117...\n",
"44 249 1234 986 824 437 975 676 1447 413 282 1743..."
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:12.802544Z",
"start_time": "2019-04-18T20:43:12.789906Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Наименование</th>\n",
" <th>Вес</th>\n",
" <th>Категория</th>\n",
" <th>Подкатегория</th>\n",
" <th>Состав</th>\n",
" <th>Пищевая ценность</th>\n",
" <th>Срок годности</th>\n",
" </tr>\n",
" <tr>\n",
" <th>id_tov</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Молоко ЦЕЛЬНОЕ</td>\n",
" <td>1 л</td>\n",
" <td>Молочная Продукция</td>\n",
" <td>Молоко</td>\n",
" <td>цельное молоко &amp;nbsp;</td>\n",
" <td>белки не менее 3 г, жиры 3,5-4,2 г, углеводы 5...</td>\n",
" <td>5 суток</td>\n",
" </tr>\n",
" <tr>\n",
" <th>81</th>\n",
" <td>Молоко 3,2%</td>\n",
" <td>1 л</td>\n",
" <td>Молочная Продукция</td>\n",
" <td>Молоко</td>\n",
" <td>молоко цельное, молоко обезжиренное</td>\n",
" <td>белки 3 г, жиры 3,2 г, углеводы 4,7 г; 60 ккал</td>\n",
" <td>5 суток</td>\n",
" </tr>\n",
" <tr>\n",
" <th>109</th>\n",
" <td>Молоко топлёное, 500 г</td>\n",
" <td>500 г</td>\n",
" <td>Молочная Продукция</td>\n",
" <td>Молоко</td>\n",
" <td>молоко нормализованное по содержанию жира</td>\n",
" <td>белки 3 г, жиры 4 г, углеводы 4,7; 67 ккал</td>\n",
" <td>6 суток</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1785</th>\n",
" <td>Молоко 2,5%</td>\n",
" <td>450 г</td>\n",
" <td>Молочная Продукция</td>\n",
" <td>Молоко</td>\n",
" <td>цельное молоко, обезжиренное молоко</td>\n",
" <td>белки 3 г, жиры 2,5 г, углеводы 4,7 г; 53 ккал</td>\n",
" <td>5 суток</td>\n",
" </tr>\n",
" <tr>\n",
" <th>377</th>\n",
" <td>Молоко 3,2% в бутылке</td>\n",
" <td>900 мл</td>\n",
" <td>Молочная Продукция</td>\n",
" <td>Молоко</td>\n",
" <td>молоко цельное, молоко обезжиренное</td>\n",
" <td>белки 3 г, жиры 3,2 г, углеводы 4,7 г; 60 ккал</td>\n",
" <td>5 суток</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Наименование Вес Категория Подкатегория \\\n",
"id_tov \n",
"23 Молоко ЦЕЛЬНОЕ 1 л Молочная Продукция Молоко \n",
"81 Молоко 3,2% 1 л Молочная Продукция Молоко \n",
"109 Молоко топлёное, 500 г 500 г Молочная Продукция Молоко \n",
"1785 Молоко 2,5% 450 г Молочная Продукция Молоко \n",
"377 Молоко 3,2% в бутылке 900 мл Молочная Продукция Молоко \n",
"\n",
" Состав \\\n",
"id_tov \n",
"23 цельное молоко &nbsp; \n",
"81 молоко цельное, молоко обезжиренное \n",
"109 молоко нормализованное по содержанию жира \n",
"1785 цельное молоко, обезжиренное молоко \n",
"377 молоко цельное, молоко обезжиренное \n",
"\n",
" Пищевая ценность Срок годности \n",
"id_tov \n",
"23 белки не менее 3 г, жиры 3,5-4,2 г, углеводы 5... 5 суток \n",
"81 белки 3 г, жиры 3,2 г, углеводы 4,7 г; 60 ккал 5 суток \n",
"109 белки 3 г, жиры 4 г, углеводы 4,7; 67 ккал 6 суток \n",
"1785 белки 3 г, жиры 2,5 г, углеводы 4,7 г; 53 ккал 5 суток \n",
"377 белки 3 г, жиры 3,2 г, углеводы 4,7 г; 60 ккал 5 суток "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"meta.head()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:13.129750Z",
"start_time": "2019-04-18T20:43:13.126207Z"
}
},
"outputs": [],
"source": [
"# Для каждого товара будем считать фичи, и класть не в meta, чтобы случайно не потерять данные\n",
"new_meta = pd.DataFrame(index=meta.index)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Давайте предсказывать вероятность того, что человек купит товар X.\n",
"\n",
"Для этого мы можем разбить данные на [информация о товаре, купил/не купил]\n",
"\n",
"Проблема в том, что мы не знаем что пользователь НЕ купил. Но интуиция мне подсказывает, что если он не купил товары из категории \"рыба\" - рыбу он есть не будет.\n",
"\n",
"Конечно можно сделать и другие предположения. Я ограничусь рандомом."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Для простоты - первой фичей я достану срок годности. Вдруг зайдет?"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:14.226796Z",
"start_time": "2019-04-18T20:43:14.219906Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'1 год',\n",
" '1 год ',\n",
" '1 год ',\n",
" '1 год ',\n",
" '1 месяц',\n",
" '10 дней',\n",
" '10 месяцев',\n",
" '10 месяцев ',\n",
" '10 суток',\n",
" '10 суток ',\n",
" '10 суток ',\n",
" '11 месяцев',\n",
" '11 месяцев ',\n",
" '11 суток',\n",
" '12 месяцев',\n",
" '12 месяцев ',\n",
" '12 месяцев ',\n",
" '12 месяцев ',\n",
" '12 месяцев ',\n",
" '12 месяцев ',\n",
" '12 месяцев ',\n",
" '12 суток',\n",
" '12 суток ',\n",
" '12 суток ',\n",
" '120 суток',\n",
" '120 суток ',\n",
" '14 месяцев',\n",
" '14 суток',\n",
" '14 суток ',\n",
" '15 суток',\n",
" '15 суток ',\n",
" '15 суток ',\n",
" '15 суток ',\n",
" '150 суток',\n",
" '160 суток ',\n",
" '18 месяцев',\n",
" '18 месяцев ',\n",
" '18 суток',\n",
" '180 дней',\n",
" '180 суток',\n",
" '180 суток ',\n",
" '180 суток ',\n",
" '180 суток ',\n",
" '180 суток, после вскрытия 12 часов',\n",
" '2 год ',\n",
" '2 года',\n",
" '2 года ',\n",
" '2 года ',\n",
" '2 года ',\n",
" '2 года ',\n",
" '2 месяца',\n",
" '2 месяца ',\n",
" '20 месяцев',\n",
" '20 месяцев ',\n",
" '20 суток',\n",
" '20 суток ',\n",
" '20 суток ',\n",
" '20 суток ',\n",
" '20 суток ',\n",
" '20 суток Средняя цена за уп. 144 руб. (200 г) ',\n",
" '21 день',\n",
" '21 сутки',\n",
" '210 суток ',\n",
" '22 месяца ',\n",
" '24 месяца',\n",
" '24 месяца ',\n",
" '24 месяца ',\n",
" '24 месяца ',\n",
" '24 месяца ',\n",
" '24 месяца ',\n",
" '24 месяца ',\n",
" '24 месяцев',\n",
" '24 месяцев ',\n",
" '24 часа',\n",
" '240 суток',\n",
" '25 суток',\n",
" '25 суток ',\n",
" '25 суток Средняя цена за уп. 130 руб. (200 г) ',\n",
" '270 суток',\n",
" '270 суток ',\n",
" '3 суток ',\n",
" '3 года',\n",
" '3 года ',\n",
" '3 года ',\n",
" '3 года ',\n",
" '3 года ',\n",
" '3 или 5 суток (зависит от производителя) ',\n",
" '3 месяца',\n",
" '3 месяца ',\n",
" '3 месяца ',\n",
" '3 месяца ',\n",
" '3 суток',\n",
" '3 суток ',\n",
" '30 дней',\n",
" '30 месяцев',\n",
" '30 месяцев ',\n",
" '30 месяцев ',\n",
" '30 суток',\n",
" '30 суток ',\n",
" '30 суток ',\n",
" '30 суток ',\n",
" '30 суток ',\n",
" '30т суток',\n",
" '31 день',\n",
" '35 суток',\n",
" '36 месяцев ',\n",
" '36 месяцев',\n",
" '36 месяцев ',\n",
" '360 дней',\n",
" '360 суток',\n",
" '4 года',\n",
" '4 года ',\n",
" '4 года ',\n",
" '4 месяца',\n",
" '4 месяца ',\n",
" '4 месяца ',\n",
" '4 месяца ',\n",
" '4 суток',\n",
" '4 суток ',\n",
" '40 суток',\n",
" '40 суток ',\n",
" '40 суток ',\n",
" '42 месяца ',\n",
" '420 суток',\n",
" '45 суток',\n",
" '45 суток ',\n",
" '45 суток ',\n",
" '48 часов',\n",
" '48 часов ',\n",
" '5 лет',\n",
" '5 лет ',\n",
" '5 месяцев',\n",
" '5 месяцев ',\n",
" '5 суток',\n",
" '5 суток ',\n",
" '5 суток ',\n",
" '5 суток ',\n",
" '5 суток ',\n",
" '5 суток ',\n",
" '50 суток',\n",
" '50 суток ',\n",
" '6 месяцев ',\n",
" '6 месяцев',\n",
" '6 месяцев ',\n",
" '6 месяцев ',\n",
" '6 месяцев ',\n",
" '6 месяцев ',\n",
" '6 суток',\n",
" '6 суток ',\n",
" '6 суток ',\n",
" '6 суток ',\n",
" '60 суток',\n",
" '60 суток ',\n",
" '7 месяцев',\n",
" '7 суток',\n",
" '7 суток ',\n",
" '7 суток ',\n",
" '7 суток ',\n",
" '7 суток ',\n",
" '70 суток',\n",
" '72 часа',\n",
" '72 часа ',\n",
" '72 часа ',\n",
" '72 часа ',\n",
" '8 месяца ',\n",
" '8 месяцев',\n",
" '8 месяцев ',\n",
" '8 месяцев ',\n",
" '8 суток',\n",
" '8 суток ',\n",
" '844 дня ',\n",
" '8суток ',\n",
" '9 месяцев',\n",
" '9 месяцев ',\n",
" '9 месяцев ',\n",
" '9 месяцев ',\n",
" '9 месяцес',\n",
" '9 суток',\n",
" '9 суток ',\n",
" '90 дней',\n",
" '90 суток',\n",
" '90 суток ',\n",
" '96 часов',\n",
" nan,\n",
" 'Не ограничен ',\n",
" 'не ограничен',\n",
" 'не ограничен ',\n",
" 'не ограничен ',\n",
" 'не ограничен при соблюдении условий хранения'}"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Данные - полный треш, ну как обычно\n",
"# Самое противное что тут есть nan, нужно с этим разобраться\n",
"set(meta['Срок годности'])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:14.611200Z",
"start_time": "2019-04-18T20:43:14.608005Z"
}
},
"outputs": [],
"source": [
"# Regex - самая полезная штука при работе с текстами\n",
"# https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F\n",
"only_words = re.compile(r'[а-яА-Я]{1,}')\n",
"only_numbers = re.compile(r'[1-9]{1,}')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:14.975588Z",
"start_time": "2019-04-18T20:43:14.970026Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'',\n",
" 'Не ограничен',\n",
" 'год',\n",
" 'года',\n",
" 'день',\n",
" 'дней',\n",
" 'дня',\n",
" 'или суток зависит от производителя',\n",
" 'лет',\n",
" 'месяц',\n",
" 'месяца',\n",
" 'месяцев',\n",
" 'месяцес',\n",
" 'не ограничен',\n",
" 'не ограничен при соблюдении условий хранения',\n",
" 'сутки',\n",
" 'суток',\n",
" 'суток Средняя цена за уп руб г',\n",
" 'суток после вскрытия часов',\n",
" 'т суток',\n",
" 'часа',\n",
" 'часов'}"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"set([' '.join(only_words.findall(word)) if isinstance(word, str) else '' for word in set(meta['Срок годности'])])"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:15.303951Z",
"start_time": "2019-04-18T20:43:15.294905Z"
}
},
"outputs": [],
"source": [
"def parse_time(string):\n",
" \"\"\"Принимает на вход строку, возращает сутки\"\"\"\n",
" if not isinstance(string, str):\n",
" return 0\n",
" \n",
" elif 'ограничен' in string:\n",
" return -1\n",
" \n",
" else:\n",
" time = int(only_numbers.findall(string)[0])\n",
"\n",
" if 'лет' in string or 'год' in string:\n",
" return float(time * 365)\n",
"\n",
" elif 'месяц' in string:\n",
" return float(time * 30)\n",
"\n",
" elif 'сут' in string or 'день' in string or 'дней' in string or 'дня' in string:\n",
" return float(time)\n",
"\n",
" elif 'час' in string:\n",
" return float(time / 24)\n",
" else:\n",
" raise ValueError('Забыли про %s' % string)\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:15.617544Z",
"start_time": "2019-04-18T20:43:15.610043Z"
}
},
"outputs": [],
"source": [
"# Ура! Распарсили срок годности\n",
"new_meta['time'] = list(map(parse_time, meta['Срок годности']))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Теперь давайте возьмем и проставим каждому слову в составе свою цифту и посчитаем сколько раз эта цифра встречается у данного товара. А в данные положем первые 10 слов."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:16.267207Z",
"start_time": "2019-04-18T20:43:16.246218Z"
}
},
"outputs": [],
"source": [
"# Дальше токенизируем тексты и смотрим сколько раз слово употребляется в составе\n",
"texts = list(map(lambda text: ' '.join(only_words.findall(text) if isinstance(text, str) else ''), meta['Состав']))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:16.564714Z",
"start_time": "2019-04-18T20:43:16.553957Z"
}
},
"outputs": [],
"source": [
"all_words = set(' '.join(texts).split(' '))\n",
"tokens = {word: index for index, word in enumerate(all_words)}"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:16.879674Z",
"start_time": "2019-04-18T20:43:16.862025Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'': 0,\n",
" 'ная': 1,\n",
" 'крахмала': 2,\n",
" 'язык': 3,\n",
" 'казеинат': 4,\n",
" 'лососевая': 5,\n",
" 'любисток': 6,\n",
" 'спаржа': 7,\n",
" 'бумажное': 8,\n",
" 'бескостная': 9,\n",
" 'карбонат': 10,\n",
" 'первый': 11,\n",
" 'ароматизаторы': 12,\n",
" 'очистки': 13,\n",
" 'фосфорная': 14,\n",
" 'анчоусы': 15,\n",
" 'печень': 16,\n",
" 'кеты': 17,\n",
" 'Тегософт': 18,\n",
" 'Лаванда': 19,\n",
" 'хлопок': 20,\n",
" 'Апельсин': 21,\n",
" 'природных': 22,\n",
" 'кумин': 23,\n",
" 'хрустящие': 24,\n",
" 'дерева': 25,\n",
" 'нный': 26,\n",
" 'го': 27,\n",
" 'дистилляции': 28,\n",
" 'пастеризованный': 29,\n",
" 'горох': 30,\n",
" 'абрикоса': 31,\n",
" 'марлин': 32,\n",
" 'белковый': 33,\n",
" 'Груша': 34,\n",
" 'грибами': 35,\n",
" 'сладко': 36,\n",
" 'Тензиды': 37,\n",
" 'фруктовоягодный': 38,\n",
" 'перловая': 39,\n",
" 'поваренная': 40,\n",
" 'вареное': 41,\n",
" 'агент': 42,\n",
" 'глицирризинат': 43,\n",
" 'апельсина': 44,\n",
" 'мяса': 45,\n",
" 'мочевина': 46,\n",
" 'абрикосовой': 47,\n",
" 'мало': 48,\n",
" 'красное': 49,\n",
" 'капусты': 50,\n",
" 'фасоль': 51,\n",
" 'антиоксидант': 52,\n",
" 'св': 53,\n",
" 'клюквы': 54,\n",
" 'кукурузное': 55,\n",
" 'реологии': 56,\n",
" 'комплекс': 57,\n",
" 'малины': 58,\n",
" 'нутриоза': 59,\n",
" 'киноа': 60,\n",
" 'азиатской': 61,\n",
" 'санталовое': 62,\n",
" 'концентрированное': 63,\n",
" 'персики': 64,\n",
" 'йогуртовой': 65,\n",
" 'бадья': 66,\n",
" 'пребиотик': 67,\n",
" 'желтоперого': 68,\n",
" 'экосерт': 69,\n",
" 'расторопши': 70,\n",
" 'корень': 71,\n",
" 'б': 72,\n",
" 'гороха': 73,\n",
" 'продовольственная': 74,\n",
" 'це': 75,\n",
" 'восстановленный': 76,\n",
" 'Терияки': 77,\n",
" 'ядер': 78,\n",
" 'яичный': 79,\n",
" 'запеченное': 80,\n",
" 'соусе': 81,\n",
" 'перепелов': 82,\n",
" 'грецкие': 83,\n",
" 'курица': 84,\n",
" 'маринованная': 85,\n",
" 'шоколада': 86,\n",
" 'физалис': 87,\n",
" 'получен': 88,\n",
" 'каррагинан': 89,\n",
" 'печеные': 90,\n",
" 'наполнителя': 91,\n",
" 'биоразлогаемый': 92,\n",
" 'сумах': 93,\n",
" 'горячего': 94,\n",
" 'растворимых': 95,\n",
" 'пажитника': 96,\n",
" 'растворимые': 97,\n",
" 'фритюрное': 98,\n",
" 'вяленые': 99,\n",
" 'лаурилсульфосукцинат': 100,\n",
" 'морские': 101,\n",
" 'тонкий': 102,\n",
" 'кандеи': 103,\n",
" 'Виталь': 104,\n",
" 'гуаровая': 105,\n",
" 'белым': 106,\n",
" 'ный': 107,\n",
" 'яблоко': 108,\n",
" 'романо': 109,\n",
" 'пророщенный': 110,\n",
" 'петин': 111,\n",
" 'пектины': 112,\n",
" 'сол': 113,\n",
" 'ксилианс': 114,\n",
" 'лосьон': 115,\n",
" 'коллаген': 116,\n",
" 'грушевое': 117,\n",
" 'розмарин': 118,\n",
" 'перловые': 119,\n",
" 'изолят': 120,\n",
" 'эритритол': 121,\n",
" 'Облепиха': 122,\n",
" 'черной': 123,\n",
" 'сливочный': 124,\n",
" 'цукаты': 125,\n",
" 'многоштамовой': 126,\n",
" 'масле': 127,\n",
" 'сафлора': 128,\n",
" 'кальциевая': 129,\n",
" 'бентонитовая': 130,\n",
" 'бамбуковый': 131,\n",
" 'байхового': 132,\n",
" 'замачивая': 133,\n",
" 'ячменя': 134,\n",
" 'организмы': 135,\n",
" 'соединения': 136,\n",
" 'второго': 137,\n",
" 'разнотравье': 138,\n",
" 'алычи': 139,\n",
" 'Реджанито': 140,\n",
" 'модификатор': 141,\n",
" 'тензид': 142,\n",
" 'запеканки': 143,\n",
" 'томатная': 144,\n",
" 'бифидобактерии': 145,\n",
" 'древесный': 146,\n",
" 'Фунчоза': 147,\n",
" 'тушки': 148,\n",
" 'натуральному': 149,\n",
" 'шоколаде': 150,\n",
" 'орех': 151,\n",
" 'Зеленая': 152,\n",
" 'ягненок': 153,\n",
" 'пищевая': 154,\n",
" 'катионные': 155,\n",
" 'формальдегидам': 156,\n",
" 'Крестьянское': 157,\n",
" 'цедра': 158,\n",
" 'кислот': 159,\n",
" 'культурах': 160,\n",
" 'тунец': 161,\n",
" 'эвкалиптовое': 162,\n",
" 'гиалуронат': 163,\n",
" 'кристаллогидрата': 164,\n",
" 'свининой': 165,\n",
" 'комплексная': 166,\n",
" 'подсолнечное': 167,\n",
" 'колера': 168,\n",
" 'рдый': 169,\n",
" 'грибки': 170,\n",
" 'ши': 171,\n",
" 'морковь': 172,\n",
" 'лимонен': 173,\n",
" 'естественный': 174,\n",
" 'преимуществом': 175,\n",
" 'латекс': 176,\n",
" 'ные': 177,\n",
" 'крупнолистовой': 178,\n",
" 'майонез': 179,\n",
" 'гликоль': 180,\n",
" 'красная': 181,\n",
" 'ртывающий': 182,\n",
" 'препараты': 183,\n",
" 'кунжутное': 184,\n",
" 'увлажняющим': 185,\n",
" 'пшеничное': 186,\n",
" 'биоразлагающая': 187,\n",
" 'олеат': 188,\n",
" 'бархатцевое': 189,\n",
" 'горчичная': 190,\n",
" 'мальтозная': 191,\n",
" 'кондиционирующий': 192,\n",
" 'фризе': 193,\n",
" 'карбоксиметилцеллюлоза': 194,\n",
" 'Рекомендуется': 195,\n",
" 'Корн': 196,\n",
" 'халкидики': 197,\n",
" 'подготовленные': 198,\n",
" 'семена': 199,\n",
" 'семечек': 200,\n",
" 'бегентримониум': 201,\n",
" 'виноградной': 202,\n",
" 'эффективная': 203,\n",
" 'пахта': 204,\n",
" 'брусника': 205,\n",
" 'зубочистки': 206,\n",
" 'гуавы': 207,\n",
" 'греческий': 208,\n",
" 'бумага': 209,\n",
" 'кондиционер': 210,\n",
" 'зерненый': 211,\n",
" 'Арабики': 212,\n",
" 'растительным': 213,\n",
" 'молоты': 214,\n",
" 'симбиотической': 215,\n",
" 'Брюле': 216,\n",
" 'Крыжовник': 217,\n",
" 'пастернак': 218,\n",
" 'коксового': 219,\n",
" 'пропаренная': 220,\n",
" 'кинзы': 221,\n",
" 'сахаром': 222,\n",
" 'гребешка': 223,\n",
" 'абрикосы': 224,\n",
" 'основа': 225,\n",
" 'листа': 226,\n",
" 'Аланга': 227,\n",
" 'Геркулес': 228,\n",
" 'линалоол': 229,\n",
" 'блюссельская': 230,\n",
" 'тыквенные': 231,\n",
" 'каротин': 232,\n",
" 'бескостный': 233,\n",
" 'г': 234,\n",
" 'мак': 235,\n",
" 'куриных': 236,\n",
" 'цвет': 237,\n",
" 'элеутерококка': 238,\n",
" 'рябина': 239,\n",
" 'Кварк': 240,\n",
" 'без': 241,\n",
" 'молокосв': 242,\n",
" 'ультрапастеризованные': 243,\n",
" 'лаванда': 244,\n",
" 'собственном': 245,\n",
" 'клевера': 246,\n",
" 'крахмалы': 247,\n",
" 'сакская': 248,\n",
" 'оранжевая': 249,\n",
" 'зародышей': 250,\n",
" 'пассерованный': 251,\n",
" 'луговая': 252,\n",
" 'растительная': 253,\n",
" 'тв': 254,\n",
" 'чеддер': 255,\n",
" 'голубика': 256,\n",
" 'суперабсорбент': 257,\n",
" 'ржаного': 258,\n",
" 'Аква': 259,\n",
" 'марулы': 260,\n",
" 'нормализованное': 261,\n",
" 'шлифованное': 262,\n",
" 'краба': 263,\n",
" 'пригодная': 264,\n",
" 'куриный': 265,\n",
" 'аира': 266,\n",
" 'индейки': 267,\n",
" 'Ц': 268,\n",
" 'сандала': 269,\n",
" 'лактококки': 270,\n",
" 'НПАВ': 271,\n",
" 'душистого': 272,\n",
" 'мочевины': 273,\n",
" 'анионактивный': 274,\n",
" 'заквасочная': 275,\n",
" 'беломорская': 276,\n",
" 'французская': 277,\n",
" 'ананаса': 278,\n",
" 'специальной': 279,\n",
" 'каменного': 280,\n",
" 'Матриксил': 281,\n",
" 'содержание': 282,\n",
" 'М': 283,\n",
" 'Дисодиум': 284,\n",
" 'перилловое': 285,\n",
" 'целые': 286,\n",
" 'Мыло': 287,\n",
" 'л': 288,\n",
" 'продукция': 289,\n",
" 'винограда': 290,\n",
" 'негазированная': 291,\n",
" 'измельч': 292,\n",
" 'желтоперый': 293,\n",
" 'воздушная': 294,\n",
" 'вида': 295,\n",
" 'агента': 296,\n",
" 'суповой': 297,\n",
" 'ваниль': 298,\n",
" 'изготовлено': 299,\n",
" 'информация': 300,\n",
" 'тутовый': 301,\n",
" 'цельнозерновая': 302,\n",
" 'творог': 303,\n",
" 'кобылье': 304,\n",
" 'земляники': 305,\n",
" 'низко': 306,\n",
" 'изготавливается': 307,\n",
" 'кабачок': 308,\n",
" 'кальций': 309,\n",
" 'котлета': 310,\n",
" 'пилати': 311,\n",
" 'глина': 312,\n",
" 'цветков': 313,\n",
" 'быстрозамороженная': 314,\n",
" 'березовый': 315,\n",
" 'стрептококка': 316,\n",
" 'цыпленка': 317,\n",
" 'стружка': 318,\n",
" 'пивоваренный': 319,\n",
" 'лимонное': 320,\n",
" 'апельсинов': 321,\n",
" 'вешенки': 322,\n",
" 'тыквенными': 323,\n",
" 'биотин': 324,\n",
" 'лимон': 325,\n",
" 'продуктами': 326,\n",
" 'черешня': 327,\n",
" 'шалфея': 328,\n",
" 'пресервы': 329,\n",
" 'эстрагона': 330,\n",
" 'стартовая': 331,\n",
" 'кориандра': 332,\n",
" 'натурального': 333,\n",
" 'ной': 334,\n",
" 'жареное': 335,\n",
" 'шпик': 336,\n",
" 'кешью': 337,\n",
" 'оливковое': 338,\n",
" 'галанга': 339,\n",
" 'Ши': 340,\n",
" 'эмолент': 341,\n",
" 'европейский': 342,\n",
" 'протеины': 343,\n",
" 'дыня': 344,\n",
" 'клеток': 345,\n",
" 'полученный': 346,\n",
" 'гидрокарбонат': 347,\n",
" 'говяжий': 348,\n",
" 'лауроил': 349,\n",
" 'мед': 350,\n",
" 'обезжиренный': 351,\n",
" 'дезодорированное': 352,\n",
" 'бакконцентрат': 353,\n",
" 'кактус': 354,\n",
" 'головы': 355,\n",
" 'качестве': 356,\n",
" 'токоферол': 357,\n",
" 'нарезанные': 358,\n",
" 'Миндальное': 359,\n",
" 'сетка': 360,\n",
" 'мономер': 361,\n",
" 'коричневое': 362,\n",
" 'кишмиш': 363,\n",
" 'содержанию': 364,\n",
" 'Сэнсофт': 365,\n",
" 'Израиль': 366,\n",
" 'свиное': 367,\n",
" 'обезжиренного': 368,\n",
" 'рожок': 369,\n",
" 'ржаные': 370,\n",
" 'пачули': 371,\n",
" 'бланшированный': 372,\n",
" 'печенный': 373,\n",
" 'эфирные': 374,\n",
" 'помидор': 375,\n",
" 'вяленый': 376,\n",
" 'поваренной': 377,\n",
" 'абразивный': 378,\n",
" 'белых': 379,\n",
" 'тарелочная': 380,\n",
" 'капли': 381,\n",
" 'продукта': 382,\n",
" 'лимонный': 383,\n",
" 'клубни': 384,\n",
" 'Глицерин': 385,\n",
" 'пророщенные': 386,\n",
" 'корневища': 387,\n",
" 'россо': 388,\n",
" 'Экосерт': 389,\n",
" 'Арабика': 390,\n",
" 'чистые': 391,\n",
" 'но': 392,\n",
" 'крупка': 393,\n",
" 'водорослей': 394,\n",
" 'нетканый': 395,\n",
" 'артезианская': 396,\n",
" 'вакамэ': 397,\n",
" 'арабика': 398,\n",
" 'части': 399,\n",
" 'хвоща': 400,\n",
" 'нное': 401,\n",
" 'рапсового': 402,\n",
" 'подсолнечный': 403,\n",
" 'бензиловый': 404,\n",
" 'буженина': 405,\n",
" 'диглицериды': 406,\n",
" 'хлопковое': 407,\n",
" 'пшеничной': 408,\n",
" 'варено': 409,\n",
" 'цинка': 410,\n",
" 'композиция': 411,\n",
" 'регулятор': 412,\n",
" 'клеевое': 413,\n",
" 'ретинол': 414,\n",
" 'ананас': 415,\n",
" 'малояр': 416,\n",
" 'пресованные': 417,\n",
" 'земляника': 418,\n",
" 'разнотравный': 419,\n",
" 'тела': 420,\n",
" 'козье': 421,\n",
" 'Восточный': 422,\n",
" 'древесина': 423,\n",
" 'клюквенный': 424,\n",
" 'литья': 425,\n",
" 'производства': 426,\n",
" 'меняться': 427,\n",
" 'чернослив': 428,\n",
" 'декорирован': 429,\n",
" 'сухие': 430,\n",
" 'кукурузный': 431,\n",
" 'губка': 432,\n",
" 'ментол': 433,\n",
" 'ангидроксилитол': 434,\n",
" 'соленое': 435,\n",
" 'телятина': 436,\n",
" 'двууглекислый': 437,\n",
" 'з': 438,\n",
" 'редис': 439,\n",
" 'хумус': 440,\n",
" 'соус': 441,\n",
" 'фитиновая': 442,\n",
" 'мясопродукты': 443,\n",
" 'иловая': 444,\n",
" 'капсантин': 445,\n",
" 'кунжутная': 446,\n",
" 'икры': 447,\n",
" 'глицерина': 448,\n",
" 'меди': 449,\n",
" 'химозин': 450,\n",
" 'гидрокарбанат': 451,\n",
" 'тапиока': 452,\n",
" 'быстрозамороженных': 453,\n",
" 'розмарина': 454,\n",
" 'живых': 455,\n",
" 'йогуртная': 456,\n",
" 'гель': 457,\n",
" 'кальмар': 458,\n",
" 'кефирных': 459,\n",
" 'мидий': 460,\n",
" 'фермента': 461,\n",
" 'хлебопекарной': 462,\n",
" 'пальмарозы': 463,\n",
" 'натуральное': 464,\n",
" 'голозерного': 465,\n",
" 'качества': 466,\n",
" 'более': 467,\n",
" 'изделий': 468,\n",
" 'сахарного': 469,\n",
" 'тростниковая': 470,\n",
" 'возобновляемого': 471,\n",
" 'содержанием': 472,\n",
" 'слабосоленый': 473,\n",
" 'самосквашенное': 474,\n",
" 'конского': 475,\n",
" 'тмина': 476,\n",
" 'Чернослив': 477,\n",
" 'октил': 478,\n",
" 'аргинин': 479,\n",
" 'рубленый': 480,\n",
" 'свиная': 481,\n",
" 'отрубей': 482,\n",
" 'происхождения': 483,\n",
" 'семян': 484,\n",
" 'мускатного': 485,\n",
" 'перечной': 486,\n",
" 'корпус': 487,\n",
" 'рная': 488,\n",
" 'СГ': 489,\n",
" 'Ассорти': 490,\n",
" 'провитамин': 491,\n",
" 'сушеных': 492,\n",
" 'миндальная': 493,\n",
" 'говяжья': 494,\n",
" 'овсяной': 495,\n",
" 'мюсли': 496,\n",
" 'вкусоароматическая': 497,\n",
" 'цезарь': 498,\n",
" 'куриной': 499,\n",
" 'аква': 500,\n",
" 'выращенного': 501,\n",
" 'топинамбура': 502,\n",
" 'инжир': 503,\n",
" 'яичные': 504,\n",
" 'сыро': 505,\n",
" 'сельдь': 506,\n",
" 'перец': 507,\n",
" 'жожоба': 508,\n",
" 'отбеливатель': 509,\n",
" 'Клубника': 510,\n",
" 'скрабирующие': 511,\n",
" 'до': 512,\n",
" 'чабреца': 513,\n",
" 'плантациях': 514,\n",
" 'болгарскую': 515,\n",
" 'цетеариловый': 516,\n",
" 'Кеймак': 517,\n",
" 'цитрусовые': 518,\n",
" 'бедра': 519,\n",
" 'банановое': 520,\n",
" 'уксус': 521,\n",
" 'молочные': 522,\n",
" 'барабулька': 523,\n",
" 'белки': 524,\n",
" 'сиропе': 525,\n",
" 'оксобиоразлогаемые': 526,\n",
" 'бутиленгликоль': 527,\n",
" 'тензиды': 528,\n",
" 'мезофильная': 529,\n",
" 'молочка': 530,\n",
" 'сахарна': 531,\n",
" 'ванилин': 532,\n",
" 'грецких': 533,\n",
" 'зира': 534,\n",
" 'ж': 535,\n",
" 'чайный': 536,\n",
" 'финик': 537,\n",
" 'зел': 538,\n",
" 'микрозелень': 539,\n",
" 'стручковый': 540,\n",
" 'рассол': 541,\n",
" 'кубики': 542,\n",
" 'топленое': 543,\n",
" 'лимонника': 544,\n",
" 'шпинат': 545,\n",
" 'специально': 546,\n",
" 'кокосового': 547,\n",
" 'сушеное': 548,\n",
" 'обработанный': 549,\n",
" 'ное': 550,\n",
" 'белыми': 551,\n",
" 'дистеарат': 552,\n",
" 'маринаде': 553,\n",
" 'листья': 554,\n",
" 'зеленый': 555,\n",
" 'хлопья': 556,\n",
" 'тертое': 557,\n",
" 'печ': 558,\n",
" 'горечавки': 559,\n",
" 'охлажденный': 560,\n",
" 'маракуйи': 561,\n",
" 'кремния': 562,\n",
" 'панировочные': 563,\n",
" 'ванильный': 564,\n",
" 'крестьянское': 565,\n",
" 'биотехнологий': 566,\n",
" 'лицетин': 567,\n",
" 'цитронеллы': 568,\n",
" 'хрен': 569,\n",
" 'копчения': 570,\n",
" 'колер': 571,\n",
" 'премикс': 572,\n",
" 'волокно': 573,\n",
" 'фруктовой': 574,\n",
" 'Медовый': 575,\n",
" 'пеногаситель': 576,\n",
" 'обезжиренное': 577,\n",
" 'яиц': 578,\n",
" 'тушка': 579,\n",
" 'пшеничного': 580,\n",
" 'кальцинированная': 581,\n",
" 'пассерованные': 582,\n",
" 'пребиотики': 583,\n",
" 'песка': 584,\n",
" 'природная': 585,\n",
" 'пальмы': 586,\n",
" 'донник': 587,\n",
" 'ГМО': 588,\n",
" 'мякоти': 589,\n",
" 'черника': 590,\n",
" 'содержит': 591,\n",
" 'сыворотка': 592,\n",
" 'лосось': 593,\n",
" 'мякоть': 594,\n",
" 'свежемороженая': 595,\n",
" 'столовый': 596,\n",
" 'пассерованная': 597,\n",
" 'календулы': 598,\n",
" 'цуккини': 599,\n",
" 'пластик': 600,\n",
" 'лимонного': 601,\n",
" 'изюм': 602,\n",
" 'нероли': 603,\n",
" 'стик': 604,\n",
" 'благородная': 605,\n",
" 'перед': 606,\n",
" 'Цетиол': 607,\n",
" 'пропитывающий': 608,\n",
" 'цельная': 609,\n",
" 'замороженного': 610,\n",
" 'косметическое': 611,\n",
" 'мандарина': 612,\n",
" 'чабрец': 613,\n",
" 'таволга': 614,\n",
" 'перцев': 615,\n",
" 'сладкая': 616,\n",
" 'конгрио': 617,\n",
" 'хлебопекарная': 618,\n",
" 'Традиционное': 619,\n",
" 'полиэтилентерефталат': 620,\n",
" 'процессе': 621,\n",
" 'обжаренные': 622,\n",
" 'Изготовлено': 623,\n",
" 'бегетримониум': 624,\n",
" 'грубого': 625,\n",
" 'ПА': 626,\n",
" 'меджул': 627,\n",
" 'ионы': 628,\n",
" 'черносмородиновое': 629,\n",
" 'биоразлагаемая': 630,\n",
" 'вторая': 631,\n",
" 'лук': 632,\n",
" 'окисления': 633,\n",
" 'розовое': 634,\n",
" 'миндальных': 635,\n",
" 'Феттуччини': 636,\n",
" 'Фактическое': 637,\n",
" 'очищающими': 638,\n",
" 'ветиверовое': 639,\n",
" 'стевии': 640,\n",
" 'инстантные': 641,\n",
" 'для': 642,\n",
" 'полутвердый': 643,\n",
" 'коровьего': 644,\n",
" 'Моцарелла': 645,\n",
" 'свежемороженый': 646,\n",
" 'бедро': 647,\n",
" 'силика': 648,\n",
" 'курдюк': 649,\n",
" 'желатин': 650,\n",
" 'сом': 651,\n",
" 'желток': 652,\n",
" 'гигантского': 653,\n",
" 'отделку': 654,\n",
" 'персика': 655,\n",
" 'высокожирные': 656,\n",
" 'острый': 657,\n",
" 'каротином': 658,\n",
" 'пудра': 659,\n",
" 'свиной': 660,\n",
" 'кукурузного': 661,\n",
" 'Ваниль': 662,\n",
" 'ежевичный': 663,\n",
" 'рен': 664,\n",
" 'увлажняющий': 665,\n",
" 'сахарный': 666,\n",
" 'креветки': 667,\n",
" 'аниса': 668,\n",
" 'рапсовое': 669,\n",
" 'термофильные': 670,\n",
" 'копченые': 671,\n",
" 'ионами': 672,\n",
" 'термофильных': 673,\n",
" 'сырые': 674,\n",
" 'кедровый': 675,\n",
" 'компоненты': 676,\n",
" 'бактериями': 677,\n",
" 'капрамидопропил': 678,\n",
" 'каприлгидроксаминовая': 679,\n",
" 'децилглюкозид': 680,\n",
" 'чистый': 681,\n",
" 'сингапурски': 682,\n",
" 'уцхо': 683,\n",
" 'влажность': 684,\n",
" 'кориандр': 685,\n",
" 'свекольный': 686,\n",
" 'болгарская': 687,\n",
" 'высокогорных': 688,\n",
" 'облепиха': 689,\n",
" 'отварное': 690,\n",
" 'крупа': 691,\n",
" 'кролик': 692,\n",
" 'говядины': 693,\n",
" 'сывороточный': 694,\n",
" 'щавель': 695,\n",
" 'свежие': 696,\n",
" 'перламутровый': 697,\n",
" 'пищевыми': 698,\n",
" 'базе': 699,\n",
" 'обогащенная': 700,\n",
" 'фисташки': 701,\n",
" 'Янтарь': 702,\n",
" 'бройлер': 703,\n",
" 'можжевеловые': 704,\n",
" 'Йод': 705,\n",
" 'батат': 706,\n",
" 'листовой': 707,\n",
" 'сырокопченые': 708,\n",
" 'маш': 709,\n",
" 'сахарная': 710,\n",
" 'сахар': 711,\n",
" 'рисового': 712,\n",
" 'Шаромикс': 713,\n",
" 'кета': 714,\n",
" 'касторовое': 715,\n",
" 'кислота': 716,\n",
" 'чистая': 717,\n",
" 'жиронепроницаемая': 718,\n",
" 'никотинамид': 719,\n",
" 'ретинолпальмитат': 720,\n",
" 'аскорбилфосфат': 721,\n",
" 'систем': 722,\n",
" 'грудка': 723,\n",
" 'Вишня': 724,\n",
" 'очищенные': 725,\n",
" 'байховый': 726,\n",
" 'уплотнителя': 727,\n",
" 'жирных': 728,\n",
" 'разрыхлители': 729,\n",
" 'измельченные': 730,\n",
" 'начинки': 731,\n",
" 'лапша': 732,\n",
" 'ореховый': 733,\n",
" 'семя': 734,\n",
" 'ацидофильные': 735,\n",
" 'шафран': 736,\n",
" 'марганца': 737,\n",
" 'моно': 738,\n",
" 'штирийской': 739,\n",
" 'плодовый': 740,\n",
" 'сырой': 741,\n",
" 'мойвы': 742,\n",
" 'Радичио': 743,\n",
" 'мышечные': 744,\n",
" 'отвердитель': 745,\n",
" 'пальма': 746,\n",
" 'песто': 747,\n",
" 'молотое': 748,\n",
" 'сои': 749,\n",
" 'тихоокеанский': 750,\n",
" 'аналог': 751,\n",
" 'растопленный': 752,\n",
" 'коровье': 753,\n",
" 'гиалуроновая': 754,\n",
" 'прямого': 755,\n",
" 'и': 756,\n",
" 'минеральная': 757,\n",
" 'или': 758,\n",
" 'трав': 759,\n",
" 'олеин': 760,\n",
" 'Черный': 761,\n",
" 'питьевя': 762,\n",
" 'шпинатный': 763,\n",
" 'продукты': 764,\n",
" 'натуральной': 765,\n",
" 'ферментный': 766,\n",
" 'плесени': 767,\n",
" 'рапаны': 768,\n",
" 'сырец': 769,\n",
" 'ренин': 770,\n",
" 'фрикадельки': 771,\n",
" 'Дзадзики': 772,\n",
" 'травы': 773,\n",
" 'помадка': 774,\n",
" 'глицерофосфат': 775,\n",
" 'подсолнечника': 776,\n",
" 'кондиционирующая': 777,\n",
" 'блестящий': 778,\n",
" 'Ундария': 779,\n",
" 'сахорозаменитель': 780,\n",
" 'ртое': 781,\n",
" 'вафельный': 782,\n",
" 'соли': 783,\n",
" 'регулятора': 784,\n",
" 'сортов': 785,\n",
" 'макаронные': 786,\n",
" 'нетканный': 787,\n",
" 'асаи': 788,\n",
" 'черноморской': 789,\n",
" 'жгучий': 790,\n",
" 'первичная': 791,\n",
" 'питьевая': 792,\n",
" 'дробл': 793,\n",
" 'чистых': 794,\n",
" 'остаток': 795,\n",
" 'частицы': 796,\n",
" 'гвоздика': 797,\n",
" 'Мята': 798,\n",
" 'колотая': 799,\n",
" 'мезофильные': 800,\n",
" 'целая': 801,\n",
" 'распушенная': 802,\n",
" 'омыленные': 803,\n",
" 'тыквенный': 804,\n",
" 'иван': 805,\n",
" 'цветы': 806,\n",
" 'источника': 807,\n",
" 'смородины': 808,\n",
" 'бактерий': 809,\n",
" 'ячменные': 810,\n",
" 'воскообразное': 811,\n",
" 'гуарана': 812,\n",
" 'щупальца': 813,\n",
" 'незначительно': 814,\n",
" 'хлебопекарные': 815,\n",
" 'охлажд': 816,\n",
" 'магнолол': 817,\n",
" 'свежезаморженая': 818,\n",
" 'моркови': 819,\n",
" 'дуба': 820,\n",
" 'люпин': 821,\n",
" 'действующего': 822,\n",
" 'груша': 823,\n",
" 'рисовые': 824,\n",
" 'пшеница': 825,\n",
" 'шлифованная': 826,\n",
" 'корн': 827,\n",
" 'зверобоя': 828,\n",
" 'пальмоядровых': 829,\n",
" 'сливочная': 830,\n",
" 'масла': 831,\n",
" 'отборный': 832,\n",
" 'белокочанная': 833,\n",
" 'уксусными': 834,\n",
" 'злаков': 835,\n",
" 'грибной': 836,\n",
" 'пальмовое': 837,\n",
" 'биточек': 838,\n",
" 'кубиками': 839,\n",
" 'белой': 840,\n",
" 'лактаза': 841,\n",
" 'зелень': 842,\n",
" 'меда': 843,\n",
" 'утки': 844,\n",
" 'титана': 845,\n",
" 'кипариса': 846,\n",
" 'шоколад': 847,\n",
" 'хлора': 848,\n",
" 'ячменного': 849,\n",
" 'окорок': 850,\n",
" 'пшеничные': 851,\n",
" 'пастернака': 852,\n",
" 'бадьян': 853,\n",
" 'аронии': 854,\n",
" 'свинина': 855,\n",
" 'кокосовой': 856,\n",
" 'порошок': 857,\n",
" 'коричневый': 858,\n",
" 'куркума': 859,\n",
" 'охотничьи': 860,\n",
" 'лопаточный': 861,\n",
" 'сахара': 862,\n",
" 'кипрей': 863,\n",
" 'черники': 864,\n",
" 'кунжута': 865,\n",
" 'можжевельника': 866,\n",
" 'мацис': 867,\n",
" 'молочко': 868,\n",
" 'ферментированный': 869,\n",
" 'малина': 870,\n",
" 'фундучно': 871,\n",
" 'напитка': 872,\n",
" 'пшено': 873,\n",
" 'воздушный': 874,\n",
" 'улиток': 875,\n",
" 'гидрированный': 876,\n",
" 'пальмового': 877,\n",
" 'крушина': 878,\n",
" 'изомальт': 879,\n",
" 'коричневого': 880,\n",
" 'манная': 881,\n",
" 'литсеи': 882,\n",
" 'вид': 883,\n",
" 'морковные': 884,\n",
" 'лизоцим': 885,\n",
" 'светлого': 886,\n",
" 'гриле': 887,\n",
" 'губ': 888,\n",
" 'кинза': 889,\n",
" 'Манго': 890,\n",
" 'картофельное': 891,\n",
" 'вкусоароматические': 892,\n",
" 'молокосвертыващий': 893,\n",
" 'обжаренных': 894,\n",
" 'рафиниро': 895,\n",
" 'цыпленок': 896,\n",
" 'лемонграсс': 897,\n",
" 'свинины': 898,\n",
" 'линалол': 899,\n",
" 'гуся': 900,\n",
" 'белого': 901,\n",
" 'фолиевая': 902,\n",
" 'камчатского': 903,\n",
" 'вареная': 904,\n",
" 'гороше': 905,\n",
" 'использованием': 906,\n",
" 'Греческая': 907,\n",
" 'турецкий': 908,\n",
" 'а': 909,\n",
" 'порошка': 910,\n",
" 'полбы': 911,\n",
" 'технологические': 912,\n",
" 'изолированный': 913,\n",
" 'гвоздики': 914,\n",
" 'сорта': 915,\n",
" 'петрушки': 916,\n",
" 'целлюлозы': 917,\n",
" 'подсолнечном': 918,\n",
" 'ржаная': 919,\n",
" 'полба': 920,\n",
" 'сорбиновая': 921,\n",
" 'алкоголя': 922,\n",
" 'семга': 923,\n",
" 'тихоокеанская': 924,\n",
" 'грудки': 925,\n",
" 'лый': 926,\n",
" 'изготовлен': 927,\n",
" 'цветки': 928,\n",
" 'креп': 929,\n",
" 'шинкованная': 930,\n",
" 'корки': 931,\n",
" 'мидии': 932,\n",
" 'палочек': 933,\n",
" 'маринад': 934,\n",
" 'биондо': 935,\n",
" 'сайра': 936,\n",
" 'вишневый': 937,\n",
" 'разделанной': 938,\n",
" 'растений': 939,\n",
" 'ТэгоСофт': 940,\n",
" 'пророщенная': 941,\n",
" 'тофу': 942,\n",
" 'кутикулы': 943,\n",
" 'гранатовый': 944,\n",
" 'сосны': 945,\n",
" 'йогурт': 946,\n",
" 'цветочный': 947,\n",
" 'постные': 948,\n",
" 'марки': 949,\n",
" 'лова': 950,\n",
" 'зернистая': 951,\n",
" 'Дехикварт': 952,\n",
" 'низового': 953,\n",
" 'кочанчики': 954,\n",
" 'глюкозы': 955,\n",
" 'кармин': 956,\n",
" 'птитим': 957,\n",
" 'производство': 958,\n",
" 'кожуры': 959,\n",
" 'сыр': 960,\n",
" 'миндаль': 961,\n",
" 'водой': 962,\n",
" 'напиток': 963,\n",
" 'концентрат': 964,\n",
" 'натриевая': 965,\n",
" 'корок': 966,\n",
" 'обжаренная': 967,\n",
" 'замутнитель': 968,\n",
" 'Листья': 969,\n",
" 'пихтовое': 970,\n",
" 'хлеба': 971,\n",
" 'Д': 972,\n",
" 'п': 973,\n",
" 'форель': 974,\n",
" 'шишки': 975,\n",
" 'СС': 976,\n",
" 'Масло': 977,\n",
" 'кутина': 978,\n",
" 'сахаринат': 979,\n",
" 'лактобактерий': 980,\n",
" 'ментил': 981,\n",
" 'может': 982,\n",
" 'натриевые': 983,\n",
" 'мини': 984,\n",
" 'декофеинизированная': 985,\n",
" 'сока': 986,\n",
" 'брожения': 987,\n",
" 'метил': 988,\n",
" 'термостабилизирующие': 989,\n",
" 'влагоудерживающее': 990,\n",
" 'гидрированная': 991,\n",
" 'цельнолистовой': 992,\n",
" 'халапеньо': 993,\n",
" 'крымская': 994,\n",
" 'кокосовых': 995,\n",
" 'ароматический': 996,\n",
" 'капроилметилглюкамид': 997,\n",
" 'кардамона': 998,\n",
" 'замороженные': 999,\n",
" ...}"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Вот эти цифры для каждого слова\n",
"tokens"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:20.676695Z",
"start_time": "2019-04-18T20:43:17.246316Z"
}
},
"outputs": [],
"source": [
"# Сюда положем количество этого слова в данном составе\n",
"features = defaultdict(lambda: [])\n",
"\n",
"for text in texts:\n",
" for word in tokens:\n",
" features[tokens[word]].append(text.count(word))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:20.725899Z",
"start_time": "2019-04-18T20:43:20.679796Z"
}
},
"outputs": [],
"source": [
"# Оставим только топ 3 слова\n",
"most_common_words = [i[0] for i in Counter({key: sum(features[key]) for key in features}).most_common(3)]"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:20.741624Z",
"start_time": "2019-04-18T20:43:20.727930Z"
}
},
"outputs": [],
"source": [
"for key in features:\n",
" if key in most_common_words:\n",
" new_meta['word_%s' % key] = features[key]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:20.755871Z",
"start_time": "2019-04-18T20:43:20.743685Z"
}
},
"outputs": [],
"source": [
"all_buys = ' '.join(list(train['items']))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:32.906908Z",
"start_time": "2019-04-18T20:43:20.757927Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 2071/2071 [00:12<00:00, 170.59it/s]\n"
]
}
],
"source": [
"# Теперь посчитаем частоту упоминания этого товара\n",
"# Может люди покупают одно и тоже\n",
"new_meta['count'] = [all_buys.count(str(i)) for i in tqdm(new_meta.index)]"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:33.057640Z",
"start_time": "2019-04-18T20:43:32.909406Z"
}
},
"outputs": [],
"source": [
"new_meta_dict = new_meta.T.to_dict('list')"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:33.062705Z",
"start_time": "2019-04-18T20:43:33.059830Z"
}
},
"outputs": [],
"source": [
"all_tovs = set(new_meta.index)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:33.068820Z",
"start_time": "2019-04-18T20:43:33.064658Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"{4, 5, 6}"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# hint1\n",
"set([1,2,3]) ^ set([1,2,3,4,5,6])"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:33.074317Z",
"start_time": "2019-04-18T20:43:33.070657Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[1, 2, 3, 4, 5, 6]"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# hint2\n",
"[*[1,2,3], 4,5,6]"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:33.080049Z",
"start_time": "2019-04-18T20:43:33.076294Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[4, 3]"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# hint3\n",
"sample([1,2,3,4], 2)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:43:49.000712Z",
"start_time": "2019-04-18T20:43:33.082372Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 65950/65950 [00:15<00:00, 4144.86it/s]\n"
]
}
],
"source": [
"new_dataset = []\n",
"\n",
"for index,row in tqdm(train.iterrows(), total=len(train)):\n",
" \n",
" # То что он купил\n",
" id_tovs = list(map(int, row[0].split()))\n",
" \n",
" # То что он не купил *hint1\n",
" # sample - это рандомное разделение данн\n",
" not_tov = list(set(id_tovs) ^ all_tovs)\n",
" \n",
" # Тут я взял рандомные товаров, которые чувак не купил в том же количестве что и купил\n",
" # По хорошему тут нужно провернуть тот хинт с рыбой, который я описал выше\n",
" # hint3\n",
" for id_tov in sample(not_tov, len(id_tovs)):\n",
" # Для каждого товара купленного пользователем - достанем его фичи и проставим 1\n",
" # Это будет означать что он купил эти товары *hint2\n",
" new_dataset.append([index, *new_meta_dict[id_tov], 1])\n",
" \n",
" for id_tov in sample(not_tov, len(id_tovs)):\n",
" # Для каждого товара купленного пользователем - достанем его фичи и проставим 0\n",
" # Это будет означать что он не купил эти товары *hint2\n",
" new_dataset.append([index, *new_meta_dict[id_tov], 0])"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T20:44:56.554388Z",
"start_time": "2019-04-18T20:44:54.877182Z"
}
},
"outputs": [],
"source": [
"new_dataset = pd.DataFrame(new_dataset, columns=['buyer', *['word_%s' % key for key in range(4)], 'count', 'answer'])"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T21:25:00.073091Z",
"start_time": "2019-04-18T21:25:00.068127Z"
}
},
"outputs": [],
"source": [
"model = LogisticRegression(max_iter=1000)"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T21:25:11.494832Z",
"start_time": "2019-04-18T21:25:00.462223Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
" intercept_scaling=1, max_iter=1000, multi_class='ovr', n_jobs=1,\n",
" penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
" verbose=0, warm_start=False)"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/anaconda3/lib/python3.7/site-packages/sklearn/linear_model/sag.py:326: ConvergenceWarning: The max_iter was reached which means the coef_ did not converge\n",
" \"the coef_ did not converge\", ConvergenceWarning)\n"
]
}
],
"source": [
"model.fit(new_dataset[new_dataset.columns.difference(['answer'])], new_dataset['answer'])"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-19T17:49:09.416288Z",
"start_time": "2019-04-19T17:49:09.317791Z"
}
},
"outputs": [],
"source": [
"items = new_meta_dict.items()\n",
"values = [i[1] for i in items]\n",
"keys = [i[0] for i in items]"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T21:20:55.107701Z",
"start_time": "2019-04-18T21:12:55.788000Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 65950/65950 [07:59<00:00, 137.60it/s]\n"
]
}
],
"source": [
"submission = []\n",
"\n",
"#\n",
"# Если у вас много оперативной памяти - то лучше засуньте\n",
"# Все фичи в 1 список и сделайте predict 1 раз\n",
"# Это значительно ускорит процесс\n",
"# Ещё можно узнать какие продукты точно не покупают и вообще не добавлять их\n",
"#\n",
"\n",
"# Для каждого человека\n",
"for person in tqdm(train.index):\n",
" # возьмем все товары\n",
" to_train = [[person, *val] for val in values]\n",
" \n",
" # предскажем купит он их или нет\n",
" predicted = model.predict(to_train)\n",
" \n",
" # отсортируем и возьмем первые 100\n",
" person_answer = list(sorted([[pr, it] for it, pr in zip(keys, predicted)]))[100:]\n",
" \n",
" # добавим в итоговое решение\n",
" submission.append(' '.join([str(i[1]) for i in person_answer]))"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T21:21:09.328873Z",
"start_time": "2019-04-18T21:20:55.110340Z"
}
},
"outputs": [],
"source": [
"# Внимание - выходной файл будет размером в 700мб\n",
"# Это можно загрузить в кагл, но лучше загрузить zip файл\n",
"# Он будет весить 5мб\n",
"\n",
"name = 'submission-%s.csv' % datetime.now()\n",
"answer = pd.DataFrame(index = train.index)\n",
"answer.index.names = ['buyer']\n",
"answer['items'] = submission\n",
"answer.to_csv(name)"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {
"ExecuteTime": {
"end_time": "2019-04-18T21:21:19.500337Z",
"start_time": "2019-04-18T21:21:09.334012Z"
}
},
"outputs": [],
"source": [
"zip_obj = ZipFile(\"%s.zip\" % name, 'w', ZIP_DEFLATED)\n",
"zip_obj.write(name, os.path.basename(name))\n",
"zip_obj.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Что дальше?\n",
"\n",
"Скорее всего будут заходить фичи связанные с текстом. Например люди покупают такое же по составу или что-то, что не содержит белков. Мы надеемся что вы найдете хорошие фичи и ваша рекомендательная система будет работать во вкусвилле. Удачи!"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment