nlp 關鍵詞搜尋

2021-09-28 16:48:47 字數 4404 閱讀 4233

"""

可以嘗試修改/除錯/公升級的部分是:

文字預處理步驟: 你可以使用很多不同的方法來使得文字資料變得更加清潔

更好的回歸模型: 根據之前的課講的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(

, encoding=

"iso-8859-1"

)df_test = pd.read_csv(

, encoding=

"iso-8859-1"

)df_desc = pd.read_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裡面

defstr_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.

(lambda x:

str_common_word(x[

'search_term'

], x[

'product_title'])

, axis=1)

df_all[

'commons_in_desc'

]= df_all.

(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'))

)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(

).to_csv(

'submission.csv'

,index=

false

)

NLP關鍵詞提取

1 tf idf詞頻逆序詞頻 2 textrank 基於圖的模型,網上很多測評說它不一定強過tf idf,其實對於沒有標註資料的情況,感覺評判好壞真的很艱難。3 lda 4 word2vec 聚類 這個方法是看以為總結的,感覺具體的實施方案還是得自己實踐,不過個人覺得這個方法有點麻煩。主要流程如下 ...

NLP 關鍵詞提取演算法

一 提取關鍵字技術簡介 關鍵字提取技術一般也可以分為有監督和無監督 分別是tf idf演算法 textrank演算法和主題模型演算法 包括lsa lsi lda等 tf idf演算法 tf idf term frequency inverse document frequency,詞頻 逆文件頻次演...

NLP學習路徑(五) NLP關鍵詞提取演算法

2 tf idf演算法 無監督 tf idf演算法是一種基於統計的計算方法,常用於評估在乙個文件集中乙個詞對某份文件的重要程度。tf演算法是統計乙個詞在一篇文件 現的頻次 idf演算法是統計乙個詞在文件集的多少個文件 現,基本思想是 如果乙個詞在文件 現的次數越少,則其對文件的區分能力也就越強 要對...