回文句式初探:“上海自来水来自海上”


    任何个体都有自己的品牌;存在即有价值。
                              —— 传承者戚

本实例利用python实现类似于“上海自来水来自海上”的中文句子造句。实现效果如下:

长短计算尺算计短长
除根落水狗水落根除
黄金润滑油滑润金黄
马上话搭头搭话上马
馋嘴说瞎话瞎说嘴馋
风扇打拍子拍打扇风
顺耳话搭头搭话耳顺
面对计算机算计对面
集市落花生花落市集
难为继承人承继为难
世故知情人情知故世
……

python3.5 代码如下:

    import 汉语词林
    import jieba
    import jieba.posseg  # 结巴词性标注模块

    # 程序编者:传习者戚
    # 造句:类似于“上海自来水来自海上”的句子
    # 统计运行时间计时开始
    import datetime
    begin = datetime.datetime.now()

    def 单字词性(one_char):
        return [i.flag for i in jieba.posseg.cut(one_char)][0]

    def 词组词性排列(strings):
        s = list(strings)
        return list(map(单字词性, s))
  
    # 搜索双字词语AB:倒叙过来也是常用词语BA。    
    double_char = 汉语词林.双字列表
    double_char = [doub for doub in double_char if "v" not in 词组词性排列(doub)]  # 没有动词
    double_char = [doub for doub in double_char if doub[0] != doub[1]]  # 双字不重复
    double_char = [doub for doub in double_char if doub[::-1] in 汉语词林.双字列表]   # AB倒序BA也是词组
    print(len(double_char), double_char)
   
    # 搜索三字词语XYZ:前两个字倒序也是词语YX。    
    tri_char = 汉语词林.三字列表
    tri_char = [tri for tri in tri_char if "v" in 词组词性排列(tri[:2])]  # 前两个词倒序 YX 中有动词
    tri_char = [tri for tri in tri_char if tri[0] != tri[1]]  # 前两字不重复
    tri_char = [tri for tri in tri_char if tri[1] != tri[2]]  # 后两字不重复
    tri_char = [tri for tri in tri_char if tri[::-1][1:] in 汉语词林.双字列表]  # 前俩字倒序YX也是词组
    print(len(tri_char), tri_char)
  
    # 组合成句子:A B X Y Z Y X B A
    for d in double_char:
        for t in tri_char:
            s = d + t   # A B X Y Z
            t = s[::-1][1:]  # Y Z B A
            print(s+t)  # A B X Y Z  +  Y X B A

    # 统计运行时间计时结束
    end = datetime.datetime.now()
    print("\n运行时间:%s(%d秒)" % (end-begin,(end-begin).seconds))

上述程序还需要改进:双字词组AB和三字词组XYZ的语义关联。

《回文句式初探:“上海自来水来自海上”》

    原文作者:传习者戚
    原文地址: https://www.jianshu.com/p/94329ff6c0f8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞