作为一个妄想成为rapper的porgrammer,
写歌词想不出双押可是个matter,
我又不想每次点开我的browser,
不亲自做点什么哪配当coder!
之前我们学习过jieba分词库,用于中文分词。可是押韵看的是拼音,jieba分词显然不好用了,但是别担心,python还有个xpinyin库,可以将中文转换成拼音,只需要先pip install,再导入即可:
from xpinyin import Pinyin
我的思路是这样的:输入要查询的词语后,利用xpinyin库分离出拼音(通常押韵可以简略地看做后面的元音相同),然后我们便通过正则表达式过滤掉拼音开头的辅音,留下的便是韵脚。将这个韵脚字符串与事先准备好的txt格式的词库(网上随意下载)进行遍历比较,两个字的韵脚均相同,即为要寻找的双押词,把词语输出即可。
下面是一些关键步骤的代码:
由于我下载的词库格式有问题,词语之间没有分隔,所以我先用jieba分词把词语分开:
word_lst = [] #用于存储划分后的词语
for line in open('ch_dict.txt',errors='ignore'):
item = line.strip('\n\r').split('\t') #制表格切分
tags = jieba.analyse.extract_tags(item[0]) #jieba分词
for t in tags:
word_lst.append(t)
将输入的词语转换成拼音并提取韵脚:
p = Pinyin()
s0=str(input())
s0=p.get_pinyin(s0).split('-') #转换后的拼音是“xx-xx”格式的,因此通过“-”将拼音分割
#提取韵脚
s_first=re.findall(r".*[b,c,d,f,h,j,k,l,m,p,q,r,s,t,w,x,y,z](.*).*",s0[0])
s_last=re.findall(r".*[b,c,d,f,h,j,k,l,m,p,q,r,s,t,w,x,y,z](.*).*",s0[1])
然后遍历word_lst,用同样的方法提取韵脚,与s_first、s_last比较,但此时应注意,由于词库里有超过两个字的词,所以为了查找双押,应该改变字符串的索引位置:
s1=p.get_pinyin(str(word_lst[i])).split('-') #将词库的每个词转换成拼音
正则表达式分别取s1[-1]和s1[-2],即最后两个字
遍历过程中进行判断,将符合条件的词语输出:
if s_first==s1_first and s_last==s1_last and str(word_lst[i]) not in s:
print(str(word_lst[i]))
s.append(str(word_lst[i])) #s用于判断词语是否重复,初始化为空列表
写完收工,接下来写歌去吧!