n個漢字兩兩組成常見詞語,求n的最大值?

任意兩個字只要能組成一個常用詞語就行,不需要正反都能組成詞語。


這個問題太好玩了!無論是用人腦去想,還是用電腦去算,都很有趣味。我這個答案也就分成「用人腦想」和「用電腦算」兩部分。

============= 用人腦想 =============

從最簡單的N=3開始。要想三個字,兩兩能組成詞,怎麼入手呢?
我的思路是:想一對「反義字」,反義的字往往能組成詞。然後讓這兩個字同時去修飾第三個字,或者同時被第三個字修飾,就能用三個字組成三個詞了。
按此思路,不難想出如下的例子:

大小、最大、最小
黑白、黑色、白色

除了「反義字」,「近義字」也能達到類似的效果:

道路、大道、大路
寒冷、寒氣、冷氣

下面想N=4。沿襲剛剛的思路,可以想兩對「反義字」或「近義字」,互相修飾。比如:

大小、寒暑、大寒、小寒、大暑、小暑
春秋、風雨、春風、春雨、秋風、秋雨

甚至可以這樣:

東西、南北、東南、東北、西南、西北

最後這個例子,正好給了我向N=5進軍的啟發:「東南西北」可以算同一組字,再找一個字跟這四者分別組詞!
這樣的字,很容易想到:

方:東方、南方、西方、北方
面:東面、南面、西面、北面
正:正東、正南、正西、正北
向:向東、向南、向西、向北

巧的是,「方面」「方向」「面向」也都是常用詞,於是「東、南、西、北、方、面、向」就是一組N=7的答案了。「方正」「正面」也是常用詞,「正向」嘛……其實它也算個詞(跟「反向」相對),如果這麼認為的話,「東、南、西、北、方、面、正、向」就是一組N=8的答案了。

就到這裡,下面開掛~

============= 用電腦算 =============

原問題可以抽象成一個圖論問題:把每個漢字看成無向圖中的一個頂點,若兩個字可以組成詞,則在兩個點之間連一條邊,求圖中最大的「團」(clique,即頂點全部兩兩相連的子圖)。

首先,構造圖的數據從哪兒來呢?我從網上找了一個《現代漢語常用辭彙表》,用其中的所有雙字詞建了一個圖。

然後,就要找圖中的團了。不幸的是,Clique problem是一個NP-complete問題,無法在多項式時間內求解。但是,我們的圖有它的特殊性,即裡面不太可能有很大的團。為何不試試運氣呢?而且演算法都不需要我親手實現,有現成的庫可以用:
Clique — NetworkX 1.9.1 documentation

代碼如下:

# -*- coding: utf-8 -*-
import codecs
import networkx as nx

DICT_FILE = u"現代漢語常用辭彙表.txt"
G = nx.Graph()
with codecs.open(DICT_FILE, "r", encoding = "utf-8") as f:
for line in f:
if len(line.strip()) == 2:
G.add_edge(line[0], line[1])

cliques = list(nx.find_cliques(G))
N = max(len(c) for c in cliques)
for c in sorted("".join(sorted(c)) for c in cliques if len(c) == N):
print c

哇,居然只需要0.3s就跑出結果了!
程序找到的最大的團大小為6,共有15個,包括:

東京北南海西
東北南方西面
東北南洋海西
東北南海西邊
東北南海西面
東北南海西風
東北南西部面
東北向方西面
人前後頭年來
人動心手機身
人後頭年來過
會全國大有都
全軍大部長隊
力地場外用電
力水熱電能量

果然「東南西北」大片出現!但其實另外幾組詞也很有意思呢:以「人」開頭的那幾組很通俗,以「會」「全」開頭那兩組很共產,以「力」開頭那兩組很物理。當然,這裡面有「人年」「會有」「水量」這些值得商榷的詞,還有「長」這樣的多音字亂入了。

等下,剛剛用人腦不是找到了一組N=7的「東南西北方面向」么?為什麼這裡沒有呢?
原來,《辭彙表》中漏掉了「向南」這個詞……
另外,觀察上面的15個大小為6的團可以發現,「東南西北海洋」和「東南西北海面」只差一個字,而「洋面」也可以算是個詞(天氣預報……)。把「向南」和「洋面」補充進《辭彙表》,就可以找到兩個大小為7的團了:

東北南向方西面
東北南洋海西面

(「正東、正南、正西、正北」都沒有出現在《辭彙表》里,那就算了吧……)


丙 羰 羧 羥 酸 醯 酊 酚 酮 醇 巰 烷 苯 基。。。。
不但兩兩能成詞。。還能三三、四四。。。


這個問題很好玩,把語文和數學結合在一起,顯然,數學需要更加規整的定義。比如「常見詞語」是一個怎樣的定義,其定義域或者詞庫的每個元素究竟是什麼。給出了這個定義,然後修補詞庫,再用電腦就好算了吧。


常見詞語怎麼定義 用什麼庫?
庫出來了 用電腦就很好算了


一不小心看成「n個漢子兩兩xxxx」。。


「英」「雄」「豪」「傑」


有收穫,感謝!


[一二三四五六七八九十百千萬億]+

不知道這樣算不算


經@曹文雯提醒,應是
Cn2


推薦閱讀:

扔硬幣遊戲,有關最長連續正面朝上和反面朝上長度的函數的期望值?
有什麼好看的數學書推薦么?
二次函數解析式怎麼配方?
圓桌上1000個人輪流開槍,最後活下來的是幾號?
此圖像的參數方程應該是什麼?

TAG:數學 | 語文 | 應用數學 | 趣味數學 | 腦洞網路用語 |