网上经常有些从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)
找出来的成语有:
一天一地、别有风味、别有天地、恰到好处、落花流水、水流花落、
水天一色、流水落花、风轻云淡、月黑风高、高高在上、云淡风轻、
能上能下、不上不落、不上不下、不以为然、不差上下、名高天下、
名满天下、天下为笼、天高地下、参差不一