Browse Source

Initial commit

Xi Ruoyao 5 years ago
commit
04a6c9fa1a
3 changed files with 159 additions and 0 deletions
  1. 23 0
      README.md
  2. 76 0
      example.in
  3. 60 0
      wordfreq.py

+ 23 - 0
README.md

@@ -0,0 +1,23 @@
+# Wordfreq script
+
+## Prerequisites
+
+* Python 3
+* Python 3 modules: `wordcloud`, `PIL`, `matplotlib`, `numpy`, and `jieba`
+* The TTF/OTF file of the font you want to use
+
+## Example
+
+```bash
+wget https://bf.mengyan1223.wang/assets/fonts/{SourceHanSans.ttc,ttc2ttf.py}
+python3 ttc2ttf.py SourceHanSans.ttc
+./wordfreq.py -i example.in -o example.png -p n,ne -f SourceHanSans10.ttf -t 60
+```
+
+## Acknowlegement
+
+* [Python](https://www.python.org)
+* [wordcloud](https://github.com/amueller/word_cloud)
+* [jieba](https://github.com/fxsjy/jieba)
+
+And, special thanks to Lao She who authors `example.in`.

+ 76 - 0
example.in

@@ -0,0 +1,76 @@
+火车在北平东站还没开,同屋那位睡上铺的穿马裤,戴平光的眼镜,青缎子洋服上身,胸袋插着小楷羊毫,足登青绒快靴的先生发了问:“你也是从北平上车?”很和气的。
+我倒有点迷了头,火车还没动呢,不从北平上车,难道由——由哪儿呢?我只好反攻了:“你从哪儿上车?”很和气的。我希望他说是由汉口或绥远上车,因为果然如此,那么中国火车一定已经是无轨的,可以随便走走;那多么自由!他没言语。看了看铺位,用尽全身——假如不是全身——的力气喊了声,“茶房!”
+茶房正忙着给客人搬东西,找铺位。可是听见这么紧急的一声喊,就是有天大的事也得放下,茶房跑来了。“拿毯子!”马裤先生喊。
+“请少待一会儿,先生,”茶房很和气的说,“一开车,马上就给您铺好。”
+马裤先生用食指挖了鼻孔一下,别无动作。
+茶房刚走开两步。
+“茶房!”这次连火车好似都震得直动。
+茶房像旋风似的转过身来。
+“拿枕头,”马裤先生大概是已经承认毯子可以迟一下,可是枕头总该先拿来。
+“先生,请等一等,您等我忙过这会儿去,毯子和枕头就一齐全到。”茶房说的很快,可依然是很和气。
+茶房看马裤客人没任何表示,刚转过身去要走,这次火车确是哗啦了半天,“茶房!”
+茶房差点吓了个跟头,赶紧转回身来。
+“拿茶!”
+“先生请略微等一等,一开车茶水就来。”
+马裤先生没任何的表示。茶房故意地笑了笑,表示歉意。然后搭讪着慢慢地转身,以免快转又吓个跟头。转好了身,腿刚预备好要走,背后打了个霹雳,“茶房!”
+茶房不是假装没听见,便是耳朵已经震聋,竟自没回头,一直地快步走开。
+“茶房!茶房!茶房!”马裤先生连喊,一声比一声高:站台上送客的跑过一群来,以为车上失了火,要不然便是出了人命。茶房始终没回头?茶房!”我拿起报纸来。
+他站起来,数他自己的行李“可恶的茶房,怎么不给你搬行李?”
+我非说话不可了:“我没有行李。”
+“呕?!”他确是吓了一跳,好像坐车不带行李是大逆不道似的。“早知道,我那四只皮箱也可以不打行李票了!”这回该轮着我了,“呕?!”我心里说,“幸而是如此,不然的话,把四只皮箱也搬进来,还有睡觉的地方啊?!”
+我对面的铺位也来了客人,他也没有行李,除了手中提着个扁皮夹。
+“呕?!”马裤先生又出了声,“早知道你们都没行李,那口棺材也可以不另起票了!”
+我决定了。下次旅行一定带行李;真要陪着棺材睡一夜,谁受得了!
+茶房从门前走过。
+“茶房!拿毛巾把!”
+“等等,”茶房似乎下了抵抗的决心。
+马裤先生把领带解开,摘下领子来,分别挂在铁钩上:所有的钩子都被占了,他的帽子,大衣,已占了两个。车开了,他顿时想起买报,“茶房!”
+茶房没有来。我把我的报赠给他;我的耳鼓出的主意。
+他爬上了上铺,在我的头上脱靴子,并且击打靴底上的土。枕着个手提箱,用我的报纸盖上脸,车还没到永定门,他睡着了。
+我心中安坦了许多。
+到了丰台,车还没站住,上面出了声,“茶房!”没等茶房答应,他又睡着了;大概这次是梦话。
+过了丰台,茶房拿来两壶热茶。我和对面的客人——一位四十来岁平平无奇的人,脸上的肉还可观——吃茶闲扯。大概还没到廊房,上面又打了雷,“茶房!”
+茶房来了,眉毛拧得好像要把谁吃了才痛快。
+“干吗?先——生——”
+“拿茶!”上面的雷声响亮。
+“这不是两壶?”茶房指着小桌说。
+“上边另要一壶!”
+“好吧!”茶房退出去。
+“茶房!”
+茶房的眉毛拧得直往下落毛。
+“不要茶,要一壶开水!”
+“好啦!”
+“茶房!”
+我直怕茶房的眉毛脱净!
+“拿毯子,拿枕头,打手巾把,拿——”似乎没想起拿什么好。
+“先生,您等一等。天津还上客人呢;过了天津我们一总收拾,也耽误不了您睡觉!”
+茶房一气说完,扭头就走,好像永远不再想回来。
+待了会儿,开水到了,马裤先生又入了梦乡,呼声只比“茶房”小一点。可是匀调,继续不断,有时呼声稍低一点。用咬牙来补上。
+“开水,先生!”
+“茶房!”
+“就在这儿;开水!”
+“拿手纸!”
+“厕所里有。”
+“茶房!厕所在哪边?”
+“哪边都有。”
+“茶房!”
+“回头见。”
+“茶房!茶房!!茶房!!”
+没有应声。
+“呼——呼呼——呼”又睡了。
+有趣!
+到了天津。又上来些旅客。马裤先生醒了,对着壶嘴喝了一气水。又在我头上击打靴底。穿上靴子,溜下来,食指挖了鼻孔一下,看了看外面。“茶房!”
+恰巧茶房在门前经过。
+“拿毯子!”
+“毯子就来。”
+马裤先生出去,呆呆地立在走廊中间,专为阻碍来往的旅客与脚夫。忽然用力挖了鼻孔一下,走了。下了车,看看梨,没买;看看报,没买;看看脚行的号衣,更没作用。
+又上来了,向我招呼了声,“天津,唉?”我没言语。他向自己说,“问问茶房,”紧跟着一个雷,“茶房!”我后悔了,赶紧的说,“是天津,没错儿。”
+“总得问问茶房;茶房!”
+我笑了,没法再忍住。
+车好容易又从天津开走。
+刚一开车,茶房给马裤先生拿来头一份毯子枕头和手巾把。马裤先生用手巾把耳鼻孔全钻得到家,这一把手巾擦了至少有一刻钟,最后用手巾擦了擦手提箱上的土。
+我给他数着,从老站到总站的十来分钟之间,他又喊了四五十声茶房。茶房只来了一次,他的问题是火车向哪面走呢?茶房的回答是不知道;于是又引起他的建议,车上总该有人知道,茶房应当负责去问。茶房说,连驶车的也不晓得东西南北。于是他几乎变了颜色,万一车走迷了路?!茶房没再回答,可是又掉了几根眉毛。他又睡了,这次是在头上摔了摔袜子,可是一口痰并没往下唾,而是照顾了车顶。
+我睡不着是当然的,我早已看清,除非有一对“避呼耳套”当然不能睡着。可怜的是别屋的人,他们并没预备来熬夜,可是在这种带钩的呼声下,还只好是白瞪眼一夜。
+我的目的地是德州,天将亮就到了。谢天谢地!
+车在此处停半点钟,我雇好车,进了城,还清清楚楚地听见“茶房!”
+一个多礼拜了,我还惦记着茶房的眉毛呢。

+ 60 - 0
wordfreq.py

@@ -0,0 +1,60 @@
+#!/usr/bin/env python3
+
+import argparse
+import jieba
+import jieba.posseg as posseg
+import sys
+
+from collections import Counter
+from wordcloud import WordCloud
+
+def readfile(fn):
+    f = open(fn)
+    s = ''
+    for line in f:
+        s = s + line
+    f.close()
+    return s
+
+def cnt(words, parts):
+    if not parts is None:
+        S = set()
+        pt = parts.split(',')
+        for x in pt:
+            S.add(x)
+
+    w = []
+    for x in words:
+        if parts is None or x.flag in S:
+            w.append(x.word)
+    return Counter(w)
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument("-i", "--input", help = "input file name")
+    parser.add_argument("-p", "--parts",
+            help = "the parts you want of speech, seperated by comma")
+    parser.add_argument("-j", "--jobs", type = int,
+            help = "the number of parallel jobs")
+    parser.add_argument("-t", "--top", type=int,
+            help = "the number of words you want to show on the cloud")
+    parser.add_argument("-o", "--output", help = "output image file name")
+    parser.add_argument("-f", "--fontpath",
+            help = "the path to the TTF/OTF fonts to use")
+    args = parser.parse_args()
+    if not args.jobs is None:
+        jieba.enable_parallel(args.jobs)
+    if args.input is None:
+        parser.print_help()
+        return 1
+    s = readfile(args.input)
+    words = posseg.cut(s)
+    c = cnt(words, args.parts)
+    if not args.top is None:
+        c = dict(c.most_common(args.top))
+    print(c)
+    wc = WordCloud(font_path = args.fontpath).generate_from_frequencies(c)
+    wc.to_image().save(args.output)
+
+if __name__ == "__main__":
+    sys.exit(main())