0 голосов
1,5тыс. просмотров

У меня есть коллега, у которого опубликовано Новое Завет, но нет словаря. Ему было бы интересно создать словарь, но он хотел бы избежать как можно большей «тяжелой работы». Есть ли способ перенести список слов Paratext в FLEx (например, «Экспорт в XML»)? Рекомендуется ли это? Есть ли другие рекомендации? Спасибо за любые советы.

Переведено машиной с языка English
Paratext от (642 очков) | 1,5тыс. просмотров

8 Ответов

+1 голос
Лучший ответ

Пол — по этому поводу есть много мнений. Некоторые говорят, что не следует
создавать словарь на основе переведенного текста. Сказав это, я должен отметить, что вы можете
экспортировать список слов в xml, а затем попробовать импортировать его в FLEx. Однако
это приведет к хаосу. У вас будет множество разных времен и
форм. Я бы предложил вам посмотреть на сайт Rapid Word Collection:
http://rapidwords.net/

anon848905
Координатор по языковым технологиям для региона Америк
[Email Removed]
[Phone Removed]Офис в JAARS)
[Phone Removed]Мобильный)
Имя в Skype: anon848905

Переведено машиной с языка English
от (9,9тыс. очков)

Спасибо, anon848905. Мы хорошо знакомы с RWC (я собрал таким образом около 4 000 слов и помог нескольким коллегам начать работу с ним). Конкретные коллеги, о которых идет речь, более двадцати лет работают с этим языком и ищут способ перенести формы слов в FLEx, чтобы они могли начать использовать инструменты пакетного редактирования (Bulk Edit), доступные там. Rapid Word Collection Lite? Думаю, я пытаюсь избавить их от рутины ввода, скорее всего, более 5 000 основ. Сейчас это препятствие, которое мешает им продвигаться вперед… Я продолжу искать другие варианты.

Переведено машиной с языка English

Что, если вы извлечёте список слов из Paratext и создадите текстовый
документ (или, возможно, 50 документов по 100 слов в каждом), а затем
передадите каждый документ в FLEx и добавите в словарь только те
формы слов, которые туда относятся? (В зависимости от языка вы можете
посвятить время настройке разбора, чтобы «acted» разбиралось как «act» + «-ed» и т. д.)

Переведено машиной с языка English

Вот отрывок из моего списка слов Paratext, экспортированного в XML:

Я не думаю, что будет сложно сделать несколько проходов «Найти / Заменить», чтобы сделать это полезным:
Найти: <item word=" -> \lx[space]
Найти: spelling=“Correct” -> [ничего]
Я не уверен, что делать с морфами, однако… Возможно, это пришлось бы делать в FLEx.

Я покажу это им и посмотрю, является ли это тем началом, которое они ищут. Спасибо.

Переведено машиной с языка English

Хм… Разве нельзя «вставить» текст в этот форум? Я вставил фрагмент текста в это окно, и он отображался при составлении сообщения, но не появляется после отправки…

Переведено машиной с языка English
0 голосов

Скорее всего, вы вставили текст, который был интерпретирован особым образом форматировщиком Markdown или который был недействительным и поэтому был удален.
Убедитесь, что вы обращаете внимание на панель предпросмотра при составлении сообщения.

Переведено машиной с языка English
от [Expert]
(16,7тыс. очков)

Позвольте мне попробовать снова, удалив начальный < из каждой строки:

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 голосов

Следующее должно сработать:
Найти: ".+?>
Заменить: (ничего)

P.S. Я настоятельно рекомендую этот сайт для помощи в создании регулярных выражений. Это лучший, который я нашел. :smile:

Переведено машиной с языка English
от [Expert]
(16,7тыс. очков)

Сработало идеально. Спасибо! Думаю, этого будет достаточно, чтобы мои коллеги могли начать работу. :wink:

Переведено машиной с языка English
0 голосов

Есть утилита, которая извлекает глоссы из Paratext Interlinear в виде файла SFM или таблицы Excel. Можно попробовать это. http://lingtransoft.info/apps/extract-paratext-interlinear-glosses

Переведено машиной с языка English
от [Expert]
(2,9тыс. очков)
0 голосов

Я нашел еще одну утилиту для просмотра глосс в Paratext Interlinearizer. http://lingtransoft.info/apps/glossy

Переведено машиной с языка English
от [Expert]
(2,9тыс. очков)

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,9тыс. очков)

Что вы хотите, чтобы инструмент делал?

kent_schroeder
Разработчик программного обеспечения / Консультант по языковым технологиям
SIL – Общие услуги, ориентированные на Африку

Найроби, Кения

Переведено машиной с языка English

kent_schroeder, похоже, они хотят собрать слова из инструмента списка слов для создания лексикона в Fieldworks. Данные интерлинеатора лучше, поскольку в них также есть глоссы, но в инструменте списка слов, скорее всего, будет больше слов. Если бы можно было извлечь слова на родном языке из файла html и пометить их маркером \lx, то этот файл можно было бы импортировать в существующую базу данных Flex. Затем пользователю пришлось бы пройти по каждой записи и отрегулировать поверхностную форму, чтобы она стала истинным лексемой, и самостоятельно ввести глоссу и часть речи.

Переведено машиной с языка 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 (Standard Format Markers)
для импорта в FLEx (FieldWorks Language Explorer).

Использование:
    python wordlist_to_sfm.py

Скрипт запросит:
  - XML-файл списка слов Paratext (например, экспортированный из инструмента списков слов Paratext)
  - Необязательно: XML-файл лексикона Paratext для предоставления английских глосс
  - Путь к выходному файлу для результирующего файла .sfm

По умолчанию экспортируются только слова, отмеченные как "Correct" (Правильные) в списке слов.
Это можно изменить, отредактировав настройки INCLUDE_* ниже.

Формат вывода — MDF (Multi-Dictionary Formatter), стандартный диалект SFM, используемый FLEx для импорта лексиконов.
"""

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):
    """
    Прочитать английские глоссы из XML-файла лексикона Paratext.

    Возвращает словарь, ключами которого являются формы лексем, а значениями — тип лексемы (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 (стандартный BOM UTF-8 или дважды закодированный 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):
    """
    Прочитать XML списка слов Paratext и вернуть слова, проходящие фильтры 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():
    """
    Основная процедура экспорта.

    Двухпроходный подход:
      Проход 1 — записать записи, у которых есть глоссы из лексикона (сначала более полные данные)
      Проход 2 — записать оставшиеся одобренные слова, для которых не было записи в лексиконе
    Это гарантирует, что записи с глоссами не будут дублироваться.
    """
    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

    # Проход 1: записи, присутствующие и в лексиконе, и в одобренном списке слов
    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

    # Проход 2: одобренные слова без записи в лексиконе — экспортируются без глосс
    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. У меня есть комментарий, который я добавлю ниже под цитируемым вопросом ... эту функцию, но избегают этого из-за этой ошибки?
bbryson 105 задал вопрос окт 12, 2021
0 голосов
4 ответов 787 просмотров
Я пытаюсь помочь пользователю с проблемой интеграции Paratext и Flex (связанной с Tone Sandhi), и после того как я ... 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.
I urge you, brothers and sisters, to watch out for those who cause divisions and put obstacles in your way that are contrary to the teaching you have learned. Keep away from them.
Romans 16:17
3,046 вопросов
6,006 ответов
5,671 комментариев
2,027 пользователей