@
Kinnice @
Weixiao0725 @
adoni @
aijam @
coderluan @
fyq @
killva4624 @
laqow @
litguy @
liyafe1997 非常感谢各位的帮助!就不一一回复,几位大佬我一起感谢先
先非常感谢对多线程和进程的区分,我已经开始用 multiprocessing module 了,在我的 M1max 上基本上十个小时可以做完,对于雍正可以接受了。但是随着搜索对象正则式的复杂化我怀疑还要更久更久,而且雍正才干几年,乾隆的起居录估计有十倍大,可能个人电脑还是不够。
然后几位大佬怀疑算法有没有问题,我也不知道哪里可以改善的。我把最简单的版本(算二字成词率)代码放在这里,辣大家的眼可能,但是真心请问如果有耐心看完的大佬:有没有改进的空间?如果是单线程的话,我可以从头到尾扫描,扫过的不再碰,复杂度是 n^2/2 ,但是因为多线程,把文本分成多块就没头没尾的,复杂度是 n^2 但是可以多核平均。
checkdict = [] #已经查过的单词词库
list = [] #文本本身
step = 100000 #每个机器人负责多大块
with open('yong3.txt', 'r') as file:
contents = file.read()
for chr in contents:
if chr != '\n' and chr != ' ' and chr != '。' and chr != '、' and chr != '○' and chr != '\u3000': #有些奇怪的字符去掉
list.append(chr)
length = len(list) #雍正大概 100 万字
import multiprocessing.pool #import the multiprocessing module
def worker(num):
"""Worker function for the process"""
print(f'Worker {num} starting')
count = 0
for i in range(0+step*num,min(step+step*num,length-2)): #每个机器人负责 #step 长度的文字
if (list[i:i+2] not in checkdict): #如果不在字典里
count = 0
for j in range(0,length-2): #全本比对,因为分块似乎只能这么做,不能从 i 开始?
if list[i:i+2] == list[j:j+2]:
count = count + 1
checkdict.append(list[i:i+2]) #check 完,添进已查字典
if count > 350: #出现次数高于 350 次的字显示出来
print (list[i:i+2])
print(i, count, f"{num}th worker at percentage = {format((i/step-num)*100, '.2f')}%" )
print(f'Worker {num} finished')
还是挺好玩的,发现很多有趣的事实,比如弄死了年羹尧雍正还常提,比如他喜欢的十三弟其实没那么常提。我其实拿清史资料是因为手头方便,下一步更想用 Colibri Core 处理黏着语(黏着语,比中文不一样的地方在于一个词根会有很多变化,比如 love, loves, loving )。
想问调用 Calobri Core 这样的库啊包的各位大佬还有什么建议呢?还是照着 ChatGPT 的做?(我的 Python 真的很生,刚学,小时候会用 c )
然后想问下,如果有人有时间帮小的看了这个案例,这种算法用显卡( CUDA )来帮助做会有帮助吗?或者我下一步弄大了,比如一千万字的更加模糊的搜索(比如犹太注经动辄几千万),有什么好的建议提速呢?可以借学校的服务器或者云吗?但是感觉云的 CPU 频率应该也一般。
非常感谢大家指路!小的刚刚用电脑编程对付这些,求拍求建议求更多工具。