• 使用scikit-learn进行自然语言处理——文档特征提取(基于词袋模型bag-of-words) 计算tf-idf


    首先python环境已经安装了numpy, scipy, sklearn, jieba

    # coding=utf-8
    """
    @desc: 
    """
    from scipy import sparse
    from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer, TfidfVectorizer
    from jieba import cut
    
    # 用jieba进行中文分词
    import jieba
    
    '''
    corpus是一个列表,每篇文章是该列表的一个字符串类型的元素,word_separator是文章分词后使用该分隔符分割每个单词
    '''
    
    
    def word_cut_chinese(corpus, word_separator):
        word_cut_results = list()
        for document in corpus:
            word_cut_results.append(word_separator.join(jieba.cut(document)))
        # 可再加一步去停用词
        return word_cut_results
    
    # ---------------使用以上函数处理----------------------------------------
    
    
    WORD_SEPARATOR = ' '
    corpus = ['我第一次学习自然语言处理,真的有点慌真的好着急',
              '不要紧张一切都会好的']
    train_data = word_cut_chinese(corpus, WORD_SEPARATOR)
    print('word_cuted_corpus is :', train_data)
    # word_cuted_corpus is : ['我 第一次 学习 自然语言 处理 , 真的 有点 慌 真的 好 着急', '不要 紧张 一切 都 会 好 的']
    
    print('--------分词结果-------')
    for doc in train_data:
        print(doc)
    
    
    # 用sklearn构建bag of words
    from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer, TfidfVectorizer
    count_vectorizer = CountVectorizer()
    # 训练语料库,得到一个scipy的稀疏矩阵count_matrix
    count_matrix = count_vectorizer.fit_transform(train_data)
    print(u"矩阵的稀疏表示count_matrix is:", '
    ',count_matrix)
    # count_matrix is: 含义:第0篇文档的编号为7的词在第0篇文档中出现的的频次是1
    #    (0, 7)    1
    #    (0, 3)    1
    
    # 得到稠密矩阵
    print(u"稠密矩阵count_matrix_todense  is:", '
    ', count_matrix.todense())
    
    # 查看整个语料库的tokens
    tokens = count_vectorizer.vocabulary_
    print('可以得到token字典,tokens is:', '
    ', tokens)
    
    # 通过单词查找id
    print(u'真的这个词的索引是:',count_vectorizer.vocabulary_.get('真的'))
    # 通过id查找单词
    print(tokens.items())
    # filter函数过滤字典的每一项
    print(u'索引为5的词语是',list(filter(lambda x: x[1] == 5, tokens.items()))[0][0])
    
    '''可以使用训练语料生成的词典为新的语料生成特征矩阵'''
    
    # 应用到新的语料
    corpus_new=['我真的很喜欢你']
    word_cuted_corpus_new=word_cut_chinese(corpus_new,WORD_SEPARATOR)
    matrix_new = count_vectorizer.transform(word_cuted_corpus_new)
    print(matrix_new.toarray())
    
    '''使用sklearn计算tf-idf矩阵'''
    tf_idf_transformer = TfidfTransformer()
    tf_idf_matrix = tf_idf_transformer.fit_transform(count_matrix)
    print('-------tf-idf矩阵密集表示----')
    print(tf_idf_matrix.todense())
    
    print('-------tf-idf矩阵稀疏表示----')
    print(tf_idf_matrix)

    ref: https://blog.csdn.net/chansonzhang/article/details/84023654?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

  • 相关阅读:
    根据W3C总结Ajax基础技术
    MVC中ActionName标记属性的用法
    为什么做网站一般不用服务端控件?
    Jquery两个比较常用的方法each和data
    MVC中的路由
    SQL中获取刚插入记录时对应的自增列的值
    第一个文章,今天比较兴奋啊! 给大家一个关于SQL复合查询的文章(动态生成多个where条件)
    获取 汉字的首字母(例如张三返回zs)核心方法chinesecap()
    ASP.NET中判断密码的安全度(低,中,高)
    C# 关于密码加密 (转载)
  • 原文地址:https://www.cnblogs.com/yoyowin/p/13524818.html
Copyright © 2020-2023  润新知