基于LDA模型的知网Python论文主题挖掘

一、功能描述
        Python 已成为当前最热门的编程工具之一,在数据分析、爬虫、机器学习、Web 开发等领域
有着广泛的应用。LDA 也称为隐狄利克雷分布,LDA 目的是识别主题,即把文档—词汇矩阵变成
文档—主题矩阵(分布)和主题—词汇矩阵(分布)。本设计具体功能如下:
1.Selenium 爬取知网“Python”主题、类别为“核心期刊”论文,下载到 Excel 文件。
2. LDA 模型分别对 5 个时间区间的文献进行分析,对比分析得出 Python 论文主题(应用领
域)趋势,预测未来发文热点。
由于知网 PC 端有很强的反爬虫机制,选择爬取手机端。
二、关键技术
1.Python+Selenium库的使用。
2. Python 处理 Excel 数据。
3. jieba,gensim, pyLDAvis 等库的使用。
三、运行环境
1.安装与配置 Selenium
(1)打开 cmd,输入如下命令:
pip install -i https://pypi.douban.com/simple selenium
安装完成后,输入如下命令验证,可见,4.0.0 版本的 selenium 已经安装完成。
pip show selenium

基于LDA模型的知网Python论文主题挖掘_第1张图片

 (2)配置 chrome 驱动。首先查看自己电脑使用的 chrome 版本。安装对应版本的驱动。
安装完成后,将 exe 文件放到 chrome 安装目录下。此电脑>>右键属性>高级系统设置>>高
级>>环境变量>>系统变量>>Path,添加驱动目录到 Path。操作流程如下:
基于LDA模型的知网Python论文主题挖掘_第2张图片

 基于LDA模型的知网Python论文主题挖掘_第3张图片

        对于文本分析还需要安装好jieba,gensim,pyLDAvis模块,过程略。

四、核心代码

1.Selenium_Reptile.py

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import xlwt#写入excel的扩展工具

#驱动所在路径
chrome_driver = 'C:\Program Files\Google\Chrome\Application\chromedriver.exe'
browser = webdriver.Chrome(executable_path=chrome_driver)
browser.get('http://wap.cnki.net/touch/web/guide')#打开指定页面
time.sleep(0.3)#强制暂停0.3s便于看清爬虫步骤

# 搜索主题
topic = "Python"
browser.find_element_by_id('btnSearch').click()
browser.find_element_by_id('keyword_ordinary').send_keys(topic)
browser.find_element_by_class_name('btn-search').click()
time.sleep(0.3)

# 筛选类型
browser.find_element_by_id("articletype_a").click()
time.sleep(0.3)
browser.find_element_by_css_selector("a[data-value=\"11\"]").click()


# 获取论文数量
num = browser.find_element_by_class_name('search-number').text
num = int(num[:-1])#从位置0到位置-1的个数即所有数量
# 加载所有页面,若加载5页,改为for i in range(5):
for i in range(int(num/10)):#num/10根据文献数量锁定所有页面的数量
    browser.find_element_by_class_name('c-company__body-item-more').click()
    time.sleep(0.3)

# 获取文献信息
title = browser.find_elements_by_class_name('c-company__body-title')#标题
author = browser.find_elements_by_class_name('c-company__body-author')#作者
content = browser.find_elements_by_class_name('c-company__body-content')#摘要
source = browser.find_elements_by_class_name('color-green')#来源
cite = browser.find_elements_by_class_name('c-company__body-info')#引用

# 保存为xls文件
worksheet = xlwt.Workbook()#定义workbook
sheet = worksheet.add_sheet(topic)#添加sheet,以之前搜索的主题命名
head = ['标题', '作者', '摘要', '来源', '引用']#标题
for h in range(len(head)):
    sheet.write(0, h, head[h])#把表头写到Excel里面去
i = 1#定义Excel表格的行数,从第二行开始写入,第一行已经写了标题
#依次写入每行记录
for n in range(len(title)):#文章标题的数量表示文献
    sheet.write(i, 0, title[n].text)
    sheet.write(i, 1, author[n].text)
    sheet.write(i, 2, content[n].text)
    sheet.write(i, 3, source[n].text)
    sheet.write(i, 4, cite[n].text)  
    i += 1
worksheet.save('C:/Users/86184/Desktop/知网Python主题核心期刊论文.xls')#保存到桌面

# 关闭浏览器
browser.quit()

 2.对导入表格的数据整理,txtAnalysis.py,在该过程中要运用stopwords.txt作停用词处理,构造词典,进一步运用LDA找到每个主题(词袋)下对应的多个词语。

import xlrd
import re
import jieba
import jieba.posseg as jp
import pyLDAvis.gensim_models
from gensim.models.coherencemodel import CoherenceModel
from gensim.models.ldamodel import LdaModel
from gensim.corpora.dictionary import Dictionary

class txtAnalysis:
    def __init__(self,sheet_id,name_id):
        self.sheet_id=sheet_id#表号
        self.name_id=name_id#名称

    def txthandle(self):
        #读取表,行
        table=xl.sheets()[self.sheet_id]
        texts=[]
        for i in range(1,table.nrows):
            row=table.row_values(i)
            txt=f"{row}"
            #去除标点,字母,数字
            txt=re.sub('[\W_]+','',txt)
            txt=re.sub('[a-zA-Z]','',txt)
            txt=re.sub('[\d]','',txt)
            texts.append(txt)

        #分词,构造词典
        flags = ('n')#挖掘主题,限定词性为名词
        stopwords = open("stopwords.txt","r",encoding='utf-8').read()# 停用词表
        words_lst = []
        for txt in texts:
        # jieba分词,词性识别,去停用词
            words = [i.word for i in jp.cut(txt) if i.flag in flags and i.word not in stopwords]
            words_lst.append(words)
        dictionary = Dictionary(words_lst)
        corpus = [dictionary.doc2bow(words) for words in words_lst]
        
        # lda模型计算
        #设置主题个数为5,训练10次,种子数200,迭代100次
        lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=5,passes=10,random_state=200,iterations=100)
        # U_Mass Coherence可通过指标得合理主题数
        ldaCM = CoherenceModel(model=lda, corpus=corpus, dictionary=dictionary, coherence='u_mass')
        # 打印主题,每个主题显示8个词
        for topic in lda.print_topics(num_words=8):
            print("{0}".format(self.name_id),topic)

        # LDA可视化
        plot =pyLDAvis.gensim_models.prepare(lda,corpus,dictionary)
        # 保存到本地html
        pyLDAvis.save_html(plot, 'Python{0}论文LDA可视化结果.html'.format(self.name_id))

if __name__=='__main__':
    #读取表格文件
    xl= xlrd.open_workbook("处理.xlsx")
    txtAnalysis1=txtAnalysis(1,"2019-2021")
    txtAnalysis1.txthandle()
    txtAnalysis2=txtAnalysis(2,"2016-2018")
    txtAnalysis2.txthandle()
    txtAnalysis3=txtAnalysis(3,"2013-2015")
    txtAnalysis3.txthandle()
    txtAnalysis4=txtAnalysis(4,"2010-2012")
    txtAnalysis4.txthandle()
    txtAnalysis5=txtAnalysis(5,"2010以前")
    txtAnalysis5.txthandle()

3.结果

结果有两种形式:

2019-2021 (0, '0.056*"数据" + 0.013*"语言" + 0.013*"平台" + 0.013*"机器人" + 0.012*"电商" + 0.011*"系统" + 0.010*"有限元" + 0.009*"软件"')
2019-2021 (1, '0.017*"模型" + 0.017*"隧道" + 0.015*"公路" + 0.015*"建模" + 0.015*"自由基" + 0.013*"文本" + 0.013*"语言" + 0.012*"信息"')
2019-2021 (2, '0.026*"算法" + 0.025*"结构" + 0.021*"模型" + 0.019*"参数" + 0.015*"人口" + 0.014*"信息" + 0.012*"数据" + 0.012*"寄存器"')
2019-2021 (3, '0.019*"计算机" + 0.016*"模型" + 0.013*"框架" + 0.012*"爬虫" + 0.012*"参数" + 0.012*"系统" + 0.012*"数据" + 0.010*"科学"')
2019-2021 (4, '0.026*"语言" + 0.024*"系统" + 0.011*"外语" + 0.010*"建模" + 0.008*"水文" + 0.008*"平台" + 0.007*"程序设计" + 0.007*"人员"')
2016-2018 (0, '0.038*"数据" + 0.028*"螺栓" + 0.024*"质量" + 0.018*"软件" + 0.016*"结构" + 0.016*"动态" + 0.014*"蟒" + 0.014*"分类"')
2016-2018 (1, '0.045*"软件" + 0.026*"动态" + 0.023*"语料库" + 0.023*"牲畜" + 0.023*"主镜" + 0.023*"模块" + 0.020*"脚本" + 0.017*"系统"')
2016-2018 (2, '0.033*"系统" + 0.028*"花纹" + 0.024*"语言" + 0.023*"数据" + 0.021*"边坡" + 0.021*"沟" + 0.021*"轮胎" + 0.014*"布局"')
2016-2018 (3, '0.033*"流域" + 0.029*"数据" + 0.029*"水系" + 0.022*"语言" + 0.019*"水文" + 0.019*"特征" + 0.015*"信息" + 0.015*"制图"')
2016-2018 (4, '0.042*"数据" + 0.030*"智能" + 0.030*"高校" + 0.024*"工程" + 0.022*"语言" + 0.018*"公众" + 0.018*"主题" + 0.018*"图书馆"')
2013-2015 (0, '0.057*"数据" + 0.036*"平台" + 0.032*"模型" + 0.032*"地名" + 0.028*"语言" + 0.028*"结构" + 0.024*"数控系统" + 0.024*"电路"')
2013-2015 (1, '0.065*"系统" + 0.039*"软件" + 0.027*"极地" + 0.027*"自动测试" + 0.027*"物理层" + 0.027*"矿山" + 0.027*"信关" + 0.020*"平台"')
2013-2015 (2, '0.053*"结构" + 0.025*"软件" + 0.025*"语言" + 0.025*"参数" + 0.020*"工程" + 0.020*"模型" + 0.020*"机器人" + 0.020*"群"')
2013-2015 (3, '0.052*"结构" + 0.045*"系统" + 0.031*"模型" + 0.031*"规则" + 0.023*"平台" + 0.016*"有限元" + 0.016*"脚本语言" + 0.016*"价值"')
2013-2015 (4, '0.046*"网络" + 0.043*"数据" + 0.027*"语言" + 0.021*"资源" + 0.021*"隧道" + 0.021*"评价" + 0.021*"网格" + 0.021*"机身"')
2010-2012 (0, '0.071*"有限元" + 0.060*"壳" + 0.047*"软件" + 0.042*"参数" + 0.030*"数据" + 0.025*"模型" + 0.025*"汽车" + 0.025*"通风"')
2010-2012 (1, '0.034*"文件" + 0.026*"工程" + 0.026*"数据" + 0.026*"含量" + 0.026*"交叉" + 0.026*"柔性" + 0.026*"系统" + 0.018*"蟒蛇"')
2010-2012 (2, '0.047*"系统" + 0.021*"管理系统" + 0.021*"电子" + 0.021*"动态" + 0.016*"性别" + 0.016*"内容" + 0.016*"场景" + 0.016*"对象"')
2010-2012 (3, '0.069*"速度" + 0.040*"制图" + 0.021*"平台" + 0.021*"科学技术" + 0.021*"网络" + 0.021*"工程" + 0.021*"框架" + 0.021*"地壳"')
2010-2012 (4, '0.068*"景观" + 0.035*"算法" + 0.028*"专业" + 0.028*"复合材料" + 0.028*"可靠性" + 0.028*"定向" + 0.028*"信息系统" + 0.028*"开源"')
2010以前 (0, '0.052*"系统" + 0.044*"语言" + 0.031*"软件" + 0.027*"计算机" + 0.025*"工程" + 0.020*"编程" + 0.020*"内容" + 0.020*"场景"')
2010以前 (1, '0.038*"容器" + 0.034*"静态" + 0.029*"速度" + 0.029*"系统" + 0.020*"模块" + 0.020*"裂纹" + 0.020*"制图" + 0.020*"工程"')
2010以前 (2, '0.068*"语言" + 0.041*"动态" + 0.041*"并行程序" + 0.034*"脚本" + 0.028*"模块" + 0.021*"场景" + 0.021*"机器人" + 0.015*"模型"')
2010以前 (3, '0.036*"景观" + 0.024*"有限元" + 0.022*"软件" + 0.018*"脂肪酸" + 0.015*"模型" + 0.015*"专业" + 0.015*"开源" + 0.015*"信息系统"')
2010以前 (4, '0.039*"网络" + 0.025*"语言" + 0.024*"著者" + 0.024*"材料" + 0.022*"数据" + 0.016*"后处理" + 0.016*"规律" + 0.016*"论坛"')

WEB界面:

基于LDA模型的知网Python论文主题挖掘_第4张图片

可以通过以上结果对比分析python研究主题的差异。 

 五、总结

        本文有一定的不足。如果需要更精确的时间序列分析,可以通过构建JS距离进行研究。

此外,对以下文章表示致谢,创作过程中有所参考和借鉴:

Python爬虫:用selenium爬取知网文献基本信息_洋阳酱的博客-CSDN博客_selenium爬取知网

python 基于LDA算法的长文本主题提取分类并预测类别

你可能感兴趣的:(python,爬虫,开发语言)