2020-04
26

算算书里有多少单词

By xrspook @ 18:12:57 归类于: 扮IT

算算书里有多少单词应该是很大路简单的事,但实际上各种状况层出不穷。有些是你料到的,比如排版的用了全角的标点符号,程序默认会删掉标点符号,万一排版那个没有规范地使用空格呢?有些是你不会料到的,比如手误创造出奇葩字符串。很早以前我就发现Notepad++和Word里算的字数是不一致的,Notepad++通常算出来的数都会大一些。谁对谁错,随缘吧,知道大概差不多也就行了,毕竟高考的时候你写少几个字不到800也不会真扣你的分。

字典和列表的相爱相杀我体会得越来越深刻了。

words.txt在这里,emma.txt在这里。

Exercise 1: Write a program that reads a file, breaks each line into words, strips whitespace and punctuation from the words, and converts them to lowercase. Hint: The string module provides a string named whitespace, which contains space, tab, newline, etc., and punctuation which contains the punctuation characters. Let’s see if we can make Python swear:
>>> import string
>>> string.punctuation
‘!”#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~’
Also, you might consider using the string methods strip, replace and translate.

Exercise 2: Go to Project Gutenberg (http://gutenberg.org) and download your favorite out-of-copyright book in plain text format. Modify your program from the previous exercise to read the book you downloaded, skip over the header information at the beginning of the file, and process the rest of the words as before. Then modify the program to count the total number of words in the book, and the number of times each word is used. Print the number of different words used in the book. Compare different books by different authors, written in different eras. Which author uses the most extensive vocabulary?

Exercise 3: Modify the program from the previous exercise to print the 20 most frequently used words in the book.

Exercise 4: Modify the previous program to read a word list (see Section 9.1) and then print all the words in the book that are not in the word list. How many of them are typos? How many of them are common words that should be in the word list, and how many of them are really obscure?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import string
fin = open('words.txt')
mydict = {}
for line in fin:
    word = line.strip()
    mydict[word] = ''
file = open('emma.txt', encoding = 'utf-8')
essay = file.read().lower()
essay = essay.replace('-', ' ')
pun = {}
str_all = '“' + '”' + string.punctuation
for x in str_all: # 建立各种标点符号字符的字典
    pun[x] = ''
useless = essay.maketrans(pun) # maketrans必须被替换和替换等长,字典完美解决这个问题
l = essay.translate(useless).split() # 那些含-的单词会死得很惨,但仍然算是个单词
print('this book has', len(l), 'words')
book = {}
for item in l: # 读取文件为字符串,字符串转为单词列表,列表转为计数的字典,单词为键,次数为键值
    book[item] = book.get(item, 0) + 1
list_words1 = sorted(list(zip(book.values(), book.keys())), reverse = True) # 字典转为列表,键与键值换位
print('this book has', len(list_words1), 'different words')
print('times', 'word', sep='\t')
count = 1
word_len = 0 # 限制最小词长
for times, word in list_words1: # 打印大于某长度用得最多的20个词(不限制,3个字母及以下最最简单的会刷屏)
    if len(word) > word_len:
        print(times, word, sep='\t')
        count += 1
    if count > 20:
        break
count = 0
for word in book:
    if word not in mydict:
        # print(word, end=' ')
        count += 1
print(count, 'words in book not in dict') # 结果惨不忍睹,合计590个
# this book has 164065 words
# this book has 7479 different words
# times   word
# 5379    the
# 5322    to
# 4965    and
# 4412    of
# 3191    i
# 3187    a
# 2544    it
# 2483    her
# 2401    was
# 2365    she
# 2246    in
# 2172    not
# 2069    you
# 1995    be
# 1815    that
# 1813    he
# 1626    had
# 1448    as
# 1446    but
# 1373    for
# 590 words in book not in dict
# -----------------------------解法二----------------------------- 其实就是切单词方法有差异
import string
def set_book(fin1):
    useless = string.punctuation + string.whitespace + '“' + '”'
    d = {}
    for line in fin1:
        line = line.replace('-', ' ')
        for word in line.split():
            word = word.strip(useless)
            word = word.lower()
            d[word] = d.get(word, 0) + 1
    return d
def set_dict(fin2):
    d = {}
    for line in fin2:
        word = line.strip()
        d[word] = d.get(word, 0) + 1
    return d
fin1 = open('emma.txt', encoding='utf-8')
fin2 = open('words.txt')
book = set_book(fin1)
mydict = set_dict(fin2)
l = sorted(list(zip(book.values(), book.keys())), reverse=True)
count = 0
for key in book:
    count = count + book[key]
print('this book has', count, 'words')
print('this book has', len(book), 'different words')
num = 20
print(num, 'most common words in this book')
print('times', 'word', sep='\t')
for times, word in l:
    print(times, word, sep='\t')
    num -= 1
    if num < 1:
        break
count = 0
for word in book:
    if word not in mydict:
        # print(word, end=' ')
        count += 1
# print()
print(count, 'words in book not in dict')
# this book has 164120 words
# this book has 7531 different words
# 20 most common words in this book
# times   word
# 5379    the
# 5322    to
# 4965    and
# 4412    of
# 3191    i
# 3187    a
# 2544    it
# 2483    her
# 2401    was
# 2364    she
# 2246    in
# 2172    not
# 2069    you
# 1995    be
# 1815    that
# 1813    he
# 1626    had
# 1448    as
# 1446    but
# 1373    for
# 683 words in book not in dict
2017-06
9

转战bilibili

By xrspook @ 9:43:44 归类于: 烂日记

昨天快下班的时候,网友找我,问我之前的Dangal幕后制作花絮是不是全部都已经做了翻译。我给他的回答是如果UTV有在油管放出来的,我全部都做了,除非刚刚新出的DVD或者蓝光里面还有别的部分。接着他发给我一张光盘目录的截图,显然上面的五个视频我都已经做过。接着,网友问我当时是上传到优酷还是土豆。土豆的上传速度要比优酷快,而且出来的视频质量也要比优酷好,除非土豆的审核无论如何都不通过,否则我是不会上传优酷。但也正是因为这样,不久前优酷跟土豆合并,二者的数据融为一体。但准确来说是优酷把土豆给吃了,所以现在管理界面都是优酷的,从前优酷跟土豆最大的区别在于他们的上传以及视频信息修改。优酷的界面相当的不友好。发生这种事后,网友默认从前优酷土豆的视频已经阵亡。因为从我的后台界面也可以看出很多视频都在显示转码中,而这些转码中的视频从前台观看通常显示404不存在。对我来说这种事还没什么所谓,只要转码完成出来的东西一定是一样的,因为我所有视频基本上插进去的都是硬字幕。但我的网友不一样,因为当时他是用mkv封装软字幕进去。他说当年之所以上传土豆不上传优酷是因为优酷的东西所有字幕居然变成了一条横线。现在他的某些视频的确被转码出来了,但问题是从前在土豆显示正常的字幕现在变成了一条横线,这就意味着视频经过了优酷再一次的转码,而且他说现在再传视频到优酷通常会审核不通过。

正是因为这样,所以他想我把视频都上传到bilibili。之前我也有这个打算,但是一直都还没有注册。现在视频发到b站是年轻人的主流,尤其是什么90后00后之类的。所以b站的浏览量远远要大于从前的优酷和土豆。我本以为不就是注册个视频网站吗,但让我远远没想到的是原来注册会那么的折腾。作为一个没有推荐码的路人甲,我得先回答100道题。答对其中的60题,我才能正式成为会员。100道题里面40题是必答题,必须全部答对,当然如果你答不对,会提醒哪里错了,错了就修改,改到全部答对为止。后面的60道题我觉得是二次元的极限,它会让你在几个大类里面选3到10类你精通的,然后就从那些大类里面出题给你。我选择的好像是科技理综以及音乐。但显然看到题目的时候我整个人都傻逼了。无论是之前的必答题还是后面的选答题,我简直觉得我不是活在这个地球上的,又或者bilibili这种生物根本就不属于这个世界。答完前面40道必答题的时候我已经觉得略崩溃。再搞完后面60道题的时候,我觉得整个人都不好了。但幸好最后我还是74分通过考试。后面的60道题的某些我是去搜索答案的,但这只是以防万一,即便我完全不搜索答案,我可能也能60分以上通过。

千辛万苦注册了bilibili,总算可以上传视频了,但是打开视频上传的界面,又让我惊讶了半天,只允许mp4和flv。这就让我傻眼了,因为我之前压制的所有幕后花絮视频用的都是mkv格式。理论上mkv是一个很开放的格式,把里面的东西提取出来,然后再做成mp4就可以了。思路是这样的,但是首先第一步我得把mkv的东西提取出来。一直来我用的都是mkvtoolnix,但实际上里面的那个提取工具MKVExtractGUI,原来我一直都是处在傻逼状态的。我先要下载一个MKVExtractGUI,但问题是网络上满大街的都是版本都太高,不兼容我的老电脑XP,也和原来的工具包不匹配。我曾经想过重新下载一个新的mkvtoolnix。但显然又是那个问题,和我的老电脑不匹配。无计可施之下,我只好用MeGUI将mkv视频重新制作avs,然后压制成为mp4。但重压一个视频压了大半以后,我终于找到了一个可以使用的MKVExtractGUI。显然用那个东西秒杀就能完成提取。然后再用MeGUI的mp4封装功能视频再次秒杀就能从mkv转身变成mp4。这就解决了我一个非常头痛的问题,因为如果要把mkv文件全部都重新压制,需要很多时间,而且视频质量也会大打折扣。这样封装是完美的。据说mp4文件不兼容ACC音频,所以先要把音频转为AC3,但实际上在压制mkv的时候我已经把音频转为AC3了。所以提出来的东西当然就只有H.264,以及AC3,封装成靠谱的mp4当然没有任何问题。mkv也好,mp4也好,虽然后缀不一样,但实际上二者的内容物是完全一致的,所以两个文件的大小也完全一样。对我来说之前用MeGUI压制视频输出mkv和mp4都一样。所以如果以后要兼容把视频上传到bilibili,那必须是全部都压成mp4。

提取转码,这些最技术含量的活干完以后,上传及信息补全也就只是个体力活,但也因为折腾了一番bilibili,我的跑步时间比平时推迟了接近两个小时。于是我回去吃饭洗澡的时候已经过了晚上10点。如果有选择余地,昨晚的10K我大概就不跑了,但是前天已经没有跑,昨天我不得不跑。所以即便被这些事拖了一大堆时间,我还是得去完成我的任务。

之前我不喜欢bilibili是因为视频播放的时候弹幕让我连视频都看不清了,但现在估计我不得不拥抱这个东西。

2016-06
5

后PC时代的WWE.COM

By xrspook @ 12:41:14 归类于: 烂日记

以前我一直觉得WWE.COM的网站做得很好,他们的网站也一直在得奖。他们的网站完全是由他们的技术工程师编写出来,不像很多其它网站那样是在用某个内核,不过是披挂了不同的外皮而已。6年前当我第一次接触WWE.COM网站的时候我觉得那很合我的口味,内容很丰富、层次很清晰,大概因为我和他们工程师的思路有时是在同一频道上。我跟他们的网站打了接近5年的交道。在那5年里他们曾对网站进行改版,比如说让网站显示的标准宽度更大以适应大伙越来越大,大到堪比电视屏幕那么大的显示屏,虽然进行了那样的改版,但宽版和从前窄版的网站基础架构还是差不多的,用我的语言去描述的话,那不过是换了张包在骨架上的“皮”而已。跟WWE.COM打交道,我玩得最多的是批量抓取他们的组图。还记得一开始的时候他们的组图是用xml的调用方式,后来呢,变成了直接在一个页面上加载全部,只要看源文件就能在一个网页里提取到组图的所有代码。在我们“关系密切”的5年里,只有1年不到的时间他们在用xml的调用模式,后来就变成了我说的那种单网页赤裸裸放置了。

昨晚因为要去找某几张高清图,所以我又去逛WWE.COM了。在我几乎彻底离开的一年时间里(准确来说我数月前去的时候还不是这样的),网站发生了重大变化!他们现在的网页再也不是基于大家用老爷PC去浏览的,所有东西都变得很大,没什么美感可言,渐变圆角神马更加是滚一边去了。整体风格一看就知道那是基于方便智能平板设备浏览的套路,毕竟控制平板设备的是很粗的手指而不是精准度极高的小箭头,要是在平板上触控还好一点,在5寸的正手机上触点太小那真的要人命。我没试过在智能手机上打开WWE.COM,但我估计在PC机上看很笨拙粗大的网页在智能设备上比例会刚好。为什么我会这么觉得?因为他们现在的组图板块网页在浏览图片的时候除了按左右按钮前进后退以外还可以用鼠标拖放滑动,那显然就是智能设备的标准浏览法。再看他们的源代码,head部分有非常多的“facebook”和“twitter”标签,也有非常多德语、西班牙语以及其它语言的兼容选择。以前WWE非英语的网站是挂靠在各国的某些大型门户上的,比如说如果是西班牙语的话就是TERRA,如果是中文的话就是搜狐(最开始的时候是土豆),但现在从源代码看来,他们要在WWE.COM上用一个网站就兼容好几种主流语言以及让PC和智能设备都能跨平台无缝浏览。这是个非常正路的思路,因为这正是现在的趋势所在,但要实现这个显然没那么简单。这样做能省掉很多挂靠的额外开销,也能省下很多专门制作基于智能设备顺畅体验的APP,让PC端浏览舒服的美工活儿也能省下非常多。跨平台最核心的就是把最最基础的数据分类罗列得很好,在不多的设备上按照既定的模板在恰当的地方正确输出。我不知道现在WWE.COM的浏览数据如何,大概他们发现用智能设备看他们网站的人比用传统PC多,主流趋势已经发生改变,所以他们做了这样的彻底改版。这绝对不是头脑发热,根据WWE.COM多年来他们工程师基于事实的预见性和潮流触觉,他们不会出错。对PC端来说,现在WWE.COM的改版从美观上来说是个巨大的倒退,我这个依然严重依赖PC浏览的人当然觉得很不是滋味,但是这种事不由我说了算,我唯一能做的只是适应这种新常态。

从前写的批量提取组图代码在改版后的WWE.COM上已经失效,我是时候脑洞大开和WWE.COM的工程师来一场新的斗智斗勇大战了!

2011-07
7

抓头 – 嵌套div的正则提取

By xrspook @ 17:50:04 归类于: 烂日记

很傻很天真的以为用正则可以轻易提取出div里的层层嵌套div,结果囧得厉害。div的开头通常都带有class或id,唯一,且容易辨认,但div的结尾,清一色的“/div”,真会搞死人。网络上流传的提取div版本貌似都不太可行。在一坨里提取一堆只是第一步,第二部还得把提取到的内容xml数组化。

其实呢,我也有想过一开始就对所有内容xml数组化,不过,信不信由你,从最开始那层<>到我要提取的那些内容少说也有15层,而且如果那些网页设计者好心加一层或减一层,我又得慢慢摸到底哪里出问题了。所以,用xml数组化是个思路,但“解剖”源数据的工作量不少且维护困难。毕竟,这不是5层,这是15层+啊!怨念那些穿那么多层衣服的网页。

正则难提取嵌套div,xml太郁闷,咋办呢?

我还有一个很天真的办法,手动选取要提取部分的代码然后贴到程序里提取。这么一来就解决了难提取困难的问题,当然啦,都手动干了,还有什么难不难的,这个办法很低级,但一定可行。

怎么办呢,怎么办呢?!

应该是我想得还不够深入,再花点时间动动脑筋好好琢磨琢磨吧。

今天很坏地想到用正则提取,table输出,然后直接Excel粘贴保存,早上还在兴奋这个伟大思路,下午就发现正则把我卡死,生活真是个悲喜剧。

别囧,我有的是时间,一定可以的!

2010-11
26

再谈php正则提取图片地址

By xrspook @ 21:46:54 归类于: 烂日记

前天写了小谈php正则提取图片地址,但其实,提取src=里面的图片地址还不足够,因为不能保证那个地址一定是绝对地址,完全的地址,如果那是相对的呢?如果地址诸如:

albums/Candids/thumb_P1050338.jpg
/content/media/touts/5271608/5271654/15320982

那该如何是好?

有时在这些地址前面需要加http://example1.com/,有些甚至要加http://example1.com/example2/…/于是,要写出出一种法则符合所有要求,简直是天方夜谭。只能见机行事对症下药。有时,需要从前面动刀,有时需要从后面砍断。

今天,我惊讶地知道了一个道理,原来http://example.com/http://example.com//////是一样的!

http://img3.douban.com/pics/nav/lg_main_a6.png

http://img3.douban.com////pics////nav///lg_main_a6.png

最终你都能到达

于是,对于一开始提到的两个相对地址如果要强行加入某前缀恢复成绝对地址的话,也不管前面有没有“/”,只管加一个“/”就好,“有杀错,没放过”嘛,多一个显示仍会正常,但少一个“/”,嘿嘿,你就别想成功了。开始的时候我还没意识到这种东西,复制了一大段代码,把一样的东西硬生生弄两份,一份加“./.”,一份不加。我这个火星来的,浪费时间了。

放出2个地址,公测一下网页获取图片的情况:

针对任何网页,需要登入的除外:http://xyark.serw5.com/img.php
针对Coppermine Photo Gallery系统:http://xyark.serw5.com/g.php(如果你认为弹出原图的js页面也需要的话,我只好囧你了)

普页是个对抓取任何图片的尝试,系统专页是为了展示什么叫做具体情况具体分析。试过的童鞋会知道,普页对某些使用Coppermine Photo Gallery系统的网站是行不通的,原因何在?就是那个前缀搞的鬼!但系统专页就能很好地避开了这个问题。

如果大家在测试时发现任何bug,欢迎留言告知。请低调测试,谢谢合作。

注:以上话题纯粹出于就正则谈正则,光技术谈技术,不可作非正当用途。若非正当使用而引发任何杯具、餐具本人概不负责。

© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress