• 机器学习入门-贝叶斯中文新闻分类任务 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))

                          

  • 相关阅读:
    关于DataGrid最后一页只有一行记录时,删除此记录出错的问题
    数据库开发个人总结(ADO.NET小结)
    MSSQL server数据库开发精典技巧
    愈强愈勇(奥运六星)
    中国与日本的生活对比 转)
    古龙妙语录
    DataGrid单击行时改变颜色
    VS.NET 2003 控件命名规范
    qt国际化
    Histogram matching using python, opencv
  • 原文地址:https://www.cnblogs.com/my-love-is-python/p/10290232.html
Copyright © 2020-2023  润新知