0 votos
1,5k vistas

Tengo un colega con un NT publicado, pero sin diccionario. Le interesa crear uno, pero le gustaría evitar el mayor esfuerzo posible. ¿Hay alguna manera de pasar la Lista de palabras de Paratext a FLEx (p. ej., «Exportar a XML»)? ¿Se recomienda hacerlo? ¿Hay otras recomendaciones? Gracias por cualquier consejo.

Traducción automática desde English
Paratext por (642 puntos) | 1,5k vistas

8 Respuestas

+1 voto
Mejor respuesta

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

Publicación antigua - se muestra en su idioma original
por (9,9k puntos)

Gracias, anon848905. Somos plenamente conscientes de RWC (he recopilado unas 4.000 palabras de esta manera y he ayudado a varios colegas a empezar con ella también). Los colegas en cuestión llevan más de veinte años trabajando en el idioma y buscan una manera de introducir formas de palabras en FLEx para poder empezar a utilizar las herramientas de Edición masiva (Bulk Edit) disponibles allí. ¿Rapid Word Collection Lite? Supongo que intento ahorrarles la tediosa tarea de teclear lo que probablemente serán más de 5.000 raíces. Por ahora, este es el obstáculo que les impide avanzar… Seguiré buscando otras opciones.

Traducción automática desde English

¿Qué pasaría si extrajes la lista de palabras de Paratext y creaste un documento
de texto (o quizás 50 documentos de 100 palabras cada uno) y luego le dieras cada
documento a FLEx y añadieras al diccionario solo las formas de palabra que
correspondan? (Dependiendo del idioma, podrías tomarte el tiempo para configurar
algun análisis, de modo que “acted” se analizara como “act” + “-ed”, etc.)

Traducción automática desde English

Aquí hay un extracto de mi Lista de palabras de Paratext exportada a XML:

No creo que sea difícil hacer algunas pasadas de Buscar / Reemplazar para hacerlo útil:
Buscar: <item word=" -> \lx[espacio]
Buscar: spelling=“Correct” -> [nada]
No estoy seguro de qué hacer con las morfologías, sin embargo… Quizás eso tendría que hacerse en FLEx.

Lo comentaré con ellos y veré si es el comienzo que buscan. Gracias.

Traducción automática desde English

Ummm… ¿No se puede «pegar» en este foro? Pegué una sección de texto en esta ventana y apareció mientras componía, pero no aparece una vez que he publicado…

Traducción automática desde English
0 votos

Probablemente pegaste texto que fue interpretado de una manera especial por el formateador Markdown o que era inválido y por lo tanto fue eliminado.
Asegúrate de prestar atención al panel de vista previa al componer.

Traducción automática desde English
por [Expert]
(16,7k puntos)

Permíteme intentarlo de nuevo, eliminando el < inicial de cada línea:

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

Traducción automática desde English
0 votos

Así que he hecho un Buscar y Reemplazar para cambiar < item word=" a \lx[espacio]. ¿Hay alguna expresión regular que pueda usar para deshacerme de todo lo que sigue a la palabra, es decir, desde la primera " hasta > al final:

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

Traducción automática desde English
por (642 puntos)
0 votos

Lo siguiente debería funcionar:
Buscar: ".+?>
Reemplazar: (nada)

P. D. Recomiendo encarecidamente este sitio web para ayudar a crear expresiones regulares. Es el mejor que he encontrado. :smile:

Traducción automática desde English
por [Expert]
(16,7k puntos)

Funcionó perfectamente. ¡Gracias! Creo que esto será suficiente para que mis colegas empiecen. :wink:

Traducción automática desde English
0 votos

Hay una utilidad que extrae glosas de la Interlineal de Paratext como un archivo SFM o una hoja de cálculo de Excel. Podrías probar eso. http://lingtransoft.info/apps/extract-paratext-interlinear-glosses

Traducción automática desde English
por [Expert]
(2,9k puntos)
0 votos

Encontré otra utilidad para ver las glosas en el Interlinealizador de Paratext. http://lingtransoft.info/apps/glossy

Traducción automática desde English
por [Expert]
(2,9k puntos)

Glossy se puede usar para extraer las glosas de una manera que podría importarse en FLEx, pero no está configurado exactamente para eso en este momento. Es para la exploración interactiva de léxicos. Creo que podría encontrar una manera de producir un archivo SFM si la gente estuviera interesada.

Traducción automática desde English

¿Ha habido algún progreso en lograr que Glossy extraiga las glosas del Interlinealizador de PT y las importe en algo como un archivo SFM? He intentado arrastrar el archivo lexicon.xml sobre el programa ParatextLexiconSetup. Pero cuando ejecuto el programa ParatextLexicon, no sé qué ingresar en el campo etiquetado como «Archivo SFM». Veo una caja de diálogo titulada «Convertir léxico de Paratext a SFM». Luego te pide que ingreses nombres de archivo para dos campos:
Léxico de Paratext, y
Archivo SFM.
Puedo ingresar fácilmente el archivo lexicon.xml. Pero no sé qué poner en el archivo SFM. ¿Hay una lista de diferentes estilos de formato SFM para elegir?

Traducción automática desde English

anon088806,

El archivo SFM es el nombre del archivo de salida del lexicon.xml seleccionado. Puedes poner el nombre de ruta completa que quieras. Esto se convertirá en el archivo sfm deseado.

kent_schroeder

Traducción automática desde English

Hola, kent_schroeder,

¡Muchas gracias! No tenía idea de que la solución podía ser tan simple… ¡Agradezco mucho! anon088806

Traducción automática desde English
0 votos

Parece que podríamos usar una utilidad para trabajar con el archivo de lista de palabras de Paratext. ¿Alguien por ahí interesado en escribir una?

Traducción automática desde English
por [Expert]
(2,9k puntos)

¿Qué quieres que haga la herramienta?

kent_schroeder
Desarrollador de software / Consultor de Tecnología del Lenguaje
SIL – Servicios Compartidos con Enfoque en África

Nairobi, Kenia

Traducción automática desde English

kent_schroeder, parece que quieren recolectar palabras de la herramienta de lista de palabras para hacer un léxico en Fieldworks. Los datos del interlinealizador son mejores ya que también tienen la glosa, pero la herramienta de lista de palabras probablemente tendría más palabras. Si las palabras vernáculas pudieran extraerse del archivo html y marcarse con el marcador \lx, entonces ese archivo podría importarse en una base de datos Flex existente. El usuario entonces tendría que pasar por cada entrada y ajustar la forma superficial para que sea un verdadero lexema e ingresar la glosa y la parte de la oración él mismo.

Traducción automática desde English

kent_schroeder, ¿puedes darle a tu software la capacidad de convertir el archivo Biblicaltermsxyz.xml al formato estándar? Alguien en otra publicación quiere hacer eso.

Traducción automática desde English
0 votos

Aquí hay un script que he escrito para python3 (uso Wasta Linux 18.04). Ten en cuenta que he codificado en el código la ruta para la entrada y la salida…

#!/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()
Traducción automática desde English
por (105 puntos)
Saludos,

He adaptado el script de Python anterior para hacerlo general, de modo que solicite la lista de palabras y el léxico (si existe) y genere un archivo SMF para importar en FLEx.

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

Exporta una lista de palabras de Paratext al formato SFM (Standard Format Markers)
para su importación en FLEx (FieldWorks Language Explorer).

Uso:
    python wordlist_to_sfm.py

El script solicitará:
  - Un archivo XML de lista de palabras de Paratext (p. ej., exportado desde la herramienta de lista de palabras de Paratext)
  - Opcionalmente, un archivo XML de léxico de Paratext para proporcionar glosas en inglés
  - Una ruta de archivo de salida para el archivo .sfm resultante

Por defecto, solo se exportan las palabras marcadas como "Correct" en la lista de palabras.
Esto se puede cambiar editando las configuraciones INCLUDE_* a continuación.

El formato de salida es MDF (Multi-Dictionary Formatter), el dialecto estándar de SFM utilizado por FLEx para la importación de léxicos.
"""

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

# --- Configuración ----------------------------------------------------------------
# Controla qué categorías de ortografía se incluyen en la exportación.
# Establezca en True para incluir palabras en esa categoría, o en False para excluirlas.

INCLUDE_CORRECT   = True   # Palabras aprobadas por el traductor
INCLUDE_UNKNOWN   = False  # Palabras aún no revisadas
INCLUDE_INCORRECT = False  # Palabras marcadas como errores ortográficos

# Establezca en True para escribir la frecuencia del corpus de la palabra como un campo de comentario (\co_count)
INCLUDE_COUNT     = True
# -----------------------------------------------------------------------------

def prompt_path(prompt_text, default):
    """Muestra un prompt con un valor predeterminado opcional; devuelve la entrada del usuario o el valor predeterminado."""
    display = f" [{default}]" if default else ""
    value = input(f"{prompt_text}{display}: ").strip()
return value if value else default

def get_user_inputs():
    """Pide al usuario las tres rutas de archivo necesarias para ejecutar la exportación."""
    print("Paratext Word List to SFM Exporter")
    print("-----------------------------------\n")

    # La lista de palabras es obligatoria: sigue pidiendo hasta encontrar el archivo
    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")

    # El léxico es opcional: se omite silenciosamente si no se encuentra
    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):
    """
    Lee glosas en inglés desde un archivo XML de léxico de Paratext.

    Devuelve un diccionario indexado por la forma del lexema, donde cada valor contiene el tipo de lexema (Word, Prefix, Suffix) y una lista de cadenas de glosas en inglés.
    Devuelve un diccionario vacío si no se proporciona una ruta de léxico.
    """
    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()
    # Elimina cualquier variante de BOM (BOM UTF-8 estándar o BOM doblemente codificado)
    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 o Suffix

        # Recopila todas las glosas en inglés para esta entrada (puede haber más de un sentido)
        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):
    """
    Lee el XML de la lista de palabras de Paratext y devuelve las palabras que pasan los filtros INCLUDE_*.

    Devuelve una lista de formas de palabras aprobadas y un diccionario de metadatos que contiene la cuenta del corpus, la división silábica y el desglose morfológico de cada palabra.
    """
    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):
    """
    Escribe una entrada de léxico SFM individual en el archivo de salida.

    Convenciones MDF seguidas:
      \\lx  - lexema (palabra principal); los afijos llevan un guion en el lado unido
      \\sn  - número de sentido (escrito una vez por cada glosa)
      \\ge  - glosa en inglés para ese sentido
      \\mr  - cadena morfológica (cuando ha sido aprobada por el traductor)
      \\co_* - campos de comentario para metadatos para los que FLEx no tiene un marcador estándar
    """
    # Escribe la palabra principal, añadiendo guiones para mostrar los puntos de unión de los afijos
    outfile.write("\n\\lx ")
    if lex_type == "Suffix":
        outfile.write("-")
    outfile.write(word)
    if lex_type == "Prefix":
        outfile.write("-")
    outfile.write("\n")

    # Registra el tipo de afijo como comentario para que sobreviva a la importación en FLEx
    if lex_type != "Word":
        outfile.write(f"\\co_type {lex_type}\n")

    # Frecuencia del corpus: útil para priorizar entradas durante el trabajo de diccionario
if include_count and meta:
        outfile.write(f"\\co_count {meta['count']}\n")

    # Morfología: usa el marcador estándar \\mr si el análisis ha sido aprobado,
    # de lo contrario, guárdalo como comentario para evitar importar datos no verificados
    if meta and meta["morphology"]:
        marker = "\\mr" if meta["morph_approved"] == "True" else "\\co_morph"
        outfile.write(f"{marker} {meta['morphology']}\n")

    # Escribe un bloque de sentido por cada glosa
    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():
    """
    Rutina principal de exportación.

    Enfoque de dos pasos:
      Paso 1 - escribir entradas que tienen glosas del léxico (datos más ricos primero)
      Paso 2 - escribir las palabras aprobadas restantes que no tenían entrada en el léxico
    Esto asegura que las entradas con glosas no se dupliquen.
    """
    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)

    # Abre el archivo de salida como UTF-8 y escribe la cabecera 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)  # Palabras que aún deben escribirse después del paso 1
    with_glosses = 0

    # Paso 1: entradas que aparecen tanto en el léxico como en la lista de palabras aprobadas
    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

    # Paso 2: palabras aprobadas sin entrada en el léxico - exportadas sin glosas
    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()
Traducción automática desde English

Preguntas relacionadas

+1 voto
3 respuestas 435 vistas
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 preguntada mar 11, 2019
0 votos
6 respuestas 684 vistas
Esto se publicó hoy en la lista de FLEx. Tengo un comentario que añadiré a continuación de esta pregunta citada: ... esta función, pero están evitando usarla debido a este error?
bbryson 105 preguntada oct 12, 2021
0 votos
4 respuestas 787 vistas
Estoy intentando ayudar a un usuario con un problema de integración entre Paratext y Flex (relacionado con el Tone Sandhi) y ... de Paratext está en la versión 8. Alguna idea?
MSEAIT_LT 478 preguntada may 28, 2020
0 votos
3 respuestas 310 vistas
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 preguntada nov 15, 2017
0 votos
1 respuesta 187 vistas
En Paratext 9.3, es posible hacer lo siguiente: imprimir la lista de palabras de todos los libros de mi ... de lugares y personas) en una sola lista ordenada alfabéticamente?
debbodaneejo 118 preguntada feb 16, 2023
Welcome to Support Bible, where you can ask questions and receive answers from other members of the community.
Live in harmony with one another. Do not be proud, but be willing to associate with people of low position. Do not be conceited.
Romans 12:16
3,046 preguntas
6,006 respuestas
5,671 comentarios
2,027 usuarios