文本处理常用操作

这里介绍一下文本预处理中常用的操作:

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)

 

待补充~

posted @ 2018-05-29 12:01  焦距  阅读(1011)  评论(0编辑  收藏  举报