首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >利用NLTK和CMU字典发现诗歌形式

利用NLTK和CMU字典发现诗歌形式
EN

Stack Overflow用户
提问于 2013-09-26 05:35:25
回答 3查看 4.1K关注 0票数 17

编辑:此代码已经作为一个基本模块进行了处理和发布:

我是一名语言学家,最近学会了python,我正在做一个项目,希望能自动分析诗歌,包括检测诗歌的形式。例如,如果它找到一个10个音节的行,重音模式为0101010101,它就会宣布它是抑扬格五步格。一首具有5-7-5音节模式的诗将是一首诗歌。

我正在使用下面的代码,这是一个更大的脚本的一部分,但我有一些问题列在程序下面:

脚本中的语料库只是诗歌的原始文本输入。

代码语言:javascript
运行
复制
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字典还经常说,当没有- '0 -时,单词- '1‘有重音。这就是为什么输出看起来像这样: 1101111101,而它应该是抑扬格五步格的重音: 0101010101

那么,我如何添加一些模糊因子,以便诗歌在仅近似模式的情况下仍然被识别为抑扬格五步格呢?当CMU字典不会输出如此干净的结果时,编写一个识别01行的函数是不好的。我想我是在问如何编写一个“部分匹配”算法。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19015590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档