perl

超粗糙人工智能語義分析--兼賞perl語言的優美

人工智能?當然,我是「人」,我花了「工」,怎麼就不是「人工」智能了?我覺得人類真的很奇怪,很多時候,明明是「人工」的卻一定要說不是,好似人工很丟臉似的;有時又反過來,人工又值錢起來。就拿「試管嬰兒」來說吧,人們往往把他們叫做「人工授精」,拜託,全人類百分之九十九點九九都是人工授精的好不好!衹有試管嬰兒才是通過器械完成的,這不是本末倒置是什麼?
好了,說正題,我的人工智能。
我最近迷上了一本書——《清明上河圖密碼》。其實,我以前看過這本書的第一冊和第二冊,那是很久以前的事了吧,看過也就忘了。最近董在他的朋友圈貼出了第五冊的照片,才知道原來已經出到第五冊了。於是就從中國的亞馬遜買了Kindle電子書來看,從看到朋友圈到買好書,不超過五分鐘,真是很方便,衹是中國的亞馬遜賬號和美國的不通用,你得準備二個Kindle。
從第三冊開始看的,一口氣看了三本,又回過去再看了一遍第一冊和第二冊,實在是相當好看,也相當燒腦,現在就等第六冊的大結局了。
這本書從第一冊起,就號稱「全圖824個人物逐一復活」,你想想,824個人物,還包括不在圖裡出現的人物,那加在一起得有多少名姓啊?
好奇的我,打算把那些名姓整理出來。大家知道,我是玩perl的,Practical Extraction and Reporting Language,「實用的提取和報告語言」?那不是正好?我要把人名從書裡提取出來,並且生成一個報告,perl是幹這活最好的工具。
首先我要有一個全文文本,我還沒打算在kindle前放個攝像頭讓電腦自己去讀了再識別,同時還得做個機械手來翻頁,我說過了,這是「超粗糙」「人工」智能。
當然是把Kindle的文件整出來,變成文本格式啦。不要問我怎麼把版權保護的azw3文件變成文本文件,我不會告訴你的;同時也不要向我索取這個文本,我也不會給你的。
我最早的思路是這樣的,找出全文所有的二字三字四字五字重複的部分來,從第一個字讀起,在全文搜索,但轉念一想,這種窮舉法太恐怖了,從第一個字起,先把第一第二個字在全文搜一遍,再把第一第二第三乃至第四第五一分五次全文搜索,然後從第二個字起,五冊書1816631個字,就得搜上千萬次,上千萬次乘以181萬,媽呀,不行,工作量太大了。
第二步想到的,是照中國姓氏來查,是人總得有姓吧,有姓總得是個中國姓吧?於是我去維基選用了增補的《百家姓》,共計單姓444個,雙姓60個。
002
這樣就簡單多了,五百乘以一百八十萬再乘以四(從二個字的名字到五個字的),沒多少了。
怎麼找呢?出現一個姓,就查後面一個二個三個四個字?好像可以更簡單的。
於是我又想到一個辦法,大家數情況下,人名都會是個主語,而且出現在句子的最前頭,比如「王小二推開門……」這樣的句子,那我衹要查每句話的第一個字是不是一個姓氏不就行了?是的話,再看接下的字,不是就直接忽略過去。
那麼,要是出現「門沒有鎖,王小二推開門……」這樣的句子怎麼辦呢?很簡單,把所有的斷句都當作單句不就成了,也就是說不管是在逗號後面、分號後面、問號感嘆號還是別的符號後面,一律當作句首好了。
這時,perl語言的優美就體現出來了,看圖。
003.png
你不用去管第三第四句,而第一句,就是把所有的其它符號都當作句號來對待,第二句是移除所有的引號。你試想一下,用word做替換要多少操作多少時候?而在perl裡,就是這麼奇奇怪怪的二句就夠了。
具體的編程,我就不說了,簡單的思路是這樣的:如果句首是姓氏,把姓氏加上後面一二三四字的組合記個數,當重複的次數超過一定值的時候,就認為這是個姓名,再看圖。
006.png
圖中的10就是我設定的一個值,當它超過10的時候,就顯示出來。這段程序也很優美,而且超經典,它叫「hash的列表」,是衹有perl才能簡單完成的操作。
結果的顯示很簡單,就是每個被「認作」姓名的組合在句首出現了多少次,這時發現了象下圖那樣的東西。
001.png
「都」是一個姓,全書中沒有姓「都」的人,然而作者的行文中有大量的「都是」、「都要」之類的詞語,那很簡單,既然沒有姓「都」的,那把「都」從我的《百家姓》去掉好了。為了防止第六本中出現姓「都」的來,我不是直接去掉,而是設了個被「去掉」的姓的列表,原來的不去動它,就像下圖。
009.png

但是有的姓,不能去掉,就像下面這張圖,「冷著臉」明顯不是個姓名,但「冷緗」的確是書中的人物,那就衹能保留下來,再手工剔除。
還有一個問題,看圖。
「梁興」是書中的一個人物,然而「梁興看」、「梁興想」分想出現了十幾次,都被噹噹作人名了,於是我就把這些不常會在姓名中出現的動詞去掉了。再見識一次perl的優美吧,就是下面這麼簡簡單單的一句話,就完成了。

004.png

程序就這麼編完了,在總耗時六秒的運算中,程序找出了819位符合「假設」的人名。

090.png
還有一個小小的毛病,看圖。

010.png

這裡的六個人其實衹有三個人,所有的雙名都有這個問題存在,其實衹要再比對一次就可以了,這個不難,但還是沒法判斷出「周大」與「周大哥」是不是同一個人,所以我乾脆就手工挑揀了。
最後的結果如下:就目前為止,作為主語在書中出現的稱呼共有427位(次),不包括「紫衫客」之類沒有名姓的,也不包括「十七娘」之類的謂語和轉述,其實「十七娘」作為「唐氏」已經被程序找出來了;但是包括「梁興」、「梁大哥」、「梁哥哥」、「梁教頭」、「梁豹子」等同指一人的情況,如圖。

040.png
最後,將「人工智能」找出的人物列在下面,以供小說與編程同好。


丁嫂 丁旦 丁豆娘 丁鹿 仇蠅子 何兄 何六六 何奮 何掃雪 何況 何渙 何賽 何賽娘 侯倫 侯小姐 侯琴 俞芳 冷緗 凌小七 劉九 劉九哥 劉八 劉呵呵 劉回 劉嫂 劉小肘 劉氏 劉西 劉鶴 勞煩 匡志 匡推官 匡虎 古德信 史小雅 吳主簿 吳喜 吳大哥 吳泗 吳老伯 吳蒙 吳赫 吳銀匠 周大哥 周小瑟 周攀 周耐 周萬舟 周長清 唐浪兒 單十六 單大哥 嚴兄 嚴氏 嚴漏秤 嚴申 嚴老爹 墨兒 墨監 夏嫂 姚氏 姚禾 姚辛 姜團 婁善 婁輝 孔子 孟大 孫哥兒 孫圓 孫執信 孫獻 孫相公 孫節級 孫老伯 孫老羊 孫阿善 宋齊愈 宣主簿 封伯 尹嬸 尹氏 崔兄弟 崔升 崔媽媽 崔店主 崔秀 崔豪 左軍巡使 康二哥 康先生 康大 康游 康潛 張作頭 張器 張太羽 張姑爺 張待詔 張擇端 張用 張相公 張縣令 張老伯 張賜 彭嘴兒 彭影兒 彭針兒 戚媽媽 方聰 方臘 於仙笛 於燕燕 施大哥 施有良 施萬 明慧娘 易卜拉 曹公子 曹喜 曹廚子 曾小羊 曾胖 朱克柔 朱家小娘子 朱康誠 朱廣 朱氏 朱閃 朱閣 朱顯 李儼 李度 李彥 李洞庭 杜恩 杜氏 杜騁 林靈素 柳七 柳二郎 柳氏 柳碧拂 桂嫂 桑五 桑五娘 梁兄弟 梁哥哥 梁大哥 梁師成 梁教頭 梁紅玉 梁興 梁豹子 梅大夫 楊九欠 楊戩 楊殿 楊殿頭 楊老榆 楚三 楚三官 楚二 楚二哥 楚大 楚大哥 楚家 楚滄 楚瀾 樂致和 欒回 欒老拐 歐不易 歐嫂 武家 武翔 武翹 段孔目 毛毬 江四 江氏 江渡年 池了了 池姑娘 汪八百 汪員外 汪石 沈括 沈核桃 洪使臣 洪婆 洪山 游丸子 游大奇 溫姐姐 溫悅 溫聲 潘高年 烏扁擔 烏眉 烏鷺 熊七 熊七娘 燕燕 牛小五 牛慕 王倫 王凸 王勾 王勾押 王哈兒 王大崢 王守愨 王安石 王小槐 王析 王球 王理 王琪 王盅 王盆 王盉 王盥 王蕩 王豪 王鐵尺 王馭 班升 甄輝 甘亮 田況 田牛 畢竟 白天 白崗 白攬 白攬子 皮二哥 皮膚 盛豆 盧饅 盧饅頭 石哥哥 石守威 祝伯 祝兄 祝德實 秋兒 秦伯 秦孝子 秦廣河 程介史 程得助 程老哥 程門板 穆大哥 穆柱 竇七叔 竇好嘴 竇猴兒 竇老曲 章美 管桿兒 簡淮 簡直 簡莊 簡貞 羊婆 翟秀 翟秀兒 耿五 聞推官 胡十將 胡大包 胡小喜 胡斗子 胡歡娘 胡涉兒 胡老鴞 臧齊 范大牙 莊大武 莊夫人 莫咸 莫甘 莫褲子 萬兒 萬小葛 萬福 萬莫 萬萬 葉大郎 葛大夫 葛鮮 董修章 董公子 董嫂 董氏 董謙 蔡京 蔡柳兒 蔡氏 蔡行 蔣沖 蔣淨 蔣衝 蔣魚頭 薛嫂 薛海 藍威 藍婆 藍猛 蘇敬 衛參 裘鎮 解八八 解庫 解開 譚力 譚店主 谷二十七 谷坤 費力 賀中 賀中棍 賀中棍兒 賈大哥 賈小六 賈慶 賈撮子 趙不尤 趙不棄 趙太丞 趙姑娘 趙將軍 趙敢 趙瓣兒 邢嫂 邱二 邱公子 邱菡 邱菡母 邱菡母女 邱遷 郎繁 郭夫人 郭指揮 郭沉 郭深 鄧三 鄧楷 鄧紫玉 鄭五七 鄭廚子 鄭敦 鄭聲 鄭鼠兒 金方 閻奇 陳寬 陳小乙 陳豹子 陸先生 陸青 雲夫人 雲戴 雲水 雷安 雷德清 雷炮 雷珠娘 雷老漢 韋植 韓世忠 顏圓 顧大人 顧大哥 顧太清 顧盼兒 顧震 馬啞子 馬步 馬良 馮二 馮二哥 馮大 馮大倌兒 馮大官 馮大官人 馮實 馮寶 馮氏 馮相公 馮賽 魏大辛 魏豬倌 魏錚 魚行 魯大 魯添兒 魯知縣 魯老漢 魯膀子 鮑兄 鮑川 鮑廷 鮑廷庵 麻羅 黃三奇 黃三娘 黃伯 黃嬸 黃富貴 黃岐 黃牛兒 黃瓢子 黃百舌 黃胖 黃鸝 黃鸝兒 黎二 黎百彩 齊全 齊愈 齊氏 龐七 龔三哥

Leave a Reply

Your email address will not be published. Required fields are marked *