【每周一坑】三国演义中谁的存在感最强 +【解答】暴力计算圆周率

简介: 当然,精确统计是比较复杂的,比如同样是刘备,可以是 刘备、玄德、刘豫州、刘皇叔、使君、先主、备,而同样的 主公、丞相、将军 这些称谓在不同语境下指的又是不同的人。这里我们就只粗略算个大概即可,统计哪些个名字出现次数最多。你可以尽量让结果更接近实际值。

自然语言处理(NLP)是人工智能的一个重要领域。在对中文做自然语言处理的时候,一个很基础的操作就是分词:因为中文不像英语有现成的单词划分,需要将汉字序列切分成一个个单独的词,以便于后续的处理和分析。


今天我们的题目就是:


统计出《三国演义》书中被提及最多的角色


当然,精确统计是比较复杂的,比如同样是刘备,可以是 刘备、玄德、刘豫州、刘皇叔、使君、先主、备,而同样的 主公、丞相、将军 这些称谓在不同语境下指的又是不同的人。这里我们就只粗略算个大概即可,统计哪些个名字出现次数最多。你可以尽量让结果更接近实际值。


这是我的结果,数值仅供参考。


为了方便大家,我已经准备好了《三国演义》的 txt 文件,UTF8 和 GBK 的版本都有,


其实我们之前做过一些类似的案例,比如:

数据分析:当赵雷唱民谣时他唱些什么?


在知乎上逛一逛,你会发现现在很多人写的有关 Python 的文章都在用这个套路:


  1. 采集相关的文本
  2. 中文分词
  3. 统计词频
  4. 生成词云


当然也有些更厉害的,比如:用机器学习判定红楼梦后40回是否曹雪芹所写


所以,今天的附加题是开放式的,你可以在统计分词的基础上,发挥更多的想象力:图表可视化、生成词云、分析人物的关联性、人物出场分布等等。


详细解答和参考代码将在下次栏目中给出,也可以其他同学在留言中的代码。

期待各位同学提交解答。

提交代码可以使用 paste.ubuntu.com

codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。



【解答】暴力计算圆周率


上次的题目,提示了两种方法:均匀点阵、蒙特卡洛方法。


这里有个细节要注意,如果过你用点阵的话,圆心位置的选取,会直接影响到结果的准确度。因为如果把圆心设在点上,距离 R 的范围内,直径上是有 2R + 1 个点;而设在点的间隔之间,直径则是 2R 个点。那么这时候,分母选择 R² 还是 (R+1)²,结果就不一样了。


一个简单的实现:


R = 10000
R2 = R * R
count = 0
for x in range(-R, R+1):
    for y in range(-R, R+1):
        if x * x + y * y <= R2:
            count += 1
print(count / R2)


蒙特卡洛法 + 绘图:


import matplotlib.pyplot as pltimport random
R = 60
R2 = R * R
x_in = []
y_in = []
x_out = []
y_out = []
for i in range(100000):
    x = random.random() * 2 * R - R
    y = random.random() * 2 * R - R
    if x * x + y * y > R2:
        x_out.append(x)
        y_out.append(y)
    else:
        x_in.append(x)
        y_in.append(y)
plt.figure(figsize=(16, 16))
plt.scatter(x_out, y_out, color='blue', marker='.', linewidths=0.1, alpha=0.3)
plt.scatter(x_in, y_in, color='red', marker='.', linewidths=0.1, alpha=0.3)
plt.scatter(0, 0, color='black')
plt.show()
print(len(x_in) / (len(x_in) + len(x_out)) * 4)


上次提交答案的同学有:

hoshea、a87g5o、张钒、谢谢谢伟、Cool、王文亚、Famisi、星星

大部分同学都提供了2种不同解法,Cool 和 王文亚 还实现了无穷级数法。


感谢各位同学的参与。

期待在下一期中看到你的代码!


回复关键字:

python :零基础入门课程目录

新手 :初学者指南及常见问题

资源 :超过500M学习资料网盘地址

项目 :十多个进阶项目代码实例

如需了解视频课程及答疑群等更多服务,请号内回复 码上行动

代码相关问题可以在论坛上发帖提问 bbs.crossincode.com

推荐阅读:

爬抖音 | AI名画| 押韵工具 | 虎扑 | 如何debug | 苹果 | 查天气 | 我用Python | 知乎 | 排序 | 电影票 | 技术宅 | 单词表 | 新手建议 

相关文章
|
4月前
|
算法 Python
Python技术分享:使用穷举法解决鸡兔同笼问题
Python技术分享:使用穷举法解决鸡兔同笼问题
119 1
|
4月前
hpu-1690-CZY的组合数烦恼
hpu-1690-CZY的组合数烦恼
29 0
|
4月前
|
C语言
青蛙跳台阶:我如何得知它是一道斐波那契数列题?——应用题破题“三板斧”(一)
这篇内容介绍了C语言学习中的经典例题——斐波那契数列,强调了解题思路的重要性。斐波那契数列是一个数列,其中每个数是前两个数的和。文章指出,很多类似题目,如“青蛙跳台阶”,实质上都在考察斐波那契数列的实现。文中提供了斐波那契数列的定义、代码实现和递归与非递归的思路,并鼓励读者从问题中分析出解题模型,而非直接套用已知方法。此外,还提及了一道相关题目“矩形覆盖问题”,以供进一步练习。
35 0
|
4月前
|
机器学习/深度学习 算法 测试技术
青蛙跳台阶:我如何得知它是一道斐波那契数列题?——应用题破题“三板斧”(二)
这篇内容是关于解题策略的,主要介绍了在面对应用题时可以采用的“三板斧”方法:举例、模拟和找规律。通过一个走楼梯的例子详细解释了这三个步骤如何运用。首先,举例将抽象问题具体化,比如走5级台阶有几种方式。其次,通过模拟不同情况,例如思考走每一步的可能,发现递归或循环的模式。最后,通过找规律归纳出一般性的解决方案,这里发现走台阶问题与斐波那契数列相关。文章还提到了一个拓展案例——矩形覆盖问题,同样可以用类似的方法分析。总的来说,文章强调了解题过程中理解和转化问题的重要性,以及通过训练提升这方面能力。
40 0
leetcode 1921. 消灭怪物的最大数量(每日一题)
leetcode 1921. 消灭怪物的最大数量(每日一题)
73 0
|
存储 移动开发 算法
C++/PTA 关于深度优先搜索和逆序对的题应该不会很难吧这件事
背景知识 深度优先搜索与 DFS 序 深度优先搜索算法(DFS)是一种用于遍历或搜索树或图的算法。以下伪代码描述了在树 T 上进行深度优先搜索的过程
109 0
四道好题分享(看似简单,但是棘手)
四道好题分享(看似简单,但是棘手)
95 0
|
存储 算法 vr&ar
算法步步为营(02)-两数之和
两个非空链表,表示两个非负整数。它们每位数字都是逆序存储,且每个节点只能存储一位数字。 将两个数相加,并以相同形式返回一个表示和的链表。除了数字 0 之外,这两个数都不会以 0 开头。
96 0
|
机器学习/深度学习 算法 索引
算法步步为营(1)-两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。可以按任意顺序返回答案。
79 0
|
算法 JavaScript 前端开发
日拱算法:解两道“杨辉三角”题
什么是“杨辉三角”,想必大家并不陌生~~ 在「杨辉三角」中,每个数是它左上方和右上方的数的和。