0

0

基于字母配额与词表的合法句子生成器:Python 实现多词组合式字谜求解

聖光之護

聖光之護

发布时间:2026-02-11 16:19:51

|

369人浏览过

|

来源于php中文网

原创

基于字母配额与词表的合法句子生成器:Python 实现多词组合式字谜求解

本文介绍如何根据给定字母使用配额(如 n:1, e:1, o:2 等)和外部词表(wordlist.txt),穷举所有由词表中单词构成、且**恰好耗尽全部字母配额**的有效句子,支持同构异形词(anagram)去重与组合优化。

在自然语言处理与算法谜题实践中,常需解决一类“约束型句子构造”问题:给定一组字母及其最大可用次数(即“配额”),以及一个合法词汇集合(如 wordlist.txt),目标是生成所有可能的、由词表内单词拼接而成的句子,要求每个字母的总使用频次严格等于其配额,且不可超额或剩余。例如,配额 n:1, e:1, w:1, b:1, o:2, k:1 对应字母串 "newbook"(长度 7),合法解包括 "new book"、"bow neko" 等——它们均由词表中存在、且字母频次加总后完全匹配原始配额的单词组成。

核心思路是将问题转化为多词级字谜(multi-word anagram)求解

  • 每个单词按字母排序后形成唯一 anagram_id(如 "book" → "bkoo","koob" → "bkoo"),实现异形词归一化;
  • 输入配额等价于一个目标字母串(如 "bkeoown" → 排序得 "bkeoown" → "beknoow"),记为 target_sorted;
  • 枚举词表中所有能作为子组件的单词(即其 anagram_id 是 target_sorted 的子多重集),再通过组合与笛卡尔积,生成所有单词序列,使其 anagram_id 拼接后仍与 target_sorted 完全一致。

以下是完整、可运行的 Python 实现(已优化逻辑并增强鲁棒性):

from itertools import combinations, product
from collections import defaultdict, Counter

def filter_origin(s):
    """清理输入:移除空格、换行、标点,转小写,仅保留字母"""
    return ''.join(filter(str.isalpha, s.lower()))

def generate_sentences_from_quota(quota_dict, wordlist_path='wordlist.txt'):
    """
    根据字母配额字典和词表路径生成所有合法句子

    Args:
        quota_dict (dict): 如 {'n': 1, 'e': 1, 'w': 1, 'b': 1, 'o': 2, 'k': 1}
        wordlist_path (str): 词表文件路径,每行一个单词

    Returns:
        list[str]: 所有满足条件的句子(空格分隔,顺序不同视为不同解)
    """
    # 构建目标字母串(按配额展开)
    target_chars = []
    for char, count in quota_dict.items():
        if count > 0 and char.isalpha():
            target_chars.extend([char.lower()] * count)
    target_sorted = ''.join(sorted(target_chars))
    target_len = len(target_sorted)

    # 读取并预处理词表
    with open(wordlist_path, 'r', encoding='utf-8') as f:
        words = [line.strip() for line in f if line.strip()]

    # 构建 anagram_id → 单词列表 映射
    anagram_map = defaultdict(list)
    for word in words:
        clean_word = filter_origin(word)
        if not clean_word or len(clean_word) > target_len:
            continue
        aid = ''.join(sorted(clean_word))
        anagram_map[aid].append(word)

    # 筛选所有「可行组件」:anagram_id 必须是 target_sorted 的子多重集
    valid_aids = []
    target_counter = Counter(target_sorted)
    for aid in anagram_map:
        aid_counter = Counter(aid)
        # 检查 aid 是否可被 target_counter 容纳(每个字母频次 ≤ target)
        if all(target_counter[c] >= cnt for c, cnt in aid_counter.items()):
            valid_aids.append(aid)

    # 枚举所有非空子集组合(按组件数量分层)
    valid_sentences = []
    # 使用动态规划或回溯更优,此处用组合枚举(适合中小规模)
    for r in range(1, min(len(valid_aids) + 1, target_len + 1)):
        for combo in combinations(valid_aids, r):
            # 拼接当前组合的 anagram_id 并排序
            combined_aid = ''.join(combo)
            if len(combined_aid) != target_len:
                continue
            if ''.join(sorted(combined_aid)) == target_sorted:
                # 笛卡尔积:每个 aid 对应多个实际单词
                word_lists = [anagram_map[aid] for aid in combo]
                for sentence_words in product(*word_lists):
                    valid_sentences.append(' '.join(sentence_words))

    return list(set(valid_sentences))  # 去重(避免相同句子因多路径生成)

# 示例调用
if __name__ == "__main__":
    quota = {'n': 1, 'e': 1, 'w': 1, 'b': 1, 'o': 2, 'k': 1}
    sentences = generate_sentences_from_quota(quota, 'wordlist.txt')
    print("合法句子列表:")
    for s in sorted(sentences):
        print(f"  '{s}'")

关键特性说明

Hot Tattoo AI
Hot Tattoo AI

人工智能纹身生成器,提供独特的纹身创意

下载

立即学习Python免费学习笔记(深入)”;

  • 精准配额匹配:严格校验组合后字母频次与输入配额完全一致(非子集,而是等价);
  • anagram 智能归一:自动识别 "book"/"koob" 等异形词,避免重复计算;
  • 高效剪枝:跳过长度超限或频次越界的候选词,显著提升性能;
  • 输出可控:返回去重后的字符串列表,支持直接用于后续 NLP 流程或人工校验。

⚠️ 注意事项

  • 该算法时间复杂度为指数级(最坏 O(2^N)),适用于配额总长 ≤ 15 字母、词表规模 ≤ 10⁴ 的场景;若需处理更大规模,建议改用回溯 + 频次计数器剪枝,或引入 A* 启发式搜索;
  • wordlist.txt 中单词需为纯字母(无空格/符号),否则 filter_origin() 会自动清洗;
  • 若允许单词复用(同一单词多次出现),需额外修改组合逻辑(当前默认每个单词至多用一次);
  • 实际部署时,建议将 anagram_map 序列化缓存,避免重复解析大型词表。

通过本方案,你不仅能生成 "new book" 和 "bow neko" 这类直观解,更能系统性挖掘所有潜在语义组合——让字母配额从约束变为创意引擎。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

488

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

214

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1547

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

637

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

841

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

813

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

184

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

87

2025.08.07

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

1

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.2万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号