视频地址:https://www.bilibili.com/video/av27083004/?p=1
对于社交语言一类的,表情符之类的要通过正则匹配把它们筛出来,具体处理如下图
NLP:在feed进模型前要做大量的预处理,下面重点介绍
存在的问题(在英文中这个问题比较明显,在中文中可以忽略)
解决方法
实现
停用词(设置停用词的话可能会破坏之前的语义,所以不一定要用)
总结:文本预处理的流程
经过文本预处理后的流程:特征工程,即把文本转成向量,也就是数字表达的features
下面先介绍几个应用
1、情感分析
2、文本相似度
举个例子;先统计词频,然后相似度用余弦夹角衡量
3、文本分类
以TF-IDF为例
词频率和文档频率
下面讲师用一个kaggle的题目来作例子
省略文本读取和merge
代码如下:
# coding: utf-8
# In[1]:
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor,BaggingRegressor
from nltk.stem.snowball import SnowballStemmer
# In[2]:
df_train = pd.read_csv('../input/train.csv',encoding='ISO-8859-1')
df_test = pd.read_csv('../input/test.csv',encoding='ISO-8859-1')
# In[3]:
df_desc = pd.read_csv('../input/product_descriptions.csv',encoding='ISO-8859-1')
# In[6]:
df_all = pd.concat([df_train,df_test],axis=0,ignore_index=True)
# In[7]:
df_all.head()
# In[8]:
df_all.shape
# In[9]:
df_desc.head()
# In[10]:
df_all = pd.merge(df_all,df_desc,on='product_uid',how='left')
# In[11]:
df_all.head()
# In[13]:
#下面的文本预处理主要是看关键词是否会被包含
#其他的方式有去掉停止词、纠正拼写、去掉数字、去掉各种emoji等
stemmer = SnowballStemmer('english')
def str_stemmer(s):
return " ".join([stemmer.stem(word) for word in s.lower().split()])
# In[14]:
def str_comm_word(str1,str2):
return sum(int(str2.find(word)>=0) for word in str1.split())
# In[15]:
#接下来把每个column跑一遍,以清理所有的文本内容
for col in ['search_term','product_title','product_description']:
df_all[col] = df_all[col].map(lambda x:str_stemmer(x))
# In[17]:
#自制文本特征,没有特别的规则,但要靠谱点
#关键词长度
df_all['len_query'] = df_all['search_term'].map(lambda x:len(x.split())).astype(np.int64)
# In[19]:
#描述中有多少关键词重合
df_all['common_in_title'] = df_all.apply(lambda x:str_comm_word(x['search_term'],x['product_title']),axis=1)
# In[20]:
df_all = df_all.drop(['search_term','product_title','product_description'],axis=1)
# In[21]:
#重塑训练/测试集
df_train = df_all.loc[df_train.index]
df_test = df_all.loc[df_test.index]
# In[22]:
test_ids = df_test['id']
# In[23]:
y_train = df_train['relevance'].values
# In[25]:
X_train = df_train.drop(['id','relevance'],axis=1).values
X_test = df_test.drop(['id','relevance'],axis=1).values
# In[26]:
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score
# In[35]:
params = [1,3,5,7,9,10]
test_scores = []
for param in params:
clf = RandomForestRegressor(n_estimators=30,max_depth=param)
test_score = np.square(cross_val_score(clf,X_train,y_train,cv=5,scoring='neg_mean_squared_error'))
test_scores.append(np.mean(test_score))
# In[36]:
import matplotlib.pyplot as plt
get_ipython().magic('matplotlib inline')
plt.plot(params,test_scores)
plt.title("Params VS Cv Errors")
# In[37]:
rf = RandomForestRegressor(n_estimators=30,max_depth=5)
# In[38]:
rf.fit(X_train,y_train)
# In[39]:
y_pred = rf.predict(X_test)
# In[41]:
df = pd.DataFrame({'id':test_ids,'relevance':y_pred})
# In[42]:
df.head()