为文本处理创建模式列表

时间:2015-12-26 14:16:05

标签: python regex

我正在研究一个简单的随机诗发生器程序。我有一些模型的单词列表,如:名词,形容词,动词等。我实现它们:

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

1 个答案:

答案 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+">": 

会起作用。