zoukankan      html  css  js  c++  java
  • 文本处理常用操作

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

    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)

    待补充~

  • 相关阅读:
    开启MySQL远程访问权限 允许远程连接
    [SCOI2005]互不侵犯
    树的数据生成器
    博客园优化
    图的随机数据生成器
    CF 983B 序列函数
    [HNOI2010]弹飞绵羊
    luogu P3393 逃离僵尸岛
    LCT解读(1)
    [APIO2010]特别行动队
  • 原文地址:https://www.cnblogs.com/bymo/p/9104282.html
Copyright © 2011-2022 走看看