首页 > 黑暗科技研究 > 文案生成器·初版

文案生成器·初版

2015年6月27日 发表评论 阅读评论

博文标题叫初版,其实并不一定会有终版,好吧,感觉是太久没写博客了,已然长草,就来拔拔草吧。。其实不是工作后没时间,时间还是有很多的,只不过感觉工作后的业余时间更应该拿来放松,so。。。

总之,这篇博文也是一篇毫无时效性的东西(为什么是“也”),根据Github的commit记录,若干个星期前的某个周末,早上醒来不想起床,就拿手机刷了一下朋友圈,那一阵子娱乐圈有个很火(大概,因为不太关心)的新闻,就是范冰冰和李晨公开恋情的新闻(大概是为了阻止汪峰吧。。所以李晨很有名么?),然后朋友圈看到一篇分享,讲的是各家媒体啊官微啊什么的针对这两位明星写的各种“神级”文案,比如『冰冰有李』,『冰临晨下』,『先李后冰』啊什么的。。

然后我一时脑洞,想到其实对于这类谐音的文案,其实可以做成一个自动生成器,反正规则很明确,输入目标词汇,比如两个人的名字(或者别的),只需要有一个拼音库,一大堆目标“知识库”,that all!

想法很简单,实现起来更简单,直接在网上找了三个库,正则表达式处理一下弄成统一格式的txt,一个成语库,一个唐诗库,一个宋词库,当时还想找一个歇后语库的。。。

然后python写了一个脚本实现简单的查找和替换:

import re
import sys
pinyin_dict = {}

def LoadPinyinDict():
    global pinyin_dict
    for line in open('pinyin.txt'):
        line = line.replace('\n','')
        line = line.split(":")
        pinyin_dict[unicode(line[0],"utf-8")] = line[1].split(",")

def UniformPinyin(pinyin):
    pinyin, number = re.subn('(.)h(.*)', r'\1\2', pinyin)
    pinyin, number = re.subn('(.*)ng', r'\1n', pinyin)
    return pinyin

def GetPinyin(word):
    if pinyin_dict.has_key(word):
        return pinyin_dict[word][0]
    else:
        return "-"

def convertPinyin(word):
    # word = word.replace(",","")
    return map(lambda x:UniformPinyin(GetPinyin(x)),word)

def ValidCheck(wordList_py,dstWord_py):
    idx = []
    for wordidx,wordpy in enumerate(wordList_py):
        inflag = False
        for pyidx,py in enumerate(wordpy):
            if py in dstWord_py:
                dstidx = dstWord_py.index(py)
                idx.append([wordidx,pyidx,dstidx])
                inflag = True
        if not inflag:
            return []
    return idx

def PrintValidResult(pinyinSet,oriText,wordList):
    line = oriText
    dstWord_py =  convertPinyin(line)
    ReplaceRule = ValidCheck(pinyinSet,dstWord_py)
    if len(ReplaceRule):
        result = list(line)
        for replace_idx in ReplaceRule:
            dst = wordList[replace_idx[0]][replace_idx[1]]
            src = result[replace_idx[2]]
            line = line.replace(src,dst)
        print line,'<<----',oriText

def main(argv1,argv2):
    wordList = [argv1,argv2]
    wordList = map(lambda x:unicode(x,"utf-8"),wordList)
    pinyinSet = map(lambda x:convertPinyin(x),wordList)
    for (linenum,oriText) in enumerate(open('chengyu.txt')):
        oriText = unicode(oriText.replace('\n',''),"utf-8")
        PrintValidResult(pinyinSet,oriText,wordList)

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print "python InspirationHub.py input1 input2"
    else:
        LoadPinyinDict()
        main(sys.argv[1],sys.argv[2])

主要麻烦就是中文编码那些,全部转成unicode最了事。。其中UniformPinyin函数是为了解决前鼻音后鼻音,还有sh,s相似问题。

完整代码在Github,有爱自取;

运行的结果表示,嗯,我的语文功底实在太弱。。。好多古文的那些句子成语从来没听过。。代码里后来就把唐诗和宋词的给注释掉了,因为结果数目实在太多了。。。

就成语而言,想要的结果还是可以出得来的,比如:

python InspirationHub.py 范冰冰 李晨
先李后冰 <<---- 先礼后兵
冰临晨下 <<---- 兵临城下
千李冰封 <<---- 千里冰封
单冰孤晨 <<---- 单兵孤城
卧冰求李 <<---- 卧冰求鲤
晨羹涂范 <<---- 尘羹涂饭
晨范涂羹 <<---- 尘饭涂羹
冰冰有李 <<---- 彬彬有礼
撒豆晨冰 <<---- 撒豆成兵
范下屠刀,立地晨佛 <<---- 放下屠刀,立地成佛
晨炊星范 <<---- 晨炊星饭
范滥晨灾 <<---- 汎滥成灾
晨滓范起 <<---- 沉滓泛起
范滥晨灾 <<---- 泛滥成灾
滴水晨冰 <<---- 滴水成冰
炊沙晨范 <<---- 炊沙成饭
生米做晨熟范 <<---- 生米做成熟饭
生米煮晨熟范 <<---- 生米煮成熟饭
李先一范 <<---- 礼先一饭
李先壹范 <<---- 礼先壹饭
艳如桃李,冷若冰霜 <<---- 艳如桃李,冷若冰霜
蒸沙晨范 <<---- 蒸沙成饭

然后又试了一组“汪峰头条应对小分队”的:

python InspirationHub.py 诗诗 吴奇隆
万吴一诗 <<---- 万无一失
事吴常诗 <<---- 事无常师
公平吴诗 <<---- 公平无私
公正吴诗 <<---- 公正无私
兼爱吴诗 <<---- 兼爱无私
出诗吴名 <<---- 出师无名
各诗奇事 <<---- 各司其事
大公吴诗 <<---- 大公无私
学吴常诗 <<---- 学无常师
诗居隆见 <<---- 尸居龙见
诗出吴名 <<---- 师出无名
诗归奇雌 <<---- 思归其雌
教吴常诗 <<---- 教无常师
吴诗有线 <<---- 无丝有线
吴名之诗 <<---- 无名之师
吴诗自通 <<---- 无师自通
...(以下省略一大堆。。)

所以这篇博文临时想写的(水存在感用),暂时是一个没啥用的雏形,总之,后续如果继续弄完善。。。。。。。的话,那就。。。。。再说吧。。。。反正坑已经够多了。。。现在想到的可以“改进”的方案有以下:

      根据词语在别的文库中出现的频率来给结果打分,高分的可以放前面。(几个月前VPS花了24天爬回来一个超大的极具中国特色的文库。。orz)
      做一个前端页面,中间大号输入框输入目标词汇,然后泡泡状“文案”不断冒出来飘动,而且分数越高的文案气泡越大(好久没写这种了,回头可以拿这个练手。。)。
      感觉应该可以进一步过滤掉一些没有意义的文案(最近因为工作原因,对NLP很感兴趣。。)

收工,撤。。(好久没写这么短的博文了。。)

9月
29

闲着没事补充了一个可以匹配不同声调韵母的版本InspirationHub_2.py,其实就是增加了:

def GetPinyin(word):
    if not pinyin_dict.has_key(word):
        return "-"
    res = pinyin_dict[word][0]
    res = re.sub("[ā|á|ǎ|à]","a",res)
    res = re.sub("[ō|ó|ǒ|ò]","o",res)
    res = re.sub("[ē|é|ě|è]","e",res)
    res = re.sub("[ī|í|ǐ|ì]","i",res)
    res = re.sub("[ū|ú|ǔ|ù]","u",res)
    res = re.sub("[ǖ|ǘ|ǚ|ǜ]","ü",res)
    return res

这样就可以匹配『一拍纪和』了~~我也是够无聊的。。


【完】

本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com

分类: 黑暗科技研究 标签:
  1. 博主有段时间没更新了。这篇博文想的挺好。但不知道原来的word中的模糊查找加替换是不是能达到这个效果。

  2. Traceback (most recent call last): File "InspirationHub.py", line 99, in main(sys.argv ,sys.argv ) File "InspirationHub.py", line 86, in main wordList = map(lambda x:unicode(x,"utf-8"),wordList) File "InspirationHub.py", line 86, in wordList = map(lambda x:unicode(x,"utf-8"),wordList)UnicodeDecodeError: 'utf8' codec can't decode byte 0xb7 in position 0: invalid start byte

  3.   “你干嘛打我?”
      “因为你没有女朋友啊!”
      “你自己不也没有!”
      “对啊,所以大家都说我要打一辈子的光棍。”

  4. 为什么我下载了python2.7.3后运行程序python InspirationHub.py 范冰冰 李晨最后显示:======== RESTART: E:DesktopInspirationHub-masterInspirationHub.py ========python InspirationHub.py input1 input2>>> python InspirationHub.py 范冰冰 李晨SyntaxError: invalid syntax求各位大神指教啊,研究了两天,就是没办法啊。我因为这个有意思的文案神器才刚刚开始接触python……