编辑:此代码已作为基本模块处理并发布:https ://github.com/hyperreality/Poetry-Tools
我是一名语言学家,最近学习了 python,我正在从事一个希望自动分析诗歌的项目,包括检测诗歌的形式。即,如果它找到一个 10 音节线,重音模式为 0101010101,它会声明它是抑扬格五音步。具有 5-7-5 音节模式的诗歌将是俳句。
我正在使用以下代码,它是较大脚本的一部分,但我有一些问题列在程序下方:
脚本中的语料库只是诗歌的原始文本输入。
import sys, getopt, nltk, re, string
from nltk.tokenize import RegexpTokenizer
from nltk.util import bigrams, trigrams
from nltk.corpus import cmudict
from curses.ascii import isdigit
...
def cmuform():
tokens = [word for sent in nltk.sent_tokenize(corpus) for word in nltk.word_tokenize(sent)]
d = cmudict.dict()
text = nltk.Text(tokens)
words = [w.lower() for w in text]
regexp = "[A-Za-z]+"
exp = re.compile(regexp)
def nsyl(word):
lowercase = word.lower()
if lowercase not in d:
return 0
else:
first = [' '.join([str(c) for c in lst]) for lst in max(d[lowercase])]
second = ''.join(first)
third = ''.join([i for i in second if i.isdigit()]).replace('2', '1')
return third
#return max([len([y for y in x if isdigit(y[-1])]) for x in d[lowercase]])
sum1 = 0
for a in words:
if exp.match(a):
print a,nsyl(a),
sum1 = sum1 + len(str(nsyl(a)))
print "\nTotal syllables:",sum1
我想我想要的输出是这样的:
1101111101
0101111001
1101010111
第一个问题是我在标记化过程中丢失了换行符,我真的需要换行符才能识别表单。不过,这不应该太难处理。更大的问题是:
- 我无法处理非字典单词。目前我为他们返回 0,但这会混淆任何识别这首诗的尝试,因为该行的音节数可能会减少。
- 此外,CMU 词典经常说一个单词有重音 - '1' - 没有 - '0 - 。这就是为什么输出看起来像这样的原因:1101111101,当它应该是五音抑扬格的重音时:0101010101
那么我该如何添加一些捏造因素,以便这首诗在仅接近模式时仍被识别为抑扬格五音步?当 CMU 字典不会输出如此干净的结果时,编写一个识别 01 行的函数是不好的。我想我在问如何编写“部分匹配”算法。