美文网首页
Python学习笔记-3群18组-杜杜狼-2017.8.4

Python学习笔记-3群18组-杜杜狼-2017.8.4

作者: 渡笃狼 | 来源:发表于2017-08-07 09:33 被阅读7次

    Lesson 11 关键词提取实现

    TF-IDF原理

    决定当两个分词的词频一样,哪个更适合做关键词
    在词频的基础上,对每个词分配一个权重,较少见的词分配较大的权重

    词频(Term Frequency) 指的是某一个给定的词在该文档中出现的次数
    逆文档频率(Inverse Document Frequency)IDF就是每个词的权重,它的大小与一个词的常见程度成反比
    TF-IDF(Term Frequency-Inverse Document Frequency)权衡某个分词是否是关键词的指标,该值越大,是关键词的可能性就越大

    TF计算公式
    TF = 该词在文档中出现的次数
    IDF计算公式
    IDF = log(文档总数/(包含该词的文档数 +1))

    文档向量化
    假设有m篇文档d1, d2, d3, ... dm对它们进行分词,得到n个分词w1, w2, w3...wn,那么f(i,j)代表第i篇文章中,分词j出现的次数,可以用矩阵表示。
    那么第i篇文章,可以使用第i行数据进行表示。

    TF-IDF实现

    Step 1: 按照中文分词和文件的关系创建DataFrame

    import re
    #匹配中文的分词
    zhPattern = re.compile(u'[\u4e00-\u9fa5]+')
    
    import jieba
    
    segments = []
    filePaths = []
    for index, row in corpos.iterrows():
        filePath = row['filePath']
        fileContent = row['fileContent']
        segs = jieba.cut(fileContent)
        for seg in segs:
            #只有中文分词才会添加到该文件分词列表中
            if zhPattern.search(seg):
                segments.append(seg)
                filePaths.append(filePath)
    
    segmentDF = pandas.DataFrame({
        'filePath':filePaths, 
        'segment':segments
    })
    

    Step 2: 移除停用词(该步骤和之前的语料库准备步骤一致)

    stopwords = pandas.read_csv(
        "StopwordsCN.txt", 
        encoding='utf8', 
        index_col=False,
        quoting=3,
        sep="\t"
    )
    
    segmentDF = segmentDF[
        ~segmentDF.segment.isin(
            stopwords.stopword
        )
    ]
    

    Step 3: 按文章进行词频统计, sample中用的order()函数已经过期,需替换成sort_values()

    segStat = segmentDF.groupby(
        by=["filePath", "segment"]
    )["segment"].agg({
        "计数":numpy.size
    }).reset_index().sort_values(
       "计数",
        ascending=False
    );
    

    Step 4: 把小部分的数据删除掉

    segStat = segStat[segStat.计数>1]
    

    Step 5: 进行文本向量计算

    #将DataFrame转成pivot table,进行文件与分词的交叉分析
    TF = segStat.pivot_table(
        index='filePath', 
        columns='segment', 
        values='计数',
        fill_value=0
    )
    
    #套用公式,计算IDF值
    def hanlder(x): 
        return (numpy.log2(len(corpos)/(numpy.sum(x>0)+1)))
    
    IDF = TF.apply(hanlder)
    
    #将TF*IDF得到TF_IDF值
    TF_IDF = pandas.DataFrame(TF*IDF)
    
    tag1s = []
    tag2s = []
    tag3s = []
    tag4s = []
    tag5s = []
    
    #计算Top 5 分词,此处可以和前一课进行比较:tags = jieba.analyse.extract_tags(content, topK=5)
    for filePath in TF_IDF.index:
        tagis = TF_IDF.loc[filePath].sort_values(
            ascending=False
        )[:5].index
        tag1s.append(tagis[0])
        tag2s.append(tagis[1])
        tag3s.append(tagis[2])
        tag4s.append(tagis[3])
        tag5s.append(tagis[4])
    
    tagDF = pandas.DataFrame({
        'filePath':corpos.filePath, 
        'fileContent':corpos.fileContent, 
        'tag1':tag1s, 
        'tag2':tag2s, 
        'tag3':tag3s, 
        'tag4':tag4s, 
        'tag5':tag5s
    })

    相关文章

      网友评论

          本文标题:Python学习笔记-3群18组-杜杜狼-2017.8.4

          本文链接:https://www.haomeiwen.com/subject/gjkvlxtx.html