zoukankan      html  css  js  c++  java
  • 机器学习入门-贝叶斯中文新闻分类任务 1. .map(做标签数字替换) 2.CountVectorizer(词频向量映射) 3.TfidfVectorizer(TFDIF向量映射) 4.MultinomialNB()贝叶斯模型构建

    1.map做一个标签的数字替换

    2.vec = CountVectorizer(lowercase=False, max_features=4000)  # 从sklean.extract_feature.text 导入,根据词频做一个数字的映射,max_feature表示的是最大的特征数

    需要先使用vec.fit ,再使用vec.transform 才有效

    3. vec = TfidfVectorizer(lowercase=False, max_features=4000)  # 从sklean.extract_feature.text 导入,根据TF-dif做一个数字的映射,max_feature表示的是最大的特征数

    4.MultinomialNB()  进行贝叶斯模型的构建,这里使用的是一个向量相似度的计算,采用的是余弦定理,from sklean,naive_bayes

    对于需要构成语料库的数据,我们需要去停用词

    停用词包括 

                    1. 语料中大量出现的               如 1.!, 2.", 3.#, 4.$, 5.% 

                    2. 没啥大用                                  1.一下 2.一些 3.一项 4.一则

    关键词提取

    TF-IDF  

    比如有3个词:中国,蜜蜂,养殖

    TF(词频):表示的是蜜蜂在这个文章里出现的次数,即词频/ 这个文章词的个数

    IDF(拟文档评率):表示的是log(文章总数/出现这个词文章的个数+1)  比如一共有10000个文章,出现这个词的文章为100, 那么idf约等于3 

    TF-IDF = TF * IDF 

    相似度计算:

    比如句子A: 我喜欢看电视,不喜欢看电影

    句子B: 我不喜欢看电视,也不喜欢看电影

    对两个句子进行分词, 语料库:我,喜欢,看,电视,电影,不,也

    统计词频:

    句子A  : 我1, 喜欢2, 看2, 电视1, 不1, 电影1, 也0

    句子B: 我1, 喜欢2, 看2, 电视1, 不2, 电影1, 也1 

    转换为向量的形式

    A = [1, 2, 2, 1, 1, 1, 0]

    B = [1, 2, 2, 1, 2, 1, 1]

    使用余弦相似度来进行相似度的匹配,做为p(d|h)

    1.载入新闻数据

    2.使用结巴分词器进行分词

    3.将分词后的结果去除停用词

    4. 将去除停用词的数据增加一列标签

    5.进行数据的拆分,分成训练数据和测试数据

    6.对训练数据和测试数据进行文本表示,使用CountVectorizer(),先fit训练数据的变量,然后在分别transform训练数据和测试数据,进行词频向量化操作

    7.使用贝叶斯进行训练和预测

    import pandas as pd
    import numpy as np
    import jieba
    
    # 1.导入数据语料的新闻数据
    df_data = pd.read_table('data/val.txt', names=['category', 'theme', 'URL', 'content'], encoding='utf-8')
    
    # 2.对语料库进行分词操作
    df_contents = df_data.content.values.tolist()
    
    # list of list 结构
    Jie_content = []
    for df_content in df_contents:
        split_content = jieba.lcut(df_content)
        if len(split_content) > 1 and split_content != '	
    ':
            Jie_content.append(split_content)
    
    # 3. 导入停止词的语料库, sep='	'表示分隔符, quoting控制引号的常量, names=列名, index_col=False,不用第一列做为行的列名, encoding
    stopwords = pd.read_csv('stopwords.txt', sep='	', quoting=3, names=['stopwords'], index_col=False, encoding='utf-8')
    print(stopwords.head())
    
    # 对文本进行停止词的去除
    def drop_stops(Jie_content, stopwords):
        clean_content = []
        all_words = []
        for j_content in Jie_content:
            line_clean = []
            for line in j_content:
                if line in stopwords:
                    continue
                line_clean.append(line)
                all_words.append(line)
            clean_content.append(line_clean)
    
        return clean_content, all_words
    # 将DateFrame的stopwords数据转换为list形式
    stopwords = stopwords.stopwords.values.tolist()
    clean_content, all_words = drop_stops(Jie_content, stopwords)
    print(clean_content[0])
    
    # 4. 构造训练数据,变量是content,标签是category
    df_content = pd.DataFrame({'content':clean_content, 'label':df_data['category']})
    # 使用map将标签转换为数字形式
    print(df_content.label.unique())
    label_map = {'汽车':1, '财经':2, '科技':3, '健康':4, '体育':5, '教育':6, '文化':7, '军事':8, '娱乐':9, '时尚':10}
    df_content['label'] = df_content['label'].map(label_map)
    
    
    # 5.使用train_test_split 分出训练集和测试集
    
    from sklearn.cross_validation import train_test_split
    train_x, test_x, train_y, test_y = train_test_split(df_content['content'], df_content['label'], random_state=1)
    # 将样本特征转换为词频向量的形式
    
    from sklearn.feature_extraction.text import CountVectorizer
    # 6. 为了满足CountVectorizer的形式,我们需要对转换前的样本做转换
    
    train_x_str = []
    for line in train_x:
        str_line = ' '.join(line)
        train_x_str.append(str_line)
    test_x_str = []
    for line in test_x:
        str_line = ' '.join(line)
        test_x_str.append(str_line)
    
    
    # 将文本数据根据词频转换为向量形式
    vec = CountVectorizer(lowercase=False, max_features=4000)
    vec.fit(train_x_str)
    
    # 7步 使用贝叶斯模型进行训练和测试
    from sklearn.naive_bayes import MultinomialNB
    
    print('1', np.shape(vec.transform(train_x_str)))
    classifier = MultinomialNB()
    classifier.fit(vec.transform(train_x_str), train_y)
    print(classifier.score(vec.transform(test_x_str), test_y))
    
    # 8. 使用TF-IDF构建向量矩阵
    from sklearn.feature_extraction.text import TfidfVectorizer
    
    vec = TfidfVectorizer(lowercase=False, max_features=4000)
    vec.fit(train_x_str)
    classifier.fit(vec.transform(train_x_str), train_y)
    print(classifier.score(vec.transform(test_x_str), test_y))
    
    
    vec = TfidfVectorizer(lowercase=False, max_features=4000, ngram_range=(1, 3))
    vec.fit(train_x_str)
    classifier.fit(vec.transform(train_x_str), train_y)
    print(classifier.score(vec.transform(test_x_str), test_y))

                          

  • 相关阅读:
    bzoj1015星球大战(并查集+离线)
    bzoj1085骑士精神(搜索)
    bzoj1051受欢迎的牛(Tarjan)
    左偏树学习
    hdu1512 Monkey King(并查集,左偏堆)
    左偏树(模板)
    PAT (Basic Level) Practice (中文) 1079 延迟的回文数 (20分) (大数加法)
    PAT (Basic Level) Practice (中文) 1078 字符串压缩与解压 (20分) (字符转数字——栈存放)
    PAT (Basic Level) Practice (中文) 1077 互评成绩计算 (20分) (四舍五入保留整数)
    PAT (Basic Level) Practice (中文) 1076 Wifi密码 (15分)
  • 原文地址:https://www.cnblogs.com/my-love-is-python/p/10290232.html
Copyright © 2011-2022 走看看