0

这是作为初学者非常友好地提供给我的脚本:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import with_statement    # needed for Python 2.5
from itertools import chain

def chunk(s):
    """Split a string on whitespace or hyphens"""
    return chain(*(c.split("-") for c in s.split()))

def process(latin, gloss, trans):
    chunks = zip(chunk(latin), chunk(gloss))
    # now you have to DO SOMETHING with the chunks!

def main():
    with open("examples.txt") as inf:
        try:
            while True:
                latin = inf.next().strip()
                gloss = inf.next().strip()
                trans = inf.next().strip()
                process(latin, gloss, trans)
                inf.next()    # skip blank line
        except StopIteration:
            # reached end of file
            pass

if __name__=="__main__":
    main()

我不确定我是否遗漏了任何东西,但输出只是空白,让我回到 $.

我正在尝试执行以下操作:
我有一个非英语语言的文本,使用连字符分解成语素(每个单词的一部分),带有英语光泽(每个语素的语言翻译)和下面的直接翻译。

例如。

Itali-am fat-o profug-us Lavini-a-que ven-it

意大利-Fem:Sg:Acc 命运-Neut:Sg:Abl 逃亡-Masc:Sg:Nom Lavinian-Neut:Pl:Acc come:Perf-3-Sg:Indic:Act

“在飞行中[驱使]命运来到意大利和拉维尼亚[海岸]”

我将在一个文件中包含多个文本,例如上述文本 - 即

空行

一行用连字符分隔的拉丁文

一条用相应连字符分解的光泽线,使用冒号连接元素

一行翻译

空行

拉丁

光泽度

翻译

无止境。

我需要做的是编写一个文件,它给我以下输出:

意大利语:1 意大利
上午:1 Fem:Sg:Acc
脂肪:1 命运
o: 1 中性:Sg:Abl
profug: 1 逃离
我们:1 Masc:Sg:Nom
拉维尼:1个拉维尼
a: 1 Neug:Pl:Acc
que: 1 来:Perf
文:1 3
它:1 Sg:Indic:Act

其中第一列表示没有连字符的第一行文本;第二列表示出现的次数(在本例中每个只有 1 次),第三列是第一列的英文翻译,如文中所写。

如果有一个拉丁语素没有对应的英语注释/翻译,拉丁栏将照常显示,但英语栏将打印 [unknown],如:

a:  1   [unknown]

如果相反,即没有对应拉丁语的英语语素,它应该打印

[unknown]:  1   kitten

最后,prog 需要能够处理同音词素(即两个拼写相同但含义不同的拉丁语素)。例如

a:  16  Neuter:Plural
a:  28  Feminine:Singular

再次,这是家庭作业,任何指针都会很棒。现在正在整理一些脚本以上传到这里以供批评!

4

1 回答 1

1

由于多行结构,处理文件有点棘手;而不是通常的逐行迭代,我建议这样的事情(根据您的示例,我假设文件实际上并不以空行开头,而是它使用空行作为分隔符):

with open("input.txt") as inf:
    try:
        while True:
            latin = inf.next().strip()
            gloss = inf.next().strip()
            trans = inf.next().strip()
            process(latin, gloss, trans)
            inf.next()    # skip blank line
    except StopIteration:
        # reached end of file
        pass

process然后必须将它们分成块latingloss适当地配对:

from itertools import chain

def chunk(s):
    """Split a string on whitespace or hyphens"""
    return chain(*(c.split("-") for c in s.split()))

def process(latin, gloss, trans):
    chunks = zip(chunk(latin), chunk(gloss))

像这样称呼它

process(
    "Itali-am fat-o profug-us Lavini-a-que ven-it",
    "Italy-Fem:Sg:Acc fate-Neut:Sg:Abl fleeing-Masc:Sg:Nom Lavinian-Neut:Pl:Acc come:Perf-3-Sg:Indic:Act",
    "in flight [driven] by fate came to Italy and the Lavinian [shores]")

chunks

[('Itali', 'Italy'),
 ('am', 'Fem:Sg:Acc'),
 ('fat', 'fate'),
 ('o', 'Neut:Sg:Abl'),
 ('profug', 'fleeing'),
 ('us', 'Masc:Sg:Nom'),
 ('Lavini', 'Lavinian'),
 ('a', 'Neut:Pl:Acc'),
 ('que', 'come:Perf'),
 ('ven', '3'),
 ('it', 'Sg:Indic:Act')]

剩下的就是学生的练习——保持块的连续计数,然后适当地排序和显示。希望有帮助!

于 2012-05-05T03:30:07.283 回答