• Python数据挖掘-使用sklearn包


    使用sklearn包

    CountVectorizer是通过fit_transform函数将文本中的词语转换为词频矩阵

    • get_feature_names()可看到所有文本的关键字
    • vocabulary_可看到所有文本关键字和其位置
    • toarray()可以看到词频矩阵的结果

    TfidfTransformer是统计CountVectorizer中每个词语的tf-idf权值

    TfidfVectorizer可以把CountVectorizer、TfidfTransformer合并起来,直接生成tfidf值

    其关键参数:

    • max_df:这个给定特征可以应用在tf-idf矩阵中,泳衣描述单词在文档中的最高出现率,假设一个词(term)在80%的文档汇总都出现过了,那它也许(在句型简介的语境里)只携带非常少信息
    • min_df:可以是一个整数。意味着单词必须在5个以上的文档中出现才会被纳入考虑。设置为0.2,记单词至少在20%的文档中出现
    • ngram_range:这个参数将用来观察一元模型(unigrams),二元模型(bigrams)和三元模型(trigrams)

    转载:https://blog.csdn.net/qq_30868235/article/details/80389180

    1、首先给定一段内容

    contents = [
        '我 是 中国 人。',
        '你 是 美国 人。',
        '他 叫 什么 名字?',
        '她 是 谁 啊?'
    ]

    2、CountVectorizer类的使用

    首先调用CountVectorizer类,然后使用它的fit_transfomr方法对contents转换为一个词频矩阵,也可以说得到一个向量化矩阵;

    然后使用对该向量化矩阵使用toarray()方法,获取这个矩阵;

    最后通过vocabulary_来获取文本关键字及其位置

    from sklearn.feature_extraction.text import CountVectorizer
    
    countVectorizer=CountVectorizer()
    textVector=countVectorizer.fit_transform(contents)  #得到一个文档向量化的矩阵
    
    textVector.todense()   #获取这个矩阵
    countVectorizer.vocabulary_   #获取每个列对应的属性

    设置最小长度和正则表达式

    由于通过上述两个步骤只能获取长度为2以上的文字,汉字中单子也具有意义,对CountVectorizer进行设置,因此使用min_df和token_pattren

    1 countVectorizer=CountVectorizer(
    2         min_df=0,
    3         token_pattern=r"w+")
    4 textVector=countVectorizer.fit_transform(contents)
    5 
    6 textVector.todense()
    7 countVectorizer.vocabulary_

    3、TF-IDF运算,调用TfidfTransformer

    从sklearn.feature_extraction.text 调用TfidfTransformer类;

    传入字符串数组,由于fit_transform 后并不是一个单纯一个矩阵,要提取出关键字,还需要将其变为矩阵形式

     1 #调用tf-idf包,运算tfidf
     2 
     3 from sklearn.feature_extraction.text import TfidfTransformer
     4 
     5 transformer=TfidfTransformer()
     6 tfidf=transformer.fit_transform(textVector)   #传入字符串数组
     7 
     8 import pandas
     9 TFIDFDataFrame=pandas.DataFrame(tfidf.toarray())
    10 TFIDFDataFrame.columns=countVectorizer.get_feature_names()   #把列名设置为单词

    4、提取关键字

    使用numpy中的argsort(a,axis=1):将矩阵a按照axis排序,并返回排序后的下标;

    axis=0,沿着行向下(每列)的元素进行排序,axis=1,沿着列向右(每行)的元素进行排序

    根据位置索引可以提取对应的分词

    import numpy
    TFIDFSorted=numpy.argsort(tfidf.toarray(),axis=1)[:,-2:]
    TFIDFDataFrame.columns[TFIDFSorted].values

    5、实战演练

    1、语料库的搭建

     1 import os;
     2 import os.path;
     3 import codecs;
     4 
     5 filePaths = [];
     6 fileContents = [];
     7 for root, dirs, files in os.walk(
     8     "D:\PDM\2.8\SogouC.mini\Sample"
     9 ):
    10     for name in files:
    11         filePath = os.path.join(root, name);
    12         filePaths.append(filePath);
    13         f = codecs.open(filePath, 'r', 'utf-8')
    14         fileContent = f.read()
    15         f.close()
    16         fileContents.append(fileContent)
    17 
    18 import pandas;
    19 corpos = pandas.DataFrame({
    20     'filePath': filePaths, 
    21     'fileContent': fileContents
    22 });

    2、分词(中文分词)

     1 import re
     2 zhPattern=re.compile(u'[u4e00-u9fa5]+')
     3 
     4 import jieba
     5 segments=[]
     6 filePaths=[]
     7 
     8 for index,row in corpos.iterrows():
     9     segments=[]
    10     filePath=row["filePath"]
    11     fileContent=row["fileContent"]
    12     segs=jieba.cut(fileContent)
    13     for seg in segs:
    14         if zhPattern.search(seg):
    15             segments.append(seg)
    16     filePaths.append(filePath)
    17     row["fileContent"]=" ".join(segments)    #为了满足sklearn包的使用

    3、调用停用词、tfidf计算

     1 from sklearn.feature_extraction.text import CountVectorizer
     2 from sklearn.feature_extraction.text import TfidfTransformer
     3 
     4 stopwords = pandas.read_csv(
     5     "D:\PDM\2.8\StopwordsCN.txt",
     6     encoding='utf8', 
     7     index_col=False,
     8     quoting=3,
     9     sep="	"
    10 )
    11 
    12 countVectorizer = CountVectorizer(
    13     stop_words=list(stopwords['stopword'].values),   #与之前的CountVectorizer不一样,增加了停用词,去除了停用词的统计
    14     min_df=0, token_pattern=r"w+"
    15 )
    16 textVector = countVectorizer.fit_transform(
    17     corpos['fileContent']
    18 )
    19 
    20 transformer = TfidfTransformer()
    21 tfidf = transformer.fit_transform(textVector)

    4、提取关键字

     1 import numpy;
     2 sort = numpy.argsort(tfidf.toarray(), axis=1)[:, -5:]
     3 names = countVectorizer.get_feature_names();
     4 
     5 keywords = pandas.Index(names)[sort].values
     6 
     7 tagDF = pandas.DataFrame({
     8     'filePath':corpos.filePath, 
     9     'fileContent':corpos.fileContent, 
    10     'tag1':keywords[:, 0], 
    11     'tag2':keywords[:, 1], 
    12     'tag3':keywords[:, 2], 
    13     'tag4':keywords[:, 3], 
    14     'tag5':keywords[:, 4]
    15 })

    相关文章推荐

    在构建语料库、完成分词等任务后,获得了向量化矩阵textVector

     1 from sklearn.metrics import pairwise_distances
     2 
     3 distance_matrix=pairwise_distances(
     4         textVector,
     5         metric="cosine")   #向量化矩阵与计算公式
     6 
     7 m=1-pandas.DataFrame(distance_matrix)
     8 m.columns=filePaths
     9 m.index=filePaths
    10 
    11 sort=numpy.argsort(distance_matrix,axis=1)[:,1:6]
    12 similarity5=pandas.Index(filePaths)[sort].values
    13 
    14 similarityDF=pandas.DataFrame({
    15     'filePath':corpos.filePath, 
    16     's1': similarity5[:, 0], 
    17     's2': similarity5[:, 1], 
    18     's3': similarity5[:, 2], 
    19     's4': similarity5[:, 3], 
    20     's5': similarity5[:, 4]})

    自动摘要

    算法步骤:

    获取到需要摘要的文章;

    对改文章进行词频统计

    对改文章进行分局(根据中文的标点符号,一般我们采用。、?等进行分句)

    计算分句与文章之间的余弦相似度

    取相似度最高的分句,作为文章的摘要

    首先构建语料库、停用词、countVectorizer

    建立子语料库及向量化矩阵

     1 contents=[]
     2 summarys=[]
     3 filePahts=[]
     4 
     5 
     6 for index,row in corpos.iterrows():
     7     filePath=row["filePath"]
     8     fileContent=row["fileContent"]
     9     #建立子语料库,以该文档和该文档的分组组成
    10     subCorpos=[fileContent]+re.split(
    11         r'[。?!
    ]s*',
    12         fileContent
    13     )
    14     
    15     segments=[]
    16     suitCorpos=[]
    17     for content in subCorpos:
    18         segs=jieba.cut(content)
    19         segment=" ".join(segs)
    20         if len(segment.strip())>10:
    21             segments.append(segment)
    22             suitCorpos.append(content)
    23     
    24     textVector=countVectorizer.fit_transform(segments)
    25     
    26     distance_metrix=pairwise_distances(
    27         textVector,
    28         metric="cosine")
    29     
    30     sort=numpy.argsort(distance_metrix,axis=1)
    31     
    32     summary=pandas.Index(suitCorpos)[sort[0]].values[1]
    33 
    34     summarys.append(summary)
    35     filePahts.append(filePath)
    36     contents.append(fileContent)
  • 相关阅读:
    Maven使用教程
    [转载]DIV CSS设计时IE6、IE7、FF 与兼容性有关的特性
    ASP.NET MVC 开篇
    基于WebForm+EasyUI的业务管理系统形成之旅 -- ParamQueryGrid行、列合并(Ⅸ)
    基于WebForm+EasyUI的业务管理系统形成之旅 -- 施工计划查询(Ⅷ)
    浅析WCF与WebService、WPF与Silverlight 区别
    LeetCode-3Sum Smaller
    LeetCode-Different Ways to Add Parentheses
    LeetCode-Count Univalue Subtrees
    LeetCode-Decode String
  • 原文地址:https://www.cnblogs.com/U940634/p/9739462.html
Copyright © 2020-2023  润新知