首页 > 其他分享 >北京市政百姓信件分析---热词云以及存储关系图谱

北京市政百姓信件分析---热词云以及存储关系图谱

时间:2023-06-12 10:22:19浏览次数:31  
标签:node stopword 热词 graph label --- keys 图谱 contents

使用neo4j数据库进行存储关系的展示

 

 

 

热词云

 

 

 

 

import json
import matplotlib.pyplot as plt
import re
import jieba
from py2neo import Graph,Node,Relationship,NodeMatcher
from wordcloud import WordCloud
from collections import Counter
import warnings
warnings.filterwarnings('ignore')

contents = []
institutions = []
# 逐行读取输入文件
with open('letter.json', 'r',encoding='utf-8') as file:
    for line in file:
        # 解析每一行为 JSON 对象
        json_obj = json.loads(line)
        contents.append(json_obj['content'])
        institutions.append(json_obj['institution'])

# =====================================================================
# 内容清洗
# 文本内容清洗,清楚特殊符号,用正则表达式
pattern = r"[!\"#$%&'()*+,-./:;<=>?@[\\\]^_^{|}~—!,。?、¥…():【】《》‘’“”\s]+"
re_obj = re.compile(pattern)

def clear(text):
    return re_obj.sub("",text)

def cut_word(text):
    return jieba.lcut(text)

def get_stopword():
    s = set()
    with open('hit_stopwords.txt',encoding = 'UTF-8') as f:
        for line in f:
            s.add(line.strip())
    return s

def remove_stopword(words,stopword):
    return [word for word in words if word not in stopword]

def createWorldCould(c):
    # 生成词云图
    wordcloud = WordCloud(width=800, height=400, font_path="msyh.ttc").generate_from_frequencies(c)

    # 显示词云图
    plt.figure(figsize=(10, 5))
    plt.imshow(wordcloud, interpolation="bilinear")
    plt.axis("off")
    plt.show()

def createMapping(contents,institutions):
    # 创建知识图谱节点
    graph = Graph('http://localhost:7474', user='neo4j', password='123456')
    graph.delete_all()  # 清除neo4j里面的所有数据
    # 确保相同名称的结点被视为同一个结点
    label_1 = '意见'
    label_2 = '解决部门'

    # 将每一个机构的关键词都与机构对应上
    for i in range(len(institutions)):
        # 将一个关键词去重
        keys[i] = list(set(keys[i]))
        # 创建索引
        matcher = NodeMatcher(graph)
        nodelist = list(matcher.match(label_2,name=institutions[i]))
        # 已经有机构了
        if len(nodelist)>0:
            # 创建关键词节点
            for j in range(len(keys[i])):
                matcher = NodeMatcher(graph)
                nodelist = list(matcher.match(label_1,name=keys[i][j] ))
                if len(nodelist)>0:
                    print("已经有了")
                else:
                    node_1 = Node(label_1, name=keys[i][j])
                    graph.create(node_1)
                    node_2 = graph.nodes.match(label_2, name=institutions[i]).first()
                    rel = Relationship(node_1, "请求", node_2)
                    graph.create(rel)

        else:
            # 创建机构节点
            node_2 = Node(label_2, name=institutions[i])
            graph.create(node_2)
            # 创建关键词节点
            for j in range(len(keys[i])):
                node_1 = Node(label_1, name=keys[i][j])
                graph.create(node_1)
                rel = Relationship(node_1,"请求",node_2)
                graph.create(rel)
    return

if __name__ == '__main__':
    keys = contents
    for i in range(len(contents)):
        # 文本清洗
        contents[i] = clear(contents[i])
        # 分词
        contents[i] = cut_word(contents[i])
        # 除去停用词
        stopword = get_stopword()
        contents[i] = remove_stopword(contents[i],stopword)

    contents = [element for sublist in contents for element in sublist]

    createMapping(keys,institutions)

    print(f'总词汇量:{len(contents)}')
    c = Counter(contents)
    print(f'不重复词汇量:{len(c)}')
    common = c.most_common(15)

    createWorldCould(c)

 

标签:node,stopword,热词,graph,label,---,keys,图谱,contents
From: https://www.cnblogs.com/gnn40036/p/17474228.html

相关文章

  • Segment-Anything的一些相关论文总结
    1、SegmentAnythingModel(SAM)EnhancedPseudoLabelsforWeaklySupervisedSemanticSegmentation https://avoid.overfit.cn/post/92f50aa2951d4dd89cfc4fe71e0531ef......
  • TypeScript进阶--模块化(跟着ChartGpt学习)
    以下都是我的ChartGpt老师教学的内容哦,(若想知道怎么用ChartGpt学习,或者想知道我的问答方式,可以点这个查看我的学习记录)一:模块化的概念和优点在JavaScript中,我们通常使用全局变量和函数来组织我们的代码,这样容易导致命名冲突、代码复杂、可维护性差等问题。而模块化则是一种更好......
  • python学习笔记33-将标准输出打印到文件中
    importsys#保存原始的stdout,方便后续恢复out_tmp=sys.stdout#将stdout重新定向到文件,这样输出的标准输出的内容就会输出到文件中sys.stdout=open('help.QWidget.rpt','w')#执行help命令,标准输出打印内容,此时会打印到文件中fromPyQt5.QtWidgetsimport......
  • 北京市政百姓信件分析---使用selenium爬取信件信息
    下载selenium使用管理员打开cmd'pipinstallselenium查看版本pipshowselenium下载 WebDriver驱动谷歌浏览器chromedrive:http://chromedriver.storage.googleapis.com/index.html火狐浏览器geckodriver:https://github.com/mozilla/geckodriver/releasesIE浏览器IEDr......
  • python学习笔记34-获取函数的help信息
    list_for_help=list()list_for_help.append("PyQt5.QtCore")list_for_help.append("PyQt5.QtCore.QTime")list_for_help.append("PyQt5.QtGui")list_for_help.append("PyQt5.QtGui.QColor")list_for_help.append("PyQt5......
  • SQL简介-通用语法-分类
       ......
  • Linux:查看、删除特殊字符--开头的文件
    (目录)问题描述突然有一天,发现目录下有一个特殊的文件,是--开头的,有可能是误操作生成的文件使用cat命令查看文件,是无法查看的;使用rm命令删除文件,也是无法删除的$ls--demo.txt#使用cat查看文件$cat--demo.txtcat:无法识别的选项“--demo.txt”Try'cat--help'for......
  • 6-12|如何获取entry组建的值
    想要获取`Entry`组件中输入的值,可以使用以下两种方法:1.`get()`方法`get()`方法可以返回`Entry`组件中的文本,例如:```pythonimporttkinterastkroot=tk.Tk()entry=tk.Entry(root)entry.pack()defget_entry_value():  value=entry.get()  print(value)bu......
  • 1.基础知识(5) --Matlab中特殊符号使用总结
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • listeners和v-model
    <template> <divid="app">  <LoadingButton@click="handlesClick"></LoadingButton>  <ceShi2></ceShi2> </div></template><script>importLoadingButtonfrom'@/compone......