0
1.5k 次浏览

我有一位同事已经出版了新约,但没有词典。他们有兴趣创建一个,但希望尽可能减少“繁重的工作”。有没有办法将 Paratext 词表导入 FLEx(例如,“导出为 XML”)?这是否被推荐?还有其他建议吗?感谢任何建议。

机器翻译自 English
Paratext (642 分) 发布 | 1.5k 次浏览

8 个回答

+1
最佳答案

Paul - there are lots of thoughts on this. Some people say that you should
not build a dictionary off of translated text. Having said that you could
export the wordlist to xml and then try and import it into FLEx. However
this would give you a mess. You would have multiple different tenses and
forms. I’d suggest you look at the Rapid Word Collection site:
http://rapidwords.net/

anon848905
Americas Area Language Technology Coordinator
[Email Removed]
[Phone Removed]Office at JAARS)
[Phone Removed]Cell)
Skype name: anon848905

较早的帖子 - 以原始语言显示
(9.9k 分) 发布

谢谢 anon848905。我们非常了解 RWC(我已经通过这种方式收集了约 4,000 个单词,并帮助几位同事开始了这项工作)。具体提到的这些同事在该语言领域工作了二十多年,他们正在寻找一种将词形导入 FLEx 的方法,以便他们开始使用那里的批量编辑(Bulk Edit)工具。Rapid Word Collection Lite?我想我是想让他们免去输入可能超过 5,000 个词根的枯燥工作。目前,这是阻碍他们前进的障碍……我会继续寻找其他选项。

机器翻译自 English

如果您从 Paratext 中提取单词列表,并创建一个文本
文档(或者 50 个各含 100 个单词的文档),然后将每个
文档交给 FLEx,并只将属于那里的词形添加到词典中,
会怎样?(根据语言的不同,您可以花些时间设置一些
解析,以便将“acted”解析为“act” + “-ed”等。)

机器翻译自 English

以下是我从 Paratext 词表导出为 XML 的摘录:

我认为进行几次查找/替换(Find / Replace)操作使其变得有用并不难:
查找: <item word=" -> \lx[space]
查找: spelling=“Correct” -> [无]
不过,我不确定如何处理形态(morphs)……也许那必须在 FLEx 中完成。

我会把这个给他们看看,看看这是否是他们所寻找的起点。谢谢。

机器翻译自 English

嗯……难道不能在这个论坛上“粘贴”吗?我在这个窗口中粘贴了一段文本,在编写时它显示出来了,但一旦我发布,它就不见了……

机器翻译自 English
0

你可能粘贴了被 Markdown 格式化程序以特殊方式解释的文本,或者是无效的文本,因此被移除了。
编写时请确保注意预览窗格。

机器翻译自 English
[Expert]
(16.7k 分) 发布

让我再试一次,去掉每行开头的 <:

item word=“abu” spelling=“Correct” morph=“abu” />
item word=“abua” spelling=“Correct” morph=“abu +a” />
item word=“abughami” spelling=“Correct” morph=“abu +ghami” />
item word=“abughamu” spelling=“Correct” morph=“abu +ghamu” />
item word=“abughinia” spelling=“Unknown” morph=“abu +ghini +a” />
item word=“abughita” spelling=“Correct” morph=“abu +ghita” />
item word=“abugho” spelling=“Correct” morph=“abu +gho” />
item word=“abui” spelling=“Correct” morph=“abu +i” />
item word=“abukoira” spelling=“Correct” morph=“abu +ko +ira” />
item word=“abukolu” spelling=“Unknown” morph=“abu +kolu” />
item word=“abura” spelling=“Correct” morph=“abu +ra” />
item word=“aburara” spelling=“Unknown” morph=“abu +ra +ra” />
item word=“abutughami” spelling=“Correct” morph=“abu +tu +ghami” />
item word=“abutuira” spelling=“Correct” morph=“abu +tu +ira” />
item word=“abuu” spelling=“Correct” morph=“abu +u” />

机器翻译自 English
0

所以我做了一个查找和替换,将 < item word=" 更改为 \lx[space]。有没有一个正则表达式可以用来删除单词之后的所有内容,即从第一个 " 到末尾的 >:

\lx abu" spelling=“Correct” morph=“abu” />

机器翻译自 English
(642 分) 发布
0

以下应该有效:
查找: ".+?>
替换: (无)

附注:我强烈推荐 这个网站 来帮助创建正则表达式。这是我找到的最好的一个。 :smile:

机器翻译自 English
[Expert]
(16.7k 分) 发布

完美运行。谢谢!我想这足以让我的同事开始了。 :wink:

机器翻译自 English
0

有一个实用程序可以从 Paratext 逐词对照(Interlinear)中提取释义(glosses),作为 SFM 文件或 Excel 电子表格。可以试试那个。 http://lingtransoft.info/apps/extract-paratext-interlinear-glosses

机器翻译自 English
[Expert]
(2.9k 分) 发布
0

我找到了另一个用于查看 Paratext 逐词对照器(Interlinearizer)中释义的实用程序。 http://lingtransoft.info/apps/glossy

机器翻译自 English
[Expert]
(2.9k 分) 发布

Glossy 可以用来提取释义,以便导入 FLEx,但目前它并不是完全为此设置的。它是用于交互式词典浏览的。如果人们感兴趣,我想我可以想出一种方法来生成 SFM 文件。

机器翻译自 English

Glossy 从 PT 逐词对照器(Interlineariser)中提取释义并导入到类似 SFM 文件的东西上,有任何进展吗?我尝试将文件 lexicon.xml 拖到 ParatextLexiconSetup 程序上。但是当我运行 ParatextLexicon 程序时,我不知道在标记为“SFM File”的槽位中应该输入什么。我看到一个标题为“Convert Paratext Lexicon to SFM”的对话框。然后它提示你为两个字段输入文件名:
Paratext Lexicon,以及
SMF File。
我可以轻松输入 lexicon.xml 文件。但我不知道在 SFM 文件中应该放什么。是否有一个不同的 SFM 格式样式列表可供选择?

机器翻译自 English

anon088806,

SFM File 是所选 lexicon.xml 的输出文件的名称。你可以放入任何你想要的完整路径名称。这将变成所需的 sfm 文件。

kent_schroeder

机器翻译自 English

你好 kent_schroeder,

非常感谢!我没想到解决方案可以这么简单……非常感谢!anon088806

机器翻译自 English
0

看来我们可以使用一个实用程序来处理 Paratext 词表文件。那里有人有兴趣编写一个吗?

机器翻译自 English
[Expert]
(2.9k 分) 发布

你希望这个工具做什么?

kent_schroeder
软件开发者/语言技术顾问
SIL – 非洲重点共享服务

肯尼亚,内罗毕

机器翻译自 English

kent_schroeder,看起来他们想从词表工具中收集单词,以便在 Fieldworks 中制作词典。逐词对照器的数据更好,因为它还有释义,但词表工具很可能会有更多的单词。如果他们能将土著语单词从 html 文件中剥离出来,并用 \lx 标记标记,那么该文件就可以导入到现有的 Flex 数据库中。然后用户必须遍历每个条目,将表面形式调整为真正的词素(lexeme),并自行输入释义和词性。

机器翻译自 English

kent_schroeder,你能给你的软件增加将 Biblicaltermsxyz.xml 文件转换为标准格式的功能吗?另一个帖子中有人想要这样做。

机器翻译自 English
0

这是我用 python3 编写的一个脚本(我使用 Wasta Linux 18.04)。请注意,我在代码中硬编码了输入和输出的路径……

#!/usr/bin/python3
# run with python3 convertLexicon2SFM.py3

# BEST TO IMPORT INTO TEXT AND WORDS - not into the dictionary itself.
#   -Import into Standard Format Words and Glosses

#
#  MODIFIED AND ONLY MILDLY TESTED!!!!  It only includes words that 1.) have glosses
# and 2.) are marked as correctly spelled and 3.) exist in the text.
#

import codecs
from lxml import etree
xmldoc = etree.parse("/home/justin/Desktop/Lexicon.xml")
#Paratext Wordlist Export as XML 
wordlist = etree.parse("/home/justin/Desktop/wordlist.xml")
outfile=codecs.open("/home/justin/Desktop/PT7_dictionary_py3.sfm", mode="w", encoding='utf-8')
outfile.write ("\_sh v3.0  400  MDF\n\_DateStampHasFourDigitYear\n\n")
#correctWords=spellings.getroot().findall("Status")
correctWords=wordlist.getroot().findall("item")
wordlistTotal=len(correctWords)
approvedWords=[]
#for index,word in reversed( list( enumerate(correctWords) ) ) :
for index,word in reversed( list( enumerate(correctWords) ) ) :
  if word.attrib['spelling'] == "Correct" :
  #if word.attrib['State'] == "W" :
    del correctWords[index]
    approvedWords.append(word.attrib['word'])
    #approvedWords.append(word.attrib['Word'])

itemList = xmldoc.getroot().findall("Entries/item")
for item in itemList :
  Lexeme=next( item.iter("Lexeme") )
  if (Lexeme.get('Type') == 'Word') and (Lexeme.get('Form') not in approvedWords) :
    print ( 'unused', Lexeme.get('Type'), Lexeme.get('Form'), "wordlist", wordlistTotal, "incorrect", len(correctWords) )
    continue
  print ( 'good', Lexeme.get('Type'), Lexeme.get('Form'), 'count', approvedWords.count(Lexeme.get('Form')), 'unglossed remaining', len(approvedWords) )
  if approvedWords.count(Lexeme.get('Form')) :
    approvedWords.remove( Lexeme.get('Form') )
  outfile.write ("\n\\lx ")
  if Lexeme.get("Type") == "Suffix" :
    outfile.write ("-")
    #outfile.write ("-", end='')
  outfile.write ("%s" % Lexeme.get("Form"))
  #outfile.write ("%s" % Lexeme.get("Form"), end='')
  if Lexeme.get("Type") == "Prefix" :
    outfile.write ("-")
    #outfile.write ("-", end='')
  outfile.write ("\n")
  outfile.write   ("\\co_Eng %s\n" % next( item.iter("Lexeme") ).get("Type"))
  entryList = item.iter("Gloss")
  sense=1
  for element in entryList :
    if element.get("Language") == "English" :
      outfile.write ("\\sn %s\n" % sense)
      outfile.write ("\\ge %s\n" %  element.text )
      sense+=1
    if element.get("Language") == "Korean" :
      outfile.write ("\\sn %s\n" % sense)
      outfile.write ("\\g_Kor %s\n" %  element.text )
      sense+=1

for Lexeme in approvedWords :
  outfile.write ("\n\\lx %s\n" % Lexeme)
  print ("adding unglossed words", len(approvedWords), Lexeme )

outfile.close()
机器翻译自 English
(105 分) 发布
你好,

我修改了上面的 Python 脚本,使其具有通用性:它会提示输入词表,如果存在词典文件也会提示输入,并输出一个 SMF 文件以导入到 FLEx 中。

#!/usr/bin/python3
"""
wordlist_to_sfm.py

将 Paratext 词表导出为 SFM(标准格式标记)格式,
以便导入到 FLEx(FieldWorks Language Explorer)中。

用法:
    python wordlist_to_sfm.py

脚本将提示输入:
  - Paratext 词表 XML 文件(例如从 Paratext 的词表工具导出)
  - 可选的 Paratext 词典 XML 文件,用于提供英文释义
  - 生成的 .sfm 文件的输出路径

默认情况下,只导出词表中标记为“正确”(Correct)的单词。
可以通过编辑下面的 INCLUDE_* 设置来更改此行为。

输出格式为 MDF(多词典格式化器),这是 FLEx 用于词典导入的标准 SFM 方言。
"""

import codecs
import os
import xml.etree.ElementTree as etree

# --- 设置 ----------------------------------------------------------------
# 控制哪些拼写类别包含在导出中。
# 设置为 True 以包含该类别中的单词,设置为 False 以排除它们。

INCLUDE_CORRECT   = True   # 翻译者已批准的单词
INCLUDE_UNKNOWN   = False  # 尚未审查的单词
INCLUDE_INCORRECT = False  # 被标记为拼写错误的单词

# 设置为 True 以将单词的语料库频率作为注释字段(\co_count)写入
INCLUDE_COUNT     = True
# -----------------------------------------------------------------------------

def prompt_path(prompt_text, default):
    """显示带有可选默认值的提示;返回用户输入或默认值。"""
    display = f" [{default}]" if default else ""
    value = input(f"{prompt_text}{display}: ").strip()
return value if value else default

def get_user_inputs():
    """询问用户运行导出所需的三个文件路径。"""
    print("Paratext 词表到 SFM 导出器")
    print("-----------------------------------\n")

    # 词表是必需的 - 持续询问直到找到文件
    wordlist_path = prompt_path("词表文件 (XML)", "Notsi-WL.xml")
    while not os.path.exists(wordlist_path):
        print(f"  找不到 '{wordlist_path}'。请检查路径并重试。")
        wordlist_path = prompt_path("词表文件 (XML)", "Notsi-WL.xml")

    # 词典是可选的 - 如果未找到则静默跳过
    lexicon_path = prompt_path("用于释义的词典文件(按 Enter 跳过)", "")
    if lexicon_path and not os.path.exists(lexicon_path):
        print(f"  找不到 '{lexicon_path}'。将继续,但不包含释义。")
        lexicon_path = ""

    output_path = prompt_path("输出文件名", "wordlist_for_flex.sfm")
    return wordlist_path, lexicon_path, output_path

def load_lexicon_glosses(lexicon_path):
    """
    从 Paratext 词典 XML 文件中读取英文释义。

    返回一个以词素形式为键的字典,其中每个值包含词素类型(Word, Prefix, Suffix)和英文释义字符串列表。
    如果未提供词典路径,则返回空字典。
    """
    glosses = {}
    if not lexicon_path:
        print("未提供词典 - 条目将不包含释义进行导出。")
        return glosses

    print(f"正在从以下位置读取词典:{lexicon_path}")
    with open(lexicon_path, "rb") as f:
        data = f.read()
    # 去除任何 BOM 变体(标准 UTF-8 BOM,或双重编码的 BOM)
    for bom in (b"\xef\xbb\xbf", b"\xc3\xaf\xc2\xbb\xc2\xbf"):
        if data.startswith(bom):
            data = data[len(bom):]
            break
    xmldoc = etree.fromstring(data)

    for item in xmldoc.findall("Entries/item"):
        lexeme = next(item.iter("Lexeme"), None)
        if lexeme is None:
            continue

        form     = lexeme.get("Form", "")
        lex_type = lexeme.get("Type", "Word")  # Word, Prefix 或 Suffix

        # 收集此条目的所有英文释义(可能有一个以上的义项)
        entry_glosses = [
            gloss.text
            for gloss in item.iter("Gloss")
            if gloss.get("Language") == "en" and gloss.text
        ]

        if form and entry_glosses:
            glosses[form] = {"type": lex_type, "glosses": entry_glosses}

    print(f"  找到 {len(glosses)} 个带有英文释义的条目。")
    return glosses

def build_approved_list(wordlist_path):
    """
    读取 Paratext 词表 XML 并返回通过 INCLUDE_* 过滤器的单词。

    返回一个已批准单词形式的列表,以及一个包含每个单词的语料库计数、连字符和形态分解的元数据字典。
    """
    wordlist  = etree.parse(wordlist_path)
    all_items = wordlist.getroot().findall("item")
    print(f"正在从以下位置读取词表:{wordlist_path}")
    print(f"  在列表中找到 {len(all_items)} 个单词。")

    approved = []
    metadata = {}

    for item in all_items:
        spelling = item.attrib.get("spelling", "Unknown")
        word     = item.attrib.get("word", "")

        include = (
            (spelling == "Correct"   and INCLUDE_CORRECT)   or
            (spelling == "Unknown"   and INCLUDE_UNKNOWN)   or
            (spelling == "Incorrect" and INCLUDE_INCORRECT)
        )

        if include and word:
            approved.append(word)
            metadata[word] = {
                "count":          item.attrib.get("count", "0"),
                "hyphenation":    item.attrib.get("hyphenation", ""),
                "morphology":     item.attrib.get("morphology", ""),
                "morph_approved": item.attrib.get("morphologyApproved", "False"),
                "specificcase":   item.attrib.get("specificcase", ""),
            }

    print(f"  {len(approved)} 个单词被标记为正确并准备导出。")
    return approved, metadata

def write_sfm_entry(outfile, word, lex_type, glosses, meta, include_count):
    """
    将单个 SFM 词典条目写入输出文件。

    遵循的 MDF 约定:
      \\lx  - 词素(标题词);词缀在结合侧添加连字符
      \\sn  - 义项编号(每个释义写一次)
      \\ge  - 该义项的英文释义
      \\mr  - 形态字符串(当被翻译者批准时)
      \\co_* - 用于 FLEx 没有标准标记的元数据的注释字段
    """
    # 写入标题词,添加连字符以显示词缀结合点
    outfile.write("\n\\lx ")
    if lex_type == "Suffix":
        outfile.write("-")
    outfile.write(word)
    if lex_type == "Prefix":
        outfile.write("-")
    outfile.write("\n")

    # 将词缀类型记录为注释,以便在 FLEx 导入后保留
    if lex_type != "Word":
        outfile.write(f"\\co_type {lex_type}\n")

    # 语料库频率 - 对于在词典工作中优先处理条目很有用
if include_count and meta:
        outfile.write(f"\\co_count {meta['count']}\n")

    # 形态:如果分析已获批准,使用标准的 \\mr 标记,
    # 否则将其存储为注释,以避免导入未经验证的数据
    if meta and meta["morphology"]:
        marker = "\\mr" if meta["morph_approved"] == "True" else "\\co_morph"
        outfile.write(f"{marker} {meta['morphology']}\n")

    # 为每个释义写入一个义项块
    for sense_num, gloss_text in enumerate(glosses, start=1):
        outfile.write(f"\\sn {sense_num}\n")
        outfile.write(f"\\ge {gloss_text}\n")

def main():
    """
    主导出例程。

    两遍方法:
      第一遍 - 写入具有词典释义的条目(先写入数据更丰富的内容)
      第二遍 - 写入剩余的没有词典条目的已批准单词
    这确保了带释义的条目不会被重复。
    """
    wordlist_path, lexicon_path, output_path = get_user_inputs()
    print()

    approved_words, metadata = build_approved_list(wordlist_path)
    lexicon_glosses           = load_lexicon_glosses(lexicon_path)

    # 以 UTF-8 打开输出文件并写入 MDF 头
    outfile = codecs.open(output_path, mode="w", encoding="utf-8")
    outfile.write("\\_sh v3.0  400  MDF\n\\_DateStampHasFourDigitYear\n\n")

    remaining    = list(approved_words)  # 第一遍之后仍需写入的单词
    with_glosses = 0

    # 第一遍:同时出现在词典和已批准词表中的条目
    for form, lex_data in lexicon_glosses.items():
        if form not in approved_words:
            print(f"  跳过 '{form}'(在词典中,但未在词表中标记为正确)")
            continue
        if form in remaining:
            remaining.remove(form)
        write_sfm_entry(outfile, word=form, lex_type=lex_data["type"],
                        glosses=lex_data["glosses"], meta=metadata.get(form),
                        include_count=INCLUDE_COUNT)
        with_glosses += 1

    # 第二遍:没有词典条目的已批准单词 - 不含释义导出
    for word in remaining:
        write_sfm_entry(outfile, word=word, lex_type="Word", glosses=[],
                        meta=metadata.get(word), include_count=INCLUDE_COUNT)

    total = with_glosses + len(remaining)
    outfile.close()
    print(f"\nExport 完成。")
    print(f"  写入的总条目数 : {total}")
    print(f"  带释义的       : {with_glosses}")
    print(f"  不带释义的     : {len(remaining)}")
    print(f"  输出文件       : {output_path}")

if __name__ == "__main__":
    main()
机器翻译自 English

相关问题

+1
3 个回答 435 次浏览
Exporting the Wordlist to HTML is a nice feature, except that for many users including me, working with HTML is ... that are currently marked as spelled correctly in PT? anon101508
anon101508 117 发布 提问于 三月 11, 2019
0
6 个回答 684 次浏览
这是今天发布在 FLEx 列表上的帖子 我有一些评论,将添加在这个引用问题下方: 2021 年 10 月 12 日,下午 3:29,jeffh [Email Removed] 写道: 有人能解释一下 Paratext 和 FLEx 之间的当前连接吗?我知道 ... 的逐词对照数据库),他们会 丢失数据 有多少人想要使用此功能,但因为这个错误而避免使用它?
bbryson 105 发布 提问于 十月 12, 2021
0
4 个回答 787 次浏览
我正在帮助一位用户解决 Paratext Flex 集成问题(与 Tone Sandhi 相关),在将 FLEx 和 Paratext 项目都安装到我的电脑后,我遇到了一个 Paratext 问题 当我尝试打开 Paratext 项目的 项目属性 ... FLEx 项目版本为 8.1.3,可以正常打开 Paratext 项目版本为 8 有什么建议吗?
MSEAIT_LT 478 发布 提问于 五月 28, 2020
0
3 个回答 310 次浏览
I have a user who is trying to export from Paratext 8.0 to a FLEx text. If he does a copy/paste in Standard ... 444 | Papua New Guinea [Email Removed].pgmailto:[Email Removed].pg
SIL LSS PNG 411 发布 提问于 十一月 15, 2017
0
1 个回答 187 次浏览
在 Paratext 9.3 中,是否可能: 将项目中所有书籍的词汇表打印到一个文件中,以便我将其按字母顺序排列? 将所有专有名词(地名和人名)打印到一个按字母顺序排列的列表中?
debbodaneejo 118 发布 提问于 二月 16, 2023
Welcome to Support Bible, where you can ask questions and receive answers from other members of the community.
How good and pleasant it is when God’s people live together in unity!
Psalm 133:1
3,046 个问题
6,006 个回答
5,671 条评论
2,027 位用户