0 votos
1,5k visualizações

Eu tenho um colega com um NT publicado, mas sem dicionário. Ele está interessado em criar um, mas gostaria de evitar o máximo de “trabalho pesado” possível. Existe uma maneira de transferir a Lista de Palavras do Paratext para o FLEx (por exemplo, “Exportar para XML”)? Isso é recomendado? Há outras recomendações? Obrigado por qualquer conselho.

Tradução automática de English
Paratext por (642 pontos) | 1,5k visualizações

8 Respostas

+1 voto
Melhor resposta

Paul - há muitos pensamentos sobre isso. Algumas pessoas dizem que você não deve
criar um dicionário a partir de texto traduzido. Dito isso, você poderia
exportar a lista de palavras para xml e então tentar importá-la para o FLEx. No entanto,
isso lhe daria uma bagunça. Você teria múltiplos tempos e
formas diferentes. Eu sugeriria que você olhasse para o site Rapid Word Collection:
http://rapidwords.net/

anon848905
Coordenador de Tecnologia de Linguagem da Área das Américas
[Email Removed]
[Phone Removed]Escritório na JAARS)
[Phone Removed]Celular)
Nome do Skype: anon848905

Tradução automática de English
por (9,9k pontos)

Obrigado, anon848905. Estamos bem cientes do RWC (coletei ~ 4.000 palavras dessa maneira e ajudei alguns colegas a começar com ele também). Os colegas específicos em questão passaram mais de vinte anos trabalhando na língua e estão procurando uma maneira de colocar formas de palavras no FLEx para que possam começar a usar as ferramentas de Edição em Massa (Bulk Edit) disponíveis lá. Rapid Word Collection Lite? Acho que estou tentando poupá-los da monotonia de digitar o que provavelmente serão mais de 5.000 radicais. No momento, este é o obstáculo que os impede de avançar… Continuarei procurando por outras opções.

Tradução automática de English

E se você extraísse a lista de palavras do Paratext e criasse um documento
de texto (ou talvez 50 documentos de 100 palavras cada) e então desse cada
documento para o FLEx e adicionasse ao dicionário apenas as formas de palavras que
pertencem lá? (Dependendo da língua, você poderia levar o tempo para
configurar alguma análise, para que “acted” fosse analisado como “act” + “-ed” etc.)

Tradução automática de English

Aqui está um excerto da minha Lista de Palavras do Paratext exportada para XML:

Acho que não seria difícil fazer algumas passadas de Localizar / Substituir (Find / Replace) para torná-lo útil:
Localizar: <item word=" -> \lx[espaço]
Localizar: spelling=“Correct” -> [nada]
Não tenho certeza do que fazer com as morfemas, no entanto… Talvez isso tivesse que ser feito no FLEx.

Vou apresentar isso a eles e ver se é o começo que estão procurando. Obrigado.

Tradução automática de English

Hmm… Não se pode “colar” neste fórum? Colei uma seção de texto nesta janela e ela apareceu durante a composição, mas não aparece depois que eu publiquei…

Tradução automática de English
0 votos

Provavelmente você colou texto que foi interpretado de uma maneira especial pelo formatador Markdown ou que era inválido e foi removido assim.
Certifique-se de prestar atenção ao painel de pré-visualização ao compor.

Tradução automática de English
por [Expert]
(16,7k pontos)

Deixe-me tentar novamente, removendo o < inicial de cada linha:

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” />

Tradução automática de English
0 votos

Então, fiz um Localizar & Substituir (Find & Replace) para mudar < item word=" para \lx[espaço]. Existe uma expressão regular que eu poderia usar para se livrar de tudo que segue a palavra, ou seja, da primeira " até > no final:

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

Tradução automática de English
por (642 pontos)
0 votos

O seguinte deve funcionar:
Localizar: ".+?>
Substituir: (nada)

P.S. Eu recomendo fortemente este site para ajudar a criar expressões regulares. É o melhor que encontrei. :smile:

Tradução automática de English
por [Expert]
(16,7k pontos)

Funcionou perfeitamente. Obrigado! Acho que isso será suficiente para começar meus colegas. :wink:

Tradução automática de English
0 votos

Há uma utilidade que extrai glosas do Interlinear do Paratext como um arquivo SFM ou uma Planilha Excel. Pode tentar isso. http://lingtransoft.info/apps/extract-paratext-interlinear-glosses

Tradução automática de English
por [Expert]
(2,9k pontos)
0 votos

Encontrei outra utilidade para visualizar as glosas no Interlinearizer do Paratext. http://lingtransoft.info/apps/glossy

Tradução automática de English
por [Expert]
(2,9k pontos)

O Glossy pode ser usado para extrair as glosas de uma maneira que poderia ser importada para o FLEx, mas não está exatamente configurado para isso no momento. É para navegação interativa de léxicos. Acho que eu poderia descobrir uma maneira de produzir um arquivo SFM se as pessoas estivessem interessadas.

Tradução automática de English

Houve algum progresso em fazer o Glossy extrair as glosas do PT Interlineariser e importá-las para algo como um arquivo SFM? Tentei arrastar o arquivo lexicon.xml para o programa ParatextLexiconSetup. Mas quando eu executo o programa ParatextLexicon, não sei o que inserir no campo rotulado ‘SFM File’. Vejo uma caixa de diálogo intitulada ‘Convert Paratext Lexicon to SFM’. Então ele pede para inserir nomes de arquivos para dois campos:
Paratext Lexicon, e
SMF File.
Posso inserir facilmente o arquivo lexicon.xml. Mas não sei o que colocar no arquivo SFM. Existe uma lista de diferentes estilos de formatação SFM para escolher?

Tradução automática de English

anon088806,

O SFM File é o nome do arquivo de saída do lexicon.xml selecionado. Você pode colocar qualquer nome de caminho completo que quiser. Isso se tornará o arquivo sfm desejado.

kent_schroeder

Tradução automática de English

Olá kent_schroeder,

Muito obrigado! Eu não fazia ideia de que a solução poderia ser tão simples… Muito apreciado! anon088806

Tradução automática de English
0 votos

Parece que poderíamos usar uma utilidade para trabalhar com o arquivo de lista de palavras do Paratext. Alguém por aí interessado em escrever um?

Tradução automática de English
por [Expert]
(2,9k pontos)

O que você quer que a ferramenta faça?

kent_schroeder
Desenvolvedor de Software/Consultor de Tecnologia de Linguagem
SIL – Serviços Compartilhados Focados na África

Nairobi, Quênia

Tradução automática de English

kent_schroeder, parece que eles querem colher palavras da ferramenta de lista de palavras para fazer um léxico no Fieldworks. Os dados do interlinearizer são melhores, pois também têm a glosa, mas a ferramenta de lista de palavras provavelmente teria mais palavras. Se as palavras vernáculas pudessem ser removidas do arquivo html e marcadas com o marcador \lx, então esse arquivo poderia ser importado para um banco de dados Flex existente. O usuário então teria que passar por cada entrada e ajustar a forma superficial para ser um verdadeiro lexema e inserir a glosa e a classe gramatical ele mesmo.

Tradução automática de English

kent_schroeder, você pode dar ao seu software a capacidade de converter o arquivo Biblicaltermsxyz.xml para o formato padrão? Alguém em outra postagem quer fazer isso.

Tradução automática de English
0 votos

Aqui está um script que escrevi para python3 (eu uso Wasta Linux 18.04). Observe que eu codifiquei em duras o caminho para a entrada e a saída no código…

#!/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()
Tradução automática de English
por (105 pontos)
Saudações,

Adaptei o script Python acima para que ele seja genérico, com um prompt para a lista de palavras e para o léxico (se houver), e para gerar um arquivo SMF para importação no FLEx

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

Exports a Paratext word list to SFM (Standard Format Markers) format
for import into FLEx (FieldWorks Language Explorer).

Usage:
    python wordlist_to_sfm.py

The script will prompt for:
  - A Paratext word list XML file (e.g. exported from Paratext's word list tool)
  - Optionally, a Paratext Lexicon XML file to supply English glosses
  - An output file path for the resulting .sfm file

Only words marked as "Correct" in the word list are exported by default.
This can be changed by editing the INCLUDE_* settings below.

Output format is MDF (Multi-Dictionary Formatter), the standard SFM dialect used by FLEx for lexicon import.
"""

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

# --- Settings ----------------------------------------------------------------
# Control which spelling categories are included in the export.
# Set to True to include words in that category, False to exclude them.

INCLUDE_CORRECT   = True   # Words the translator has approved
INCLUDE_UNKNOWN   = False  # Words not yet reviewed
INCLUDE_INCORRECT = False  # Words flagged as misspellings

# Set to True to write the word's corpus frequency as a comment field (\co_count)
INCLUDE_COUNT     = True
# -----------------------------------------------------------------------------

def prompt_path(prompt_text, default):
    """Show a prompt with an optional default value; return the user's input or the default."""
    display = f" [{default}]" if default else ""
    value = input(f"{prompt_text}{display}: ").strip()
return value if value else default

def get_user_inputs():
    """Ask the user for the three file paths needed to run the export."""
    print("Paratext Word List to SFM Exporter")
    print("-----------------------------------\n")

    # Word list is required - keep asking until the file is found
    wordlist_path = prompt_path("Word list file (XML)", "Notsi-WL.xml")
    while not os.path.exists(wordlist_path):
        print(f"  Cannot find '{wordlist_path}'. Please check the path and try again.")
        wordlist_path = prompt_path("Word list file (XML)", "Notsi-WL.xml")

    # Lexicon is optional - skip silently if not found
    lexicon_path = prompt_path("Lexicon file for glosses (press Enter to skip)", "")
    if lexicon_path and not os.path.exists(lexicon_path):
        print(f"  Cannot find '{lexicon_path}'. Continuing without glosses.")
        lexicon_path = ""

    output_path = prompt_path("Output file name", "wordlist_for_flex.sfm")
    return wordlist_path, lexicon_path, output_path

def load_lexicon_glosses(lexicon_path):
    """
    Read English glosses from a Paratext Lexicon XML file.

    Returns a dictionary keyed by lexeme form, where each value contains the lexeme type (Word, Prefix, Suffix) and a list of English gloss strings.
    Returns an empty dictionary if no lexicon path is provided.
    """
    glosses = {}
    if not lexicon_path:
        print("No lexicon provided - entries will be exported without glosses.")
        return glosses

    print(f"Reading lexicon from: {lexicon_path}")
    with open(lexicon_path, "rb") as f:
        data = f.read()
    # Strip any BOM variants (standard UTF-8 BOM, or double-encoded 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, or Suffix

        # Collect all English glosses for this entry (there may be more than one sense)
        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"  Found {len(glosses)} entries with English glosses.")
    return glosses

def build_approved_list(wordlist_path):
    """
    Read the Paratext word list XML and return words that pass the INCLUDE_* filters.

    Returns a list of approved word forms and a metadata dictionary containing each word's corpus count, hyphenation, and morphology breakdown.
    """
    wordlist  = etree.parse(wordlist_path)
    all_items = wordlist.getroot().findall("item")
    print(f"Reading word list from: {wordlist_path}")
    print(f"  {len(all_items)} words found in list.")

    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)} words marked as correct and ready to export.")
    return approved, metadata

def write_sfm_entry(outfile, word, lex_type, glosses, meta, include_count):
    """
    Write a single SFM lexicon entry to the output file.

    MDF conventions followed:
      \\lx  - lexeme (headword); affixes get a hyphen on the bound side
      \\sn  - sense number (written once per gloss)
      \\ge  - English gloss for that sense
      \\mr  - morphology string (when approved by the translator)
      \\co_* - comment fields for metadata FLEx doesn't have a standard marker for
    """
    # Write the headword, adding hyphens to show affix attachment points
    outfile.write("\n\\lx ")
    if lex_type == "Suffix":
        outfile.write("-")
    outfile.write(word)
    if lex_type == "Prefix":
        outfile.write("-")
    outfile.write("\n")

    # Record affix type as a comment so it survives the FLEx import
    if lex_type != "Word":
        outfile.write(f"\\co_type {lex_type}\n")

    # Corpus frequency - useful for prioritising entries during dictionary work
if include_count and meta:
        outfile.write(f"\\co_count {meta['count']}\n")

    # Morphology: use the standard \\mr marker if the analysis has been approved,
    # otherwise store it as a comment to avoid importing unverified data
    if meta and meta["morphology"]:
        marker = "\\mr" if meta["morph_approved"] == "True" else "\\co_morph"
        outfile.write(f"{marker} {meta['morphology']}\n")

    # Write one sense block per gloss
    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():
    """
    Main export routine.

    Two-pass approach:
      Pass 1 - write entries that have lexicon glosses (richer data first)
      Pass 2 - write remaining approved words that had no lexicon entry
    This ensures glossed entries are not duplicated.
    """
    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)

    # Open output file as UTF-8 and write the MDF header
    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)  # Words still to be written after pass 1
    with_glosses = 0

    # Pass 1: entries that appear in both the lexicon and the approved word list
    for form, lex_data in lexicon_glosses.items():
        if form not in approved_words:
            print(f"  Skipping '{form}' (in lexicon but not marked as correct in word list)")
            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

    # Pass 2: approved words with no lexicon entry - exported without glosses
    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 complete.")
    print(f"  Total entries written : {total}")
    print(f"  With glosses          : {with_glosses}")
    print(f"  Without glosses       : {len(remaining)}")
    print(f"  Output file           : {output_path}")

if __name__ == "__main__":
    main()
Tradução automática de English

Perguntas relacionadas

+1 voto
3 respostas 435 visualizações
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 perguntada Mar 11, 2019
0 votos
6 respostas 684 visualizações
Isso foi postado na lista do FLEx hoje. Tenho um comentário que adicionarei abaixo desta pergunta citada: Em 12 de ... recurso, mas estão evitando usá-lo por causa desse bug?
bbryson 105 perguntada Out 12, 2021
0 votos
4 respostas 787 visualizações
Estou tentando ajudar um usuário com um problema de integração entre Paratext e Flex (relacionado ao Tone Sandhi) e, ... O projeto do Paratext está na versão 8. Algumas ideias?
MSEAIT_LT 478 perguntada Mai 28, 2020
0 votos
3 respostas 310 visualizações
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 perguntada Nov 15, 2017
0 votos
1 resposta 187 visualizações
No Paratext 9.3, é possível: imprimir a lista de palavras de todos os livros do meu projeto em um único arquivo ... de lugares e pessoas) em uma única lista em ordem alfabética?
debbodaneejo 118 perguntada Fev 16, 2023
Welcome to Support Bible, where you can ask questions and receive answers from other members of the community.
Just as a body, though one, has many parts, but all its many parts form one body, so it is with Christ.
1 Corinthians 12:12
3,046 perguntas
6,006 respostas
5,671 comentários
2,027 usuários