当前位置:   article > 正文

nlp-关键词搜索_nlp相关词检索

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/623207
推荐阅读
相关标签
  

闽ICP备14008679号