3

概要:翻訳されたコンテンツにリストされている部分文字列をバッククォートでラップする効率的な方法は何ですか?

動機:翻訳されたテキストのマークダウン マークアップを元のテキストと同期させています。Scott Chacon による ProGit の書籍のチェコ語への優れた翻訳があります。残念ながら、オリジナルとはまったく異なるツールチェーンを使用してタイプセットされたため、オリジナルのマークアップが失われました。これまでのところ、コンテンツの大部分をマークダウンに戻し、ドキュメント構造をオリジナルと同期させることに成功しました。code次のステップは、翻訳でのバッククォートの使用を修正することです。

状況

たとえば、元の次の段落があります。実際、問題がある場合は、改行のない長い行です。

    On Windows systems, Git looks for the `.gitconfig` file in the 
    `$HOME` directory (`C:\Documents and Settings\$USER` for most 
    people). It also still looks for /etc/gitconfig, although it’s 
    relative to the MSys root, which is wherever you decide to 
    install Git on your Windows system when you run the installer.

翻訳された段落もあります:

    Ve Windows používá Git soubor .gitconfig, který je umístěný v 
    domovském adresáři (u většiny uživatelů C:\Documents and 
    Settings\$USER). Dále se pokusí vyhledat ještě soubor 
    /etc/gitconfig, který je relativní vůči kořenovému adresáři. 
    Ten je umístěn tam, kam jste se rozhodli nainstalovat Git po 
    spuštění instalačního programu.

正規表現を使用して、元のリストから次のリストを抽出します (ここではrepr()-- したがって二重のバックスラッシュ)。

    ['.gitconfig', '$HOME', 'C:\\Documents and Settings\\$USER']

翻訳されたコンテンツのリストされた部分文字列をバックティックにラップする効率的な方法は何ですか? 問題は、一部の段落で同じ部分文字列が複数回繰り返される場合があることです。また、他にどのような合併症が発生する可能性があるかはわかりません。(「脳も痛い!」

補足:この問題にもっと関心がある人は、すべてhttps://github.com/pepr/progitCZで入手できます(コミット 04d1354656276bf1e6ba7305d06c12faca267a19、たった今。警告、コメントはチェコ語です)。問題はutil/cz.pyスクリプトに関連しています。これは 4 番目のパスです - に実装されていpass4.pyます。現在、リストをセットに変換してから、str.replace()各部分文字列を呼び出します。

このinfo_aux_cs\pass4backticks.txtファイルは、自動化されたプロセスの比較を示しています。はinfo_aux_cs\pass4.txt「修正された」結果をtxtCorrected\RucneUpravovanyVysledekPass2.txt示し、 は最後に手動で変更されたフェーズを示します。

もう 1 つの問題は... ドキュメントの構造が既に同期されていることです。一方、パラグラフ(翻訳)の内容は、原文の新しいものについてはまだチェックされていません。

更新 -- 新しい問題が確認されました

自動置換はあいまいな場合があります。のようなケースを観察しました['git clone', 'clone', ...]setが最初に作成されるため、clone実際には を先にラップできます。こちらです

some text git `clone` other text 

の場所に表示されます

some text `git clone` other text 

正しい代替品である必要があります。

このアプローチは非常にヒューリスティックであり、実際には非常に正確に行う必要がないことを認識しています。自動的に置換されたテキストは、手動編集のソースになります。このようにして、ソリューションの一部は、人間の目でチェックし、人間の手で修正する必要がある疑わしい違いを視覚化することができます:)

その問題を解決するための最も信頼できる方法を見つける方法について何か考えがありますか? ここに私の頭に浮かんだいくつかのヒューリスティックがあります-つまり、潜在的な問題をいつ視覚化するか:

  • 元の部分文字列はすべて翻訳に含まれている必要があります。そうでなければ、翻訳は何らかの形で具体的であるか、最新ではないか、または単に不自由です。翻訳によって部分文字列が変更される可能性がありますが、これを認識し、後でチェックを明示的に抑制する必要があります。
  • 部分文字列の順序は、ターゲット言語では保持されない場合があります。とにかく、同じ順序で同じ数の部分文字列があれば、置換が成功したことを示す良い兆候です。
  • 最長の部分文字列を最初に置き換える必要がありますか?
  • ...しかし、短いサブスティングは次のステップで置き換えられますか?
  • 部分文字列から正規表現パターンを構築し、正規表現の貪欲さを使用して、すべてのパターンを一度にバッククォートで置き換えることができますか?

どんな良いアイデアでも大歓迎です ;)

あなたの時間と経験をありがとう、

ペトル

4

1 に答える 1

1

これまでのところ、正規表現を使用した解決策が最も有望であることがわかりました。あなたが1つを見つけたら私はあなたのより良い解決策を受け入れることを非常に嬉しく思います:)

まず、バッククォートされた部分文字列を見つけるための正規表現は次のとおりです。

rexBackticked = re.compile(r'`(\S.*?\S?)`')

enparaの段落と翻訳されたcspara段落があるので、次のようにバッククォートされた部分文字列のリストを抽出できます。

enlst = rexBackticked.findall(enpara)
cslst = rexBackticked.findall(cspara)

次に、チェコ語の段落を変更する必要があるかどうかをテストします。

if set(enlst) != set(cslst) or len(enlst) != len(cslst):

csparaはいの場合、 (おそらくより適切に記述できる)バックティックではないがバックティックする必要があるサブストリングの差分リストを作成します。

    dlst = enlst[:]   # copy
    for s in cslst:
        if s in dlst:
            dlst.remove(s)

次に、部分文字列を認識するための正規表現オブジェクトを作成する必要がありますdlst。私はそれを行う次の関数を定義しました:

def buildRex(self, lst):
    '''Build a regular expression mathing substrings from the lst.'''

    # Build a list of escaped unique substrings from the input list.
    # The order is not important now as it must be corrected later.
    lst2 = [re.escape(s) for s in set(lst)]

    # Join the escaped substrings to form the regular expression
    # pattern, build the regular expression, and return it. There could
    # be longer paterns that contain shorter patterns. The longer patterns
    # should be matched first. This way, the lst2 must be reverse sorted
    # by the length of the patterns.
    pat = '|'.join(sorted(lst2, key=len, reverse=True))
    rex = re.compile(pat)
    return rex

csparaこれで、これを使用して、 :内の重複しないすべての部分文字列を置き換えることができます。

    rex = self.buildRex(dlst)
    cspara, n = rex.subn(r'`\g<0>`', cspara)

n将来のチェックで重要になる可能性のある交換の数はどこにありますか。

コメントは大歓迎です!

于 2012-11-27T22:19:49.140 に答える