<h5></h5>
<h5>Github: <a href="https://github.com/yjfiejd/Product_search_relevance_NLP-/blob/master/product_search_relevance_advanced.ipynb">https://github.com/yjfiejd/Product_search_relevance_NLP-/blob/master/product_search_relevance_advanced.ipynb</a> (可查看jupyter notebook)</h5>
<ul><li>基础篇与进阶篇最大的区别:特征提取的方式不同</li></ul>
<ul><li>基础篇中特征的提取太粗糙:1)关键字常长度 2)用搜索词中的单词在产品title、产品介绍中出现的次数来衡量</li><li>进阶篇的特征提取:采用了3中方法,在原有文本上共提取出了6个新的特征</li></ul>
<ol><li>Levenshtein : 用来计算字符串之间的距离 -> 2个新特征 -> 搜索词句子与产品title,搜索词与产品描述直接的距离</li><li>TF-idf构造特征: -> 2个新特征
<ol><li>新建all_text列(放入product_title+product_description,组合为一条句子)<br></li><li>把all_text列中每一个格子的句子拆分为单词(gensim.utils库中的Tokenize) -> 包含221877单词的大字典 -> 语料库用iterator实现,用class来实现<br></li><li>得到标准形式的语料库 TfidModel(corpus)<br></li><li>用MatrixSimilarity计算相似度,计算两条句子的相似度 -> 增加两个特征 -> 搜索词与产品title、搜索词与产品描述的相似度<br></li></ol></li><li>通过Word2Vec来评判距离,搜索词与产品title,产品描述的 -> 2个新特征
<ol><li>nltk也是自带一个强大的句子分割器。【调用工具】<br></li><li>我们先把长文本搞成list of 句子,再把句子变成list of 单词:【文本->句子】<br></li><li>我们把list of lists 给 flatten了。【句子 -> 扁平化flatten】<br></li><li>我们把句子里的单词给分好。可以用刚刚Gensim的tokenizer, 也可以用nltk的word_tokenizer 【句子 -> 单词】<br></li><li>训练我们的预料库,成为词向量 【单词 -> 训练语料库model】<br></li><li>可以得到每个单词的向量,但是每一格句子中由多个单词组成,把每个单词向量取平均,<br></li><li>计算两个句子的vector的相似度, 用cosine similarity,用scipy的spatial功能<br></li><li>应用在两列上, 得到新的2个特征:df_all.apply(lambda x: w2v_cos_sim(x['search_term'], x['product_title']), axis=1)<br></li><li>去掉不需要的column,给drop掉, 留下新特征<br></li></ol></li></ol>
<p>代码如下:</p>
<pre class="blockcode"><code class="language-python"># -*- coding:utf8 -*-
# @TIME : 2018/4/27 上午6:15
# @Author : Allen
# @File : product_search_relevance_advanced.py
#目的:给出输入关键字与搜索结果,评价搜索准确度
</code></pre>
<pre class="blockcode"><code class="language-python">#读取数据
df_train = pd.read_csv('train.csv', encoding = "ISO-8859-1")
df_test = pd.read_csv('test.csv', encoding = "ISO-8859-1")
df_desc = pd.read_csv('product_descriptions.csv')</code></pre>
<pre class="blockcode"><code class="language-python">#处理思路
#1,导入包、数据 -> 合并数据格式concat,merge,
#2,文本预处理 -> 【简单方法】:看输入词是在搜索结果中出现几次,需要先统一数据集格式 -> str_stemmer and str_commond_words 处理数据
#3,自制文本特征 -> 关键词长度/搜索词语与title和describtion中重复词语数 -> 去掉之前的英文,保留自制特征
#4,重塑训练/测试集 -> 拆分出X_train, X_test, y_train, 去除label
#5,建立模型:Ridge回归模型RandomForestRegressor 找出最佳参数max_depth=7 通过多种参数导入 -> 画图
#6,上传结果:生成csv文件</code></pre>
<pre class="blockcode"><code class="language-python">#########1) 导入需要用的库
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier, BaggingRegressor
from nltk.stem.snowball import SnowballStemmer
import os
# 解决路径报错问题:SyntaxError: (unicode error) 'unicodeescape':https://www.cnblogs.com/renfanzi/p/6307074.html
f = r'C:\Users\xiaochen.liu\Desktop\product_search_relevance'
os.chdir(f)
</code></pre>
<pre class="blockcode"><code class="language-python">#读取数据
df_train = pd.read_csv('train.csv', encoding = "ISO-8859-1")
df_test = pd.read_csv('test.csv', encoding = "ISO-8859-1")
df_desc = pd.read_csv('product_descriptions.csv')</code></pre>
<pre class="blockcode"><code class="language-python">#合并测试集与训练集,便于统一文本预处理
#PANDAS 数据合并与重塑(concat篇):https://blog.csdn.net/stevenkwong/article/details/52528616
#PANDAS 数据合并与重塑(join/merge篇):https://blog.csdn.net/stevenkwong/article/details/52540605
df_all = pd.concat((df_train, df_test), axis=0, ignore_index=True)
df_all.head()
#print(df_all.shape)</code></pre>
<pre class="blockcode"><code class="language-python">#把描述信息加入表,how='left'表示左边全部保留,on表 |
|