我有点困在一个关于抑扬格五音步的问题上,但因为它很长,我会尽量简化它。
所以我需要从一个看起来有点像这样的文本文件中获取一些单词及其重音模式:

if, 0
music,10
be,1
the,0
food,1
of,0
love,1
play,0
on,1
hello,01
world,1

从文件中,您可以假设不同的句子会有更多的单词。我试图从包含多个句子的文本文件中获取句子,并查看句子(忽略标点符号和大小写)是否是抑扬格五音步。

例如,如果文本文件包含以下内容:
If music be the food of love play on
hello world

第一句将从重音字典中分配如下: 0101010101 ,第二句显然不是五音表( 011 )。我希望它只打印抑扬格五音步的句子。

对不起,如果这是一个令人费解或困惑的问题。
这是我到目前为止:
import string
dict = {};
sentence = open('sentences.txt')
stress = open('stress.txt')
for some in stress:
  word,number = some.split(',')
  dict[word] = number
for line in sentence:
  one = line.split()

最佳答案

我认为您没有正确构建压力词典。记住在读入行时从行中删除隐含的 \n 字符至关重要,并在分隔逗号后从单词中删除任何空格。就目前情况而言,if, 0 行将拆分为 ['if', ' 0\n'],这不是您想要的。

因此,要创建压力词典,您可以执行以下操作:

stress_dict = {}

with open('stress.txt', 'r') as f:
    for line in f:
        word_stress = line.strip().split(',')
        word = word_stress[0].strip().lower()
        stress = word_stress[1].strip()
        stress_dict[word] = stress

对于实际检查,@khelwood 的答案是一个很好的方法,但我会在您阅读行时格外小心地处理 \n 字符,并确保该行中的所有字符都是小写的(就像在您的字典)。

定义一个函数 is_iambic_pentameter 来检查一个句子是否是抑扬格五音步(返回 True/False ),然后检查 sentences.txt 中的每一行:
def is_iambic_pentameter(line):
    line_stresses = [stress_dict[word] for word in line.split()]
    line_stresses = ''.join(line_stresses)
    return line_stresses == '0101010101'

with open('sentences.txt', 'r') as f:
    for line in f:
        line = line.rstrip()
        line = line.lower()
        if is_iambic_pentameter(line):
            print line

顺便说一句,您可能对 NLTK 感兴趣,这是一个 Python 的自然语言处理库。一些互联网搜索发现,人们已经编写了俳句生成器和其他脚本来使用图书馆评估诗歌形式。

10-08 02:07