可以区分诗词就更好了
amaozhao opened this issue · 17 comments
可以区分诗词就更好了
这是个好注意,但是该怎么实现呢?若仅以句子是否整齐来判断大概是不妥的,如”安能催眉折腰事权贵,使我不得开心颜。“前后半句字数不等但却为诗而不是词。
我感觉如果要做的话, 只能将所有的词牌的格式字数拿去匹配了, 不过这个想一想就蛮难的 😂
粗略的来看的话是不是可以直接哪词牌/曲牌来区分呢?
可以试试,哪里有比较全的词牌/曲牌数据呢?
这.... 不知道诶. 估计还是要爬一爬
http://www.shicimingju.com/cipai/index.html
https://www.gushiwen.org/shiwen/cipai/
(但是感觉也不好说是全的...
可以考虑给每首诗词添加一个“词曲牌名”字段,匹配到的就填入相应的词牌或曲牌名,没有匹配到的就填未知。
所以我们第一步是不先把这些数据转到数据库里面去 😂
我在数据库里有存的,这里的数据是导出来的:joy:
想到一个问题, 如果用词牌来判定的话, 应该不能简单的用contains
来判, 刚刚随便翻了一下宋词部分,发现有这么一下几种格式:
"好事近 其二 待月不至"
"如梦令"
"红娘子/连理枝"
然后要搞的话是不是用这些格式之一来匹配 (不知道还有没有其他格式)
似乎只通过标题就能判断出来,用startsWith,如:
"好事近 其二 待月不至".startsWith("好事近")
我一开始的想法是把这三种模式都去匹配, 当其中一个匹配通过的时候就返回真, , 大概是这样
def check(title, cipai):
return title == cipai
|| title.startWith(cipai) && title.index(cipai) == ' '
|| title.startWith(cipai) && title.index(cipai) == '/'
我原本想先找出标题中最前面的连续汉字字符串,用此字符串和词/曲牌名做比较。代码如下:
>>> import re
>>> matchObj = re.match('[\u4e00-\u9fa5]+', "红娘子/连理枝")
>>> if matchObj:
... print ("matchObj.group() : ", matchObj.group())
...
matchObj.group() : 红娘子
但看到了“好事近二首”这样的标题,所以此方法行不通,考虑还是用startsWith做判断。
但进一步检查发现一些词/曲牌名是另一些词/曲牌名的前缀,如:
梁州令 <----> 梁州令叠韵
惜花春 <----> 惜花春起早慢
虞美人 <----> 虞美人令
愁倚阑 <----> 愁倚阑干令
而一个词/曲牌又可能有多个别名,如《鹊桥仙》,词牌名,又名《鹊桥仙令》、《金风玉露相逢曲》、《广寒秋》等,这就让事情变得更复杂了。
看了一下cipai_2
里面是包括了 梁州令
和梁州令叠韵
, 鹊桥仙
和鹊桥仙令
,广寒秋
的, 但是金风玉露相逢曲
曲没有看到, 所以其实上面的逻辑问题应该不是很大, 可能只是少量词牌不会被识别罢了,
关于匹配模式, 我上面所说的模式主要是担心比如有些诗的名字恰好与词牌重复, 比如惜花春去啊
什么之类的会判为词
发现原来一个词牌可以对应好多种不同的格式,如《浣溪沙》就有:
- 双调四十二字,前段三句三平韵,后段三句两平韵
- 双调四十二字,前后段各三句、两平韵
- 双调四十四字,前段三句三平韵,后段五句两平韵
- 双调四十六字,前段五句三平韵,后段五句两平韵
- 双调四十二字,前后段各三句、三仄韵
对的, 所以根据字数格式判断其实还是蛮难的
我发现在cipai_2文档中出现了叫”九日“的词牌。但是有很多诗的题目就叫做《九日》,这些就不能算作词。而许多词标题又仅由词牌组成,如《浣溪沙》。
5 年过去了,也没有找到合适的方法。这个 Issue 先关闭了。