编辑:此代码已经作为一个基本模块进行了处理和发布:
我是一名语言学家,最近学会了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
第一个问题是我在标记化过程中丢失了换行符,我真的需要换行符来识别表单。不过,这应该不会太难处理。更大的问题是:
那么,我如何添加一些模糊因子,以便诗歌在仅近似模式的情况下仍然被识别为抑扬格五步格呢?当CMU字典不会输出如此干净的结果时,编写一个识别01行的函数是不好的。我想我是在问如何编写一个“部分匹配”算法。
https://stackoverflow.com/questions/19015590
复制相似问题