这里介绍一下文本预处理中常用的操作:
1.英文统一小写
text = text.lower()
2.分词
def cut(text): # return list(jieba.cut(text)) return [item for item in jieba.cut(text.lower())] if text != "" else []
3.去噪
两种方式
(1)去停用词
包括中英文标点符号、以及噪音词,参考附录[1]
stopwords = set([line.strip() for line in codecs.open("data/stopwords.txt", "r")]) def cut_and_remove_stopwords(text): return [item for item in jieba.cut(text.lower()) if item not in Utils.stopwords] if text != "" else []
(2)只保留指定词典中的词
这个词典与任务强相关,通常是当前任务重点关注的特征词
def cut_and_in_vocabulary(text): return [item for item in jieba.cut(text.lower()) if item in Utils.vocabulary] if text != "" else []
其中,为了保证分词的结果是我们想要的,通常需要调整jieba词典:
file_vocabulary = "data/vocabulary.txt" jieba.load_userdict(file_vocabulary) vocabulary = set([line.strip() for line in codecs.open(file_vocabulary, "r")]) file_jieba_delete_dict = "data/jieba_delete_dict.txt" for wd in [line.strip() for line in codecs.open(file_jieba_delete_dict, "r")]: jieba.del_word(wd)
详细说明参考:fxsjy/jieba: 结巴中文分词
附录[1]:停用词表(其中有两行分别是中英文的空格)
, . ? ! , 。 ? ! 不好意思 抱歉 谢谢 这边 那边 那个 这个 那样 这种 那种 我想 这儿 这样 还 也 额 呃 嗯 噢 那 哎 先 后 啊 哦 吧 呀 啦 哈 诶 咯 恩 阿 呢 吗 的 了
Pandas数据处理常用操作:https://www.cnblogs.com/bymo/p/7154476.html
Sklearn数据处理常用操作:
# 连续特征规范化处理 from sklearn.preprocessing import MinMaxScaler, Normalizer, StandardScaler scaler = StandardScaler() # 标准化:零均值,单位方差 scaler = MinMaxScaler(feature_range=(0, 1)) # 变换到[0, 1]区间 (也可以是其它固定最大最小值的区间) scaler = Normalizer(norm="l2") # 正则化:'l1', 'l2', or 'max', optional ('l2' by default) # The norm to use to normalize each non zero sample. # l2_norm变换后每个样本的各维特征的平方和为1。类似地,l1_norm变换后每个样本的各维特征的绝对值和为1;max_norm变换将每个样本的各维特征除以该样本的最大值 df["0108"] = StandardScaler().fit_transform(df["0108"].values.reshape(-1, 1)) # 因为type(df["0108"])是一个pandas.core.series.Series,所以要用values把值取出来; # 因为df["0108"].values.shape是(57298,),所以需要用reshape使它变成行数不限,列数为1 df["0108"] = df["0108"].rank() # 对数值进行排序,使得数据变成一种稠密的表达,使得模型对数值不敏感 # 类别特征处理 # 参考:https://blog.csdn.net/bryan__/article/details/79911768 data = pd.get_dummies(df, columns=["label"], dummy_na=True) # 获得稠密的表达,适合小数据量;这里dummy_na=True表示将空值也加进来 # 获得哑变量 from sklearn.preprocessing import LabelEncoder, OneHotEncoder from scipy import sparse df["label"] = LabelEncoder().fit_transform(df["label"]) # 编码 data = sparse.hstack(df, OneHotEncoder().fit_transform(df["label"])) # 获得稀疏的表达,适合大数据量 # 将原始数据和OneHot后的数据进行横向拼接,再进行稀疏化 # hstack表示横向拼接;vstack表示纵向拼接 # 这里注意的是,稀疏化后的数据不方便进行切分,所以,最好先切分好训练集和测试集,再分别进行稀疏化 # 文本向量化 from sklearn.feature_extraction.text import CountVectorizer df["xxx"] = df["xxx"].apply(lambda x: " ".join(x.split(";"))) item_category_list = CountVectorizer().fit_transform(df["xxx"]) df = sparse.hstack(item_category_list) """ 例子: 'a b d' 'a e' 上面是两个样本在某个维度上的特征 可以看到有四种取值(a b d e),我们可以通过上面的方法把这两行变成下面这种形式: 1110 1001 这里其实就是对每种取值进行计数,提取向量化特征,类似于tfidf处理 """ # 连续特征离散化 例如1.0, 2.0, 3.0, ..., 15.0 pd.cut(df["xxx"], bins=[0, 5, 10, 15, 20]).head() df["bins"] = pd.cut(df["xxx"], bins=[0, 5, 10, 15, 20]) df["bins"][0] # Interval(10, 15, closed='right'] df["bins"] = df["bins"].astype("str") # 列类型转换 df["bins"][0] # '(10, 15]' df["pv_bins"] = pd.cut(df["xxx"], bins=[0, 5, 10, 15, 20]).astype("str") df["pv_bins_cate"] = LabelEncoder().fit_transform(df["pv_bins"]) df[["xxx", "pv_bins", "pv_bins_cate"]].head() # 原始特征,离散化后的特征,离散化并LabelEncoder编码后的特征(编码后还可以进一步做一个OneHot) # 特征二值化 # TODO from sklearn.preprocessing import Binarizer df["xxx"] = Binarizer(threshold=10).fit_transform(df["xxx"].values.reshape(-1, 1)) # 评估函数 from sklearn.metrics import accuracy_score, confusion_matrix, f1_score, log_loss, mean_absolute_error, mean_squared_error, precision_score, roc_auc_score # 模型评估与参数搜索 from sklearn.linear_model import LogisticRegression from sklearn.model_selection import GridSearchCV train_x, train_y = [], [] model = LogisticRegression() param_grid = {} grid_search = GridSearchCV(model, param_grid=param_grid, n_jobs=8, verbose=1, cv=5) grid_search.fit(train_x, train_y) best_parameters = grid_search.best_estimator_.get_params() for para, val in list(best_parameters.items()): print(para, val) model = LogisticRegression(max_iter=best_parameters["max_iter"], C=best_parameters["C"]) model.fit(train_x, train_y)
待补充~