我正在研究一个简单的随机诗发生器程序。我有一些模型的单词列表,如:名词,形容词,动词等。我实现它们:
adjective = open('lexicon/adjective.txt')
noun = open('lexicon/noun.txt')
verb = open('lexicon/verb.txt')
文本文件采用以下格式:noun.txt
tree
fish
computer
..
我正在使用此功能从中选择一个随机单词:
def select_word(model):
lines = model.read().splitlines()
selectedline = random.choice(lines)
return selectedline
我也有这种格式的pos标签列表(它们是我自己的语言,我只是提供英文示例以便更好地理解):
went go[simplepast]
gone go[pastperfect]
..
我正在使用此函数在给定单词和postag
的空白之前获取第一个字符串def find_postag(word,postag):
global selectedword
zemberek = open('parse.txt')
for line in zemberek:
if all(i in line for i in (word,postag)):
selectedword = line.split(" ")[0]
break
return selectedword
我的想法是:我需要创建一个巨大的诗歌模式列表,用于将随机单词放入这些模式中合适的位置。例如,假设我的模式列表中有这个句子:
I was like a *noun*
程序应调用select_word(noun)
函数(假设它返回"tree"
)并生成如下内容:
I was like a tree
假设在一个单词后面有一个postag定义(抱歉,我找不到合适的英语示例):
I *verb*"[Past]" a friend of mine.
现在程序应该调用select_word(verb)
函数来选择一个随机字,假设它现在返回"host"
它应该调用find_postag("host","[Past]")
它将返回"hosted"
输出应该是:
I hosted a friend of mine.
我的问题是:我不确定模式的格式。 *
和"
字符仅用于表示,我不必使用它们。我正在考虑以这种格式构建模式列表:
<pattern number=1 theme=heroic>
*noun* *nnoun* gibi
*nverb*"[Verb]+[Pos]+DH[Past]+m[A1sg]" deneme *adjective*"[Adj]-[Noun]+[A3sg]+Hm[P1sg]+[Nom] :"
</pattern>
<pattern number=2 theme=love>
(some other lines)
</pattern>
我试着像这样解析它:
def read_pattern(number,theme):
pattern = open('poempatterns.txt').read().splitlines()
for line in pattern:
if line == "<pattern number="+number+" theme="+theme+">":
while line != "</pattern>":
#DO PARSING
你对模式列表的格式有什么建议?如何解析单词和单独的postag
答案 0 :(得分:-1)
如果您可以控制数据的结构,我建议使用更像JSON的结构化表示。
一个例子是:
[{number: 1, theme: heroic, structure: [{type:"noun", modifier:["Past",..]},{..}]}]
python(json.loads
)中也有一个内置的json解析器。
P.S。我不认为:
if line == "<pattern number="+number+" theme="+theme+">":
会起作用。