网上经常有些从N个字里面找成语的小游戏,那么怎么用python把成语组合找出来呢?

准备词典

从网上下载一个成语的词典、每行一个成语,保存成 word.txt。

代码实现

1.构建一个首字-成语的字典模型 predict.model

import pickle
from pathlib import Path

seq = Path('word.txt').read_text().split('\n')
predict = {}
for word in seq:
    pre = list(word)[0]
    predict.setdefault(pre, [])
    predict[pre].append(word)
    
with open('predict.model', 'wb') as f:
    f.write(pickle.dumps(predict))

2.实现成语查找的类

import pickle

class Idiom(object):
    def __init__(self, model_path='predict.model'):
        self.predict = pickle.loads(Path(model_path).read_bytes())
        
    def find(self, text):
        # 生成单字集合
        chas = set(text)
        for cha in chas:
            # 获取单字对应的备选成语
            words = self.predict.get(cha, [])
            if not words:
                continue
            for word in words:
                # 检查备选成语的字是否在单字集合中
                for i in word:
                    if i not in chas:
                        break
                # for循环执行完即备选成语由单字集合中的字组成
                else:
                     print(word)

3.现在就可以开始找成语啦

# 网上一般的成语游戏的备选字比这里少很多
s = '''月光如流水一般,静静地泻在这一片叶子和花上。
       薄薄的青雾浮起在荷塘里。
       叶子和花仿佛在牛乳中洗过一样;又像笼着轻纱的梦。
       虽然是满月,天上却有一层淡淡的云,所以不能朗照;
       但我以为这恰是到了好处——酣眠固不可少,小睡也别有风味的。
       月光是隔了树照过来的,高处丛生的灌木,落下参差的斑驳的黑影,峭楞楞如鬼一般;
       弯弯的杨柳的稀疏的倩影,却又像是画在荷叶上。
       塘中的月色并不均匀;但光与影有着和谐的旋律,如梵婀玲上奏着的名曲。''')
obj = Idiom()
obj.find(s)

找出来的成语有:

一天一地、别有风味、别有天地、恰到好处、落花流水、水流花落、
水天一色、流水落花、风轻云淡、月黑风高、高高在上、云淡风轻、
能上能下、不上不落、不上不下、不以为然、不差上下、名高天下、
名满天下、天下为笼、天高地下、参差不一

dodopy
2.4k 声望746 粉丝