nlp-关键词搜索

关键词搜索

"""
    功能:实现关键词搜索
    可以尝试修改/调试/升级的部分是:
        文本预处理步骤: 你可以使用很多不同的方法来使得文本数据变得更加清洁
        自制的特征: 相处更多的特征值表达方法(关键词全段重合数量,重合比率,等等)
        更好的回归模型: 根据之前的课讲的Ensemble方法,把分类器提升到极致
    版本1.0
    日期:10.10.2019
"""

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor, BaggingRegressor
from nltk.stem.snowball import SnowballStemmer
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt

df_train = pd.read_csv('C:/Users/Administrator/Desktop/七月在线课程下载/word2vec/input/train.csv',
                       encoding="ISO-8859-1")
df_test = pd.read_csv('C:/Users/Administrator/Desktop/七月在线课程下载/word2vec/input/test.csv',
                      encoding="ISO-8859-1")
df_desc = pd.read_csv('C:/Users/Administrator/Desktop/七月在线课程下载/word2vec/input/product_descriptions.csv')   # 描述信息

# 上下连接训练集和测试集
df_all = pd.concat((df_train, df_test), axis=0, ignore_index=True)   # ignore_index=True忽略原索引,生成新索引

# 根据product_uid左右合并产品介绍
df_all = pd.merge(df_all, df_desc, how='left', on='product_uid')

#---------------------------------  文本预处理  -----------------------------------
# 可以选用各种你觉得靠谱的预处理方式:去掉停止词,纠正拼写,去掉数字,去掉各种emoji,等等)
# 这里只用SnowballStemmer,词干抽取
stemmer = SnowballStemmer('english')


def str_stemmer(s):
    """
    :param s: 字符格式的字符
    :return: 词干抽取后的字符
    """
    return " ".join([stemmer.stem(word) for word in s.lower().split()])


# 将三组object进行词干抽取
df_all['search_term'] = df_all['search_term'].map(lambda x: str_stemmer(x))
df_all['product_title'] = df_all['product_title'].map(lambda x: str_stemmer(x))
df_all['product_description'] = df_all['product_description'].map(lambda x: str_stemmer(x))

#-----------------------------------  自制文本特征  -------------------------------------
# 关键词的长度
df_all['len_of_query'] = df_all['search_term'].map(lambda x:len(x.split())).astype(np.int64)


# 计算str1有多少个重合在str2里面
def str_common_word(str1, str2):
    print(str1.head())
    return sum(int(str2.find(word) >= 0) for word in str1.split())


# 标题中有多少关键词重合
df_all['commons_in_title'] = df_all.apply(lambda x:
                                          str_common_word(x['search_term'], x['product_title']),
                                          axis=1)
# 描述中有多少关键词重合
df_all['commons_in_desc'] = df_all.apply(lambda x:
                                         str_common_word(x['search_term'], x['product_description']),
                                         axis=1)
#---------------------------------------------
# 搞完之后,我们把不能被『机器学习模型』处理的column给drop掉
df_all = df_all.drop(['search_term', 'product_title', 'product_description'], axis=1)

# 重塑训练/测试集
# 搞完一圈预处理之后,我们让数据重回原本的样貌
# 分开训练和测试集
df_train = df_all.loc[df_train.index]
df_test = df_all.loc[df_train.shape[0]:]

# 记录下测试集的id
# 留着上传的时候 能对的上号
test_ids = df_test['id']

# 分离出y_train
y_train = df_train['relevance'].values    # .values 意思是转化numpy

X_train = df_train.drop(['id', 'relevance'], axis=1).values
X_test = df_test.drop(['id', 'relevance'], axis=1).values

#--------------------------  建立模型  --------------------------------------
params = [2, 6, 7, 9]  # 每棵决策树的最大深度,可以给出更多的参数值进行筛选
test_scores = []
for param in params:
    # n_estimators用于指定随机森林所包含的决策树个数
    # max_depth每棵决策树的最大深度
    classfier = RandomForestRegressor(n_estimators=30, max_depth=param)

    # cv:把数据分成5份,5折交叉验证

    test_score = np.sqrt(-cross_val_score(classfier, X_train, y_train, cv=5, scoring='neg_mean_squared_error'))
    test_scores.append(np.mean(test_score))


plt.plot(params, test_scores)
plt.title("Param vs CV Error")
# 大概6~7的时候达到了最优解

# 用上面最优解深度6这个树深参数,跑测试集
rf = RandomForestRegressor(n_estimators=30, max_depth=6)
rf.fit(X_train, y_train)
y_pred = rf.predict(X_test)

# 保存测试集预测结果
pd.DataFrame({"id": test_ids, "relevance": y_pred}).to_csv('submission.csv',index=False)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值