大数据大作业(课程设计)

news2024/12/24 2:30:39

题目:信息爬取字数统计及可视化

内容及要求:

  • 配置Hadoop平台;
  • 利用爬虫技术爬取任一门户网站新闻栏目一定时间段内的新闻信息,保存为一个或多个文件并上传到Hadoop平台以本人学号命名的文件夹下;
  • 利用MapReduce框架编程完成字数统计;
  • 利用Echarts或其他可视化平台,使用四种不同可视化效果分别展示出现频次前5、前10、前20、前50的单词可视化效果网页。

 前言

        本课题为信息爬取字数及可视化,首先使用Python编程爬取了凤凰网门户网站新闻栏目22/7/26—7/28三天内的新闻信息,其次,将爬取的新闻整合为一个文件,然后使用Python编程对文件进行分词处理并且可以获取词云,接下来将该文件上传至hadoop平台,利用MapReduce框架编程完成了字数统计,接着就是利用Python编程对字数统计文件中的词频由高到低进行排序,得到出现频次排名前5、前10、前20、前50的词语,最后根据排好序的词语利用Echarts平台分别完成4种可视化效果网页。

      本课题中涉及到的主要技术有:MapReduce框架编程进行字数统计、Python编程使用selenium库爬取网站动态新闻、Python编程对文本分词处理、Python编程对词频排序、利用Echarts平台展示词语可视化效果网页。

        开发环境:Linux系统、Hadoop平台、Echarts平台、Python环境

        软件工具:Pycharm 、Anaconda 、VMware Workstation Pro


项目实现

1.1 功能1——爬取新闻

Python爬取凤凰网门户网站新闻栏目三天内的新闻信息

1.2 实现原理

通过程序,模拟浏览器向服务器定期发送请求、获取信息、分析信息并储存我们想要的内容。

1.3 主要步骤及代码

(1)主要步骤:

        1、向凤凰网新闻网站发送请求

    browser = webdriver.Edge()
    browser.get('https://www.ifeng.com')

        2、获取门户新闻栏目超链接

    page_text = browser.page_source

    tree = etree.HTML(page_text)

    li_list = tree.xpath('//*[@id="root"]/div/div[6]/div[2]/div[2]/div[2]')

    for li in li_list:

        con = li.xpath('./p[@class="news_list_p-3EcL2Tvk "]/a/@href')

        3、根据获取的新闻超链接发送请求 

    for i in range(len(con)):
        htt = "" + con[i]
        browser.get(htt)

        4、获取每个链接内的新闻文本 

        text = browser.page_source
        ee = etree.HTML(text)
   	    lis=ee.xpath('//*[@id="root"]/div/div[2]/div[2]/div/div[1]/div/div/div[1]')
        for j in lis:
            ls.append(j.xpath('./p/text()'))

        5、保存新闻文本

    fo = open('爬取新闻文件/XinWen{}.txt'.format(v), 'w', encoding='utf-8')
    ans = ''
    ans += str(ls)
    fo.write(ans)
    fo.close()

        6、间隔一定时间自动爬取(时间自设)

    h = 23
    m = 59
    v = 0
    while True:
        now = datetime.datetime.now()
        if now.hour == h and now.minute == m:
            v += 1  #生成文件名递增
            h += 6  #每隔多长时间爬取一次
            h %= 24
            getCon(v)
            print("现在时间:{}".format(now))
            print("下一次爬取时间:{}时{}分".format(h,m))
            # 执行完休息60秒避免重复
            time.sleep(60)
        # 每隔60秒检测一次,不然会漏
        time.sleep(60)

(2)实现效果图:

图 1-1 爬取结果

 

图 1-2 爬取结果


2.1 功能2——文本分词处理

对爬取的新闻文本进行分词处理,以便下一步词频统计

2.2 实现原理

利用python的jieba库这个第三方中文分词函数库,能够将一段中文文本分割成中文词语的序列。jieba库的分词原理是利用一个中文词库,将待分词的内容与分词词库进行比对,通过图结构和动态规划方法找到最大概率的词组。

2.3 主要步骤及代码

(1)主要步骤:

        1、对新闻文本进行精确模式分词

f = open("合集.txt", "r", encoding="utf-8")
ls=jieba.lcut(f.read())
f.close()

        2、定义停用词即不参与后期统计的词语

sf = "停用词/停用词.txt"
stop_words = []
with open(sf,'r',encoding='utf-8') as f:
    for i in f.read().splitlines():
        stop_words.append(i)

        3、将分词后的文本进行正则化,只保留文本,再次分词

la = re.sub(r'[\s\[|\]0123456789,、,。’+?!”“\']',"",str(ls))
txt0 =jieba.lcut(la)

        4、将正则化后的文本中包含的停用词过滤掉,之后保存到文本文件

ans = []
for x in txt0:
    if x not in stop_words and len(x) > 1:
        ans.append(x)
res = " ".join(ans)
with open('分词文件/a1.txt','w',encoding='utf-8') as fi:
    fi.write(res)

        5、针对要统计次频的文本进行词云展示(本步非必要)

wd=wordcloud.WordCloud(font_path='C:\Windows\Fonts\simkai.ttf',width=1800,height=1800,background_color='white',stopwords=['要求','甚至','此次','虽然','发现','继续','一个']).generate(res)
wd.to_file('新闻.png')

(2)效果展示:

原合集文件内容:

图 2-1 原文件内容展示

分词后效果:

图 2-2 分词后效果

生成词云效果图:

不使用蒙版—>

图 2-3 词云图(原始)

使用蒙版效果图如下(可自定义词云形状)—>

图 2-4 词云图(蒙版)


3.1 功能3——新闻词频统计

利用MapReduce框架编程对词频进行统计

3.2 实现原理

MapReduce模型核心是Map函数和Reduce函数,核心思想可以用分而治之来描述。一个大的MapReduce作业首先会被拆分为多个Map任务并行执行,当Map任务全部结束后,Reduce过程开始,并且Map生成的中间结果会以<key,value>形式送到多个Reduce中进行合并,合并的过程中,有相同的key的键/值对则送到同一个Reduce上,并由Reduce具体计算出单词所对应的频数。

3.3 主要步骤及代码

(1)主要步骤:

        1、进行统计前,我们首先要在Linux环境下配置好hadoop平台后,在进行编程处理

                详细配置过程可参考hadoop配置

        2、利用MapReduce框架编程并生成可执行jar包

public class lihongbo {

    public lihongbo() {}

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();  // 创建一个对象,用于读取配置文件
        String[] otherArgs = (new GenericOptionsParser(conf, args)).getRemainingArgs();
        // 获取命令行中除了配置文件以外的其他参数
        if(otherArgs.length < 2) {
            System.err.println("Usage: wordcount <in> [<in>...] <out>");
            System.exit(2);
        }
        // 如果参数不足两个,则输出用法提示并退出程序

        Job job = Job.getInstance(conf, "word count");  // 创建一个作业对象
        job.setJarByClass(lihongbo.class);  // 设置作业运行时使用的 JAR 文件
        job.setMapperClass(lihongbo.TokenizerMapper.class);  // 设置 Mapper 类
        job.setCombinerClass(lihongbo.IntSumReducer.class);  // 设置 Combiner 类(可选)
        job.setReducerClass(lihongbo.IntSumReducer.class);  // 设置 Reducer 类
        job.setOutputKeyClass(Text.class);  // 设置输出键类型
        job.setOutputValueClass(IntWritable.class);  // 设置输出值类型

        for(int i = 0; i < otherArgs.length - 1; ++i) {
            FileInputFormat.addInputPath(job, new Path(otherArgs[i]));  // 添加输入路径
        }
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));  // 设置输出路径

        System.exit(job.waitForCompletion(true) ? 0 : 1);  // 启动作业并等待其完成,返回状态码 0 表示成功,1 表示失败
    }

    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
        // 定义一个 Mapper 类,继承自 Mapper<Object, Text, Text, IntWritable>

        private static final IntWritable one = new IntWritable(1);  // 定义一个常量 one,值为 1
        private Text word = new Text();  // 定义一个文本类型变量 word

        public TokenizerMapper() {
            // 构造函数,没有实际操作
        }

        public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) 
                throws IOException, InterruptedException {
            // 实现 Mapper 类中的 map 函数,对输入数据进行处理

            StringTokenizer itr = new StringTokenizer(value.toString());  // 将输入数据转化为字符串
            while(itr.hasMoreTokens()) {  // 如果还有单词可以读取
                this.word.set(itr.nextToken());  // 获取下一个单词
                context.write(this.word, one);  // 输出键值对,键为单词,值为 one
            }
        }
    }

    public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        // 定义一个 Reducer 类,继承自 Reducer<Text, IntWritable, Text, IntWritable>

        private IntWritable result = new IntWritable();  // 定义一个整数类型变量 result,用于保存累加结果

        public IntSumReducer() {
            // 构造函数,没有实际操作
        }

        public void reduce(Text key, Iterable<IntWritable> values, 
                           Reducer<Text, IntWritable, Text, IntWritable>.Context context)
                throws IOException, InterruptedException {
            // 实现 Reducer 类中的 reduce 函数,对经过 Mapper 处理后的数据进行汇总

            int sum = 0;  // 定义一个整数变量 sum,用于保存累加结果
            for(IntWritable val : values) {  // 遍历键值对列表
                sum += val.get();  // 累加键值对的值
            }
            this.result.set(sum);  // 将累加的结果设置为 result 的值
            context.write(key, this.result);  // 输出键值对,键为单词,值为累加结果
        }
    }
}

        3、将做好的新闻分词文件上传至hadoop平台

              通过xftp将分词文本上传至Linux系统中的B20041316目录下

./bin/hdfs dfs -mkdir B20041316    #在hdfs上生成一个目录

#将文件上传至hdfs中的B20041316目录下

./bin/hdfs dfs -put ./B20041316/a1.txt B20041316

        4、将java程序生成可执行jar包后运行

# 运行可执行jar文件进行词频统计
./bin/hadoop jar ./myapp/WordCount.jar B20041316 output

        5、查看运行结果

./bin/hdfs dfs -cat output/*

(2)实现效果图:

图 3-1 词频统计完成

图 3-2 词频统计结果

ps:使用Python实现词频统计

with open('../分词结果/a1.txt', 'r', encoding='utf-8') as f:
    lines = f.read().split()
dic = {}
for w in lines:
    dic[w] = dic.get(w, 0) + 1
ls = list(dic.items())
ls.sort(key=lambda x:x[0])
f = open('../词频统计结果/out.txt', 'w', encoding='utf-8')
for i in range(len(ls)):
    f.write('{} {}\n'.format(ls[i][0],ls[i][1]))
f.close()

4.1 功能4——对词频进行排序

由于得到的词频是根据字词进行排序的,而不是字词出现的次数,在几千行词频中无法直接找到前50组,要进行排序,以便于进行可视化网页展示

4.2 实现原理

由于每个词频中的词是不同的,唯一的,利用python中的字典来存储词和频次,对字典中元组进行排序即可得到频次排名前5前、前10、前20、前50的词频

4.3 主要步骤及代码

(1)主要步骤:

        1、使用Python将词频存入字典中

with open('outcome.txt', 'r',encoding='utf-8') as f:
    lines = f.readlines()
dic = {}
for line in lines[:-1]:
    lk = line.strip("\n").split("\t")
    dic[lk[0]] = dic.get(lk[0],int(lk[1]))

        2、对词频进行排序并输出前5、前10、前20、前50排名的词频

li = list(dic.items())
li.sort(key=lambda x:x[1],reverse=True)
print('词频前5:',li[:5])
print("-------------------------------------------------")
print('词频前10:',li[:10])
print("-------------------------------------------------")
print('词频前20:',li[:20])
print("-------------------------------------------------")
print('词频前50:',li[:50])

(2)实现效果图:

   

图 4-1 词频排序结果


5.1 功能5——可视化网页展示词频结果

利用Echarts根据词频排序结果分别进行4种不同的可视化效果展示。

关于Echarts,我们可以访问Echarts官方文档快速了解它

5.2 实现原理

ECharts 是一个轻量级的 javascript 图形库,纯 js 实现,MVC 封装,数据驱动,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器,底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。利用得到的排序结果中的数据就可以很轻松的将词频数据以图表的形式进行可视化

5.3 主要步骤及代码

(1)主要步骤:这里以前排名前5的词频为例

        1、编写柱状图JavaScript代码,载入数据

<script src="../static/echarts.js"></script>       <!--引入js文件-->

<div id="main" style="width: 1000px;height:600px;"></div>
<script type="text/javascript">
    // 初始化echarts实例
    var myChart = echarts.init(document.getElementById('main'));
    //    [('中国', 424), ('美国', 320), ('俄罗斯', 251), ('空间站', 215), ('国家', 200)]排序得到的数据
    // 指定图表的配置项和数据
    var xDataArr = ['中国','美国','俄罗斯','空间站','国家']
    var yDataArr = [424, 320, 251, 215, 200]
    var option = {
        title: {
            text: '词频前5--柱状图',
            top: '1%',
            left: '10%'
        },
        tooltip: {
            trigger:'axis',
            triggerOn: 'click',
            formatter: function (res) {
                return res[0].name + res[0].data
            }
        },
        toolbox:{
          feature:{
              saveAsImage: {},//导出图片
              dataView: {},//数据视图
              restore:{},//重置
              dataZoom:{},//区域缩放
              magicType: {
                  type:['bar','line','pie']
              }//动态类型图表转换
          }
        },

        legend: {
            data: ['词频']
        },
        xAxis: {
            data: xDataArr
        },
        yAxis: {},
        series: [
            {
                name: '词频',
                type: 'bar',
                data: yDataArr,
                label: {
                    show: true
                }
            }
        ]
    };
    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);
</script>

        2、编写折线图JavaScript代码,载入数据

<script src="../static/echarts.js"></script>   <!-- 引入 Echarts.js 文件 -->


<div id="main" style="width: 1000px;height:600px;"></div>
<script type="text/javascript">

    // 初始化echarts实例
    var myChart = echarts.init(document.getElementById('main'));

    //    [('中国', 424), ('美国', 320), ('俄罗斯', 251), ('空间站', 215), ('国家', 200)] 排序得到的数据
    // 指定图表的配置项和数据
    var xDataArr = ['中国','美国','俄罗斯','空间站','国家']
    var yDataArr = [424, 320, 251, 215, 200]
    var option = {

        title: {
            text: '词频前5--折线图',
            top: '1%',
            left: '10%',
        },

        tooltip: {
            triggerOn: 'click'
        },

        xAxis: {
            data: xDataArr,
            type: 'category',
            boundaryGap: 'false'
        },

        yAxis: {
            type: 'value',
            // scale:"true"
        },

        series: [
            {
                name: '单词',
                type: 'line',
                data: yDataArr,
                label: {
                  show: true
                },

                markPoint: {
                    data: [
                        {
                            type: 'max'
                        },

                        {
                            type: 'min'
                        }
                    ]
                },

                markLine: {
                    data: [
                        {
                            type: 'average'
                        }
                    ]
                }
            }
        ]
    };

    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);
</script>

        3、编写饼图JavaScript代码,载入数据

 <!-- 引入 Echarts.js 文件 -->
<script src="../static/echarts.js"></script>

<div id="main" style="width: 1000px;height:600px;"></div>
<script type="text/javascript"> 
    // 初始化echarts实例
    var myChart = echarts.init(document.getElementById('main'));

    //    [('中国', 424), ('美国', 320), ('俄罗斯', 251), ('空间站', 215), ('国家', 200)] 排序得到的数据
    // 指定图表的配置项和数据
    var pieData = [
        {name: '中国',value: 424},
        {name: '美国',value: 320},
        {name: '俄罗斯',value: 251},
        {name: '空间站',value: 215},
        {name: '国家',value: 200}
    ]
    var option = {
        title: {
            text: '词频前5--饼图',
            top: '1%',
            left:'10%'
        },
        tooltip: {
            triggerOn: 'click'
        },
        series: [
            {
                type: 'pie',
                data: pieData,
                label: {//饼图文字的显示
                    formatter: function (res) {
                        return res.name + ' 出现次数' + res.value + "次\n占总量" + res.percent+'%'
                    }
                }
            }
        ],
        selectedMode: 'single' //选中效果
    };
    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);
</script>

        4、编写南丁格尔图JavaScript代码,载入数据(用于词频前5,前10)

<!-- 引入 Echarts.js文件 -->
<script src="../static/echarts.js"></script>

<div id="main" style="width: 1000px;height:600px;"></div>
<script type="text/javascript">
    // 初始化echarts实例
    var myChart = echarts.init(document.getElementById('main'));

    //    [('中国', 424), ('美国', 320), ('俄罗斯', 251), ('空间站', 215), ('国家', 200)] 排序得到的数据
    // 指定图表的配置项和数据
    var pieData = [
        {name: '中国',value: 424},
        {name: '美国',value: 320},
        {name: '俄罗斯',value: 251},
        {name: '空间站',value: 215},
        {name: '国家',value: 200}
    ]
    var option = {
        title: {
            text: '词频前5--饼图',
            top: '1%',
            left:'10%'
        },
        tooltip: {
            triggerOn: 'click'
        },
        series: [
            {
                type: 'pie',
                data: pieData,
                label: {//饼图文字的显示
                    formatter: function (res) {
                        return res.name + ' 出现次数' + res.value + "次\n占总量" + res.percent+'%'
                    }
                }
            }
        ],
        selectedMode: 'single' //选中效果
    };
    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);
</script>

        5、编写圆环图JavaScript代码,载入数据(用于词频前20,前50)

<!-- 引入Echarts.js 文件 -->
<script src="../static/echarts.js"></script>

<div id="main" style="width: 1000px;height:600px;"></div>
<script type="text/javascript">
    // 初始化echarts实例
    var myChart = echarts.init(document.getElementById('main'));

    // 指定图表的配置项和数据
    var pieData = [
        {name: '中国',value: 424},
        {name: '美国',value: 320},
        {name: '俄罗斯',value: 251},
        {name: '空间站',value: 215},
        {name: '国家',value: 200}
    ]
    var option = {
        title: {
            text: '词频前5--圆环图',
            top:'1%',
            left:'10%'
        },
        tooltip: {
            triggerOn: 'click'
        },
        series: [
            {
                type: 'pie',
                radius: ['50%','85%'], //圆环图
                data: pieData,
                label: {//文字的显示
                    formatter: function (res) {
                        return res.name + ' 出现次数' + res.value + "次\n占总量" + res.percent+'%'
                    }
                }
            }
        ],
        selectedMode: 'single' //选中效果
    };
    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);
</script>

(2)实现效果图

柱状图:

图 5-1-1 柱状图

折线图:

图 5-2-1 折线图

饼图:

图 5-3-1 饼图

南丁格尔图:

图 5-4-1 南丁格尔图

圆环图:

图 5-4-3 圆环图

===============================华丽的分割线================================

 ps:本文附有视频简单介绍-->简单介绍

夜深沉,星光隐,时间匆匆逝去。 春去秋来,岁月如梭织, 花谢花开,往事已成风景。

又到一年7月份,岁月的流年,恍若一瞬即逝,人生短暂,需好好珍惜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/668907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS3-显示模式

显示模式 1 块级显示 2 行内显示 3 行内块显示 4 元素显示模式转换 5 拓展 1 块级显示 属性&#xff1a;display:block 显示特点&#xff1a; 1 独占一行&#xff08;一行只能显示一个&#xff09; 2 宽度默认是父元素的宽度&#xff0c;高度默认由内容撑开 3 可以设置宽高 代表…

Cortext-M3系统:异常系统(5)

1、使用中断 在CM3中&#xff0c;NVIC为我们搞定了使用中断时的很多例行任务&#xff0c;如优先级检查、入栈/出栈、取向量等。不过在NVIC能行使职能之前&#xff0c;还需要我们做好如下的初始化工作&#xff1a;建立堆栈、建立向量表、分配各中断的优先级、使能中断。 1.1 建…

node笔记_读取目录的文件

文章目录 ⭐前言⭐fs.readdirSync&#x1f496; 读取目录 不加withFileTypes&#x1f496; 读取目录 加withFileTypes&#x1f496; 读取目录时 判断元素文件还是目录 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于node读取目录文件 往期文章 node_wind…

【java】Jconsole 开启远程连接遇到的一些坑

文章目录 背景一、JMX二、配置远程连接2.1、Java 程序启动2.2、tomcat 启动2.3、无法远程问题排查2.4、解决方案 三、关闭 tomcat 报错3.1、问题分析3.2、问题解决 总结 背景 最近在学习 JVM&#xff0c;其中涉及到性能、内存等指标分析需要使用工具分享&#xff0c;Java 提供…

dvwa靶场通关(六)

第六关&#xff1a;Insecure CAPTCHA&#xff08;不安全的验证码&#xff09; 不安全的验证码&#xff1f;不是这个意思&#xff0c;而是指验证码验证可以被绕过。怎么绕&#xff1f;一般都是验证码的验证和最终修改的验证分离&#xff0c;导致了中间过程&#xff08;验证码的…

io.netty学习(八)零拷贝原理

目录 零拷贝 传统I/O操作存在的性能问题 零拷贝技术原理 虚拟内存 mmap/write 方式 sendfile 方式 带有 scatter/gather 的 sendfile方式 splice 方式 总结 io.netty学习使用汇总 零拷贝 零拷贝&#xff08;Zero-Copy&#xff09;是一种 I/O 操作优化技术&#xff0c…

总结906

学习目标&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲&#xff0c;背诵15篇短文&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化3讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日规划 今日已做&#xff1a; 1.回环背诵…

chatgpt赋能python:Python捕捉按键:探索基础和应用

Python捕捉按键&#xff1a;探索基础和应用 Python作为高级编程语言&#xff0c;可以用于各种任务&#xff0c;例如数据分析、机器学习、图形用户界面等等。其中&#xff0c;捕捉用户键盘输入是一个常见的任务&#xff0c;它可以用于实现简单的游戏、命令行应用和用户交互&…

Redis持久化说明及其单台Linux服务器搭建Redis集群架构

一.Redis持久化方式 1.1 RDB快照 说明&#xff1a;RDB快照主要以二进制文件的形式进行存储数据&#xff0c;主要以文件名dump.rdb进行存储&#xff0c;主要设置redis.conf里面设置’save 60 1000’命令可以开启&#xff0c; 表示在60秒内操作1000次进行一次备份数据。在客户端…

《网络安全0-100》网络安全工具

网络安全工具 抓包工具 抓包工具是网络安全领域中常用的一种工具&#xff0c;用于捕获和分析网络数据包&#xff0c;帮助用户了解网络流量、发现网络攻击和漏洞等问题。以下是几个常用的抓包工具&#xff1a; Wireshark&#xff1a;Wireshark是一种开放源代码的网络协议分析工…

软考A计划-系统集成项目管理工程师-信息化知识(五)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Unity核心6——Animation

一、动画窗口 ​ 通过 Window --> Animation --> Animation 打开 Animation 窗口 ​ Animation窗口主要用于在 Unity 内部创建和修改动画&#xff0c;所有在场景中的对象都可以通过 Animation 窗口为其制作动画 ​ 原理&#xff1a; ​ 制作动画时&#xff1a;记录在…

chatgpt赋能python:Python提供的68个内置函数:一个全面的指南

Python提供的68个内置函数&#xff1a;一个全面的指南 Python是一种强大的编程语言&#xff0c;具有出色的生态系统和强大的功能。它提供了许多内置函数&#xff0c;这些函数可以使你的编程任务变得更加容易和高效。本篇文章将介绍Python提供的68个内置函数&#xff0c;帮助你…

chatgpt赋能python:Python排版快捷键:提高效率的必备技能

Python排版快捷键&#xff1a;提高效率的必备技能 随着Python编程语言的广泛应用&#xff0c;作为开发者&#xff0c;我们不仅需要注重代码质量&#xff0c;还需要注重代码的可读性。在编写Python代码时&#xff0c;排版也是一项重要的任务。好的排版不仅使代码更易于理解&…

k8s日志收集组件 Grafana loki --- 理论篇

当我们在k8s上运行程序时&#xff0c;习惯的会使用ELK来收集和查询程序运行日志。今天我们介绍一款新的专为日志收集而生的神器&#xff1a;Grafana loki。Grafana Loki 是一组组件&#xff0c;可以组合成一个功能齐全的日志堆栈。 与其他日志记录系统不同&#xff0c;Loki 仅…

VUE 2X 数据代理 ④

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs数据代理 什么是数据代理❓ 代理底层~ D e f i n e P r o p e r y DefinePropery DefinePropery V u e Vue Vue数据代理原理理解总结 文章有误…

Xubuntu22.04之便签工具(一百八十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

三、Kafka的消费全流程

Kafka的消费全流程 我们接着继续去理解最后这条消息是如何被消费者消费掉的。其中最核心的有以下内容。 1、多线程安全问题 2、群组协调 3、分区再均衡 多线程安全问题 当多个线程访问某个类时&#xff0c;这个类始终都能表现出正确的行为&#xff0c;那么就称这个类是线…

深度学习实战39-U-Net模型在医学影像识别分割上的应用技巧,以细胞核分割任务为例

大家好,我是微学AI,今天给大家介绍一下深度学习实战39-U-Net模型在医学影像识别分割上的应用技巧,以细胞核分割任务为例。本文将介绍在医学影像分割领域中应用U-Net模型的方法。我们将从U-Net模型原理出发,并使用PyTorch搭建模型,详细展示模型代码。接着,我们将展示一些医…

I.MX RT1170之FlexSPI(2):LUT表格的组成和FlexSPI结构体配置

从上一节FlexSPI的框图中可知&#xff0c;SEQ_CTL实现了对外部存储器的时序控制。不同的存储器有着不同的时序&#xff0c;这个时序就是由LUT(Look Up Table)指定的。LUT有它自己的寄存器&#xff0c;当我们设置好之后&#xff0c;外部存储器的读、写和擦除等操作就会根据LUT寄…