21

Zalgo テキストのしくみについて読んだことがあります。また、チャットまたはフォーラム ソフトウェアがその種の煩わしさをどのように防ぐことができるかを知りたいと思っています。より正確には、次のことを行う必要がある Unicode 結合文字の完全なセットは何ですか?

a) チャット参加者が結合記号を必要としない言語のみを使用すると仮定すると、削除されます (つまり、結合記号を使用して「婚約者」と書くこともできますが、そうすることに固執すると、少しZalgo'edになるでしょう)それで); また、

b) 最大 8 連続文字 (実際の言語で見られる最大数) に削減されましたか?

編集:その間、私は完全に異なる言い回しの質問を見つけました (「... 発音区別記号から保護するには?」)、これは本質的にこれと同じです。他の人が見つけやすいように、タイトルをより明確にしました。

4

5 に答える 5

20

これについて非常に真剣であり、次のようにできる技術的な解決策が必要であると仮定します。

  1. 入力テキストを小さな単位 (単語または文) に分割します。
  2. サーバー上の各ユニットを選択したフォントでレンダリングします (行の高さが非常に高く、Zalgo の「ノイズ」が移動するベースラインの下に十分なスペースがあります)。
  3. 機械学習アルゴリズムをトレーニングして、「暗すぎる」または「忙しい」ように見えるかどうかを判断します。
  4. アルゴリズムの信頼性が低い場合は、人間のモデレーターに委ねます。

これを実装するのは楽しいかもしれませんが、実際にはすぐにステップ 4 に進む方がよいでしょう。

編集:これは、Python 2.7 での、鈍い場合のより実用的なソリューションです。「Mark, nonspacing」および Mark, enclosing」に分類される Unicode 文字は、Zalgo 効果を作成するために使用される主なツールのようです。上記のアイデアとは異なり、これはテキストの「美学」を決定しようとせず、代わりにそのような文字をすべて削除します。(言うまでもなく、これは非常に多くの言語でテキストを破棄します。より良い解決策については、以下をお読みください。) より多くの文字カテゴリを除外するには、それらを に追加しますZALGO_CHAR_CATEGORIES

#!/usr/bin/env python
import unicodedata
import codecs

ZALGO_CHAR_CATEGORIES = ['Mn', 'Me']

with codecs.open("zalgo", 'r', 'utf-8') as infile:
    for line in infile:
        print ''.join([c for c in unicodedata.normalize('NFD', line) if unicodedata.category(c) not in ZALGO_CHAR_CATEGORIES]),

入力例:

1
H̡̫̤ͭ̓̓̇͗̎̀ơ̯̗͒̄̀̈ͤ̀͡w͓̲͙͋ͬ̊ͦ̂̀̚ ͎͉͖̌ͯͅͅd̳̘̿̃̔̏ͣ͂̉̕ŏ̖̙͋ͤ̊͗̓͟͜e͈͕̯̮͌ͭ̍̐̃͒s͙͔̺͇̗̱̿̊̇͞ ̸ͩͩ͑̋̀ͮͥͦ̊Z̆̊͊҉҉̠̱̦̩͕ą̟̹͈̺̹̋̅ͯĺ̡̘̹̻̩̩͋͘g̪͚͗ͬ͒o̢̖͇̬͍͇̔͋͊̓ ̢͈͂ͣ̏̿͐͂ͯ͠t̛͓̖̻̲ͤ̈ͣ͝e͋̄ͬ̽͜҉͚̭͇ͅx̌ͤ̓̂̓͐͐́͋͡ț̗̹̄̌̀ͧͩ̕͢ ̮̗̩̳̱̾w͎̭̤̄͗ͭ̃͗ͮ̐o̢̯̻̾ͣͬ̽̔̍͟r̢̪͙͍̠̀ͅǩ̵̶̗̮̮ͪ́?̙͉̥̬ͤ̌͗ͩ̕͡
2
H̡̫̤ͭ̓̓̇͗̎̀ơ̯̗͒̄̀̈ͤ̀͡w͓̲͙͋ͬ̊ͦ̂̀̚ ͎͉͖̌ͯͅͅd̳̘̿̃̔̏ͣ͂̉̕ŏ̖̙͋ͤ̊͗̓͟͜e͈͕̯̮͌ͭ̍̐̃͒s͙͔̺͇̗̱̿̊̇͞ ̸ͩͩ͑̋̀ͮͥͦ̊Z̆̊͊҉҉̠̱̦̩͕ą̟̹͈̺̹̋̅ͯĺ̡̘̹̻̩̩͋͘g̪͚͗ͬ͒o̢̖͇̬͍͇̔͋͊̓ ̢͈͂ͣ̏̿͐͂ͯ͠t̛͓̖̻̲ͤ̈ͣ͝e͋̄ͬ̽͜҉͚̭͇ͅx̌ͤ̓̂̓͐͐́͋͡ț̗̹̄̌̀ͧͩ̕͢ ̮̗̩̳̱̾w͎̭̤̄͗ͭ̃͗ͮ̐o̢̯̻̾ͣͬ̽̔̍͟r̢̪͙͍̠̀ͅǩ̵̶̗̮̮ͪ́?̙͉̥̬ͤ̌͗ͩ̕͡
3

出力:

1
How does Zalgo text work?
2
How does Zalgo text work?
3

最後に、Zalgo テキストを無条件に削除するのではなく検出する場合は、文字頻度分析を実行できます。以下のプログラムは、入力ファイルの各行に対してそれを行います。この関数is_zalgoは、指定された文字列の各単語の「Zalgo スコア」を計算します (スコアは、潜在的な Zalgo 文字の数を文字の総数で割ったものです)。次に、単語のスコアの第 3 四分位数が より大きいかどうかを調べTHRESHOLDます。THRESHOLD等しい場合0.5、4 つの単語ごとに 1 つに 50% 以上の Zalgo 文字があるかどうかを検出しようとしていることを意味します。( THRESHOLD0.5 は推測であり、実際に使用するには調整が必要になる場合があります。) このタイプのアルゴリズムは、見返り/コーディング作業の点でおそらく最適です。

#!/usr/bin/env python
from __future__ import division
import unicodedata
import codecs
import numpy

ZALGO_CHAR_CATEGORIES = ['Mn', 'Me']
THRESHOLD = 0.5
DEBUG = True

def is_zalgo(s):
    if len(s) == 0:
        return False
    word_scores = []
    for word in s.split():
        cats = [unicodedata.category(c) for c in word]
        score = sum([cats.count(banned) for banned in ZALGO_CHAR_CATEGORIES]) / len(word)
        word_scores.append(score)
    total_score = numpy.percentile(word_scores, 75)
    if DEBUG:
        print total_score
    return total_score > THRESHOLD

with codecs.open("zalgo", 'r', 'utf-8') as infile:
    for line in infile:
        print is_zalgo(unicodedata.normalize('NFD', line)), "\t", line

出力例:

0.911483990148
True    Señor, could you or your fiancé explain, H̡̫̤ͭ̓̓̇͗̎̀ơ̯̗͒̄̀̈ͤ̀͡w͓̲͙͋ͬ̊ͦ̂̀̚ ͎͉͖̌ͯͅͅd̳̘̿̃̔̏ͣ͂̉̕ŏ̖̙͋ͤ̊͗̓͟͜e͈͕̯̮͌ͭ̍̐̃͒s͙͔̺͇̗̱̿̊̇͞ ̸ͩͩ͑̋̀ͮͥͦ̊Z̆̊͊҉҉̠̱̦̩͕ą̟̹͈̺̹̋̅ͯĺ̡̘̹̻̩̩͋͘g̪͚͗ͬ͒o̢̖͇̬͍͇̔͋͊̓ ̢͈͂ͣ̏̿͐͂ͯ͠t̛͓̖̻̲ͤ̈ͣ͝e͋̄ͬ̽͜҉͚̭͇ͅx̌ͤ̓̂̓͐͐́͋͡ț̗̹̄̌̀ͧͩ̕͢ ̮̗̩̳̱̾w͎̭̤̄͗ͭ̃͗ͮ̐o̢̯̻̾ͣͬ̽̔̍͟r̢̪͙͍̠̀ͅǩ̵̶̗̮̮ͪ́?̙͉̥̬ͤ̌͗ͩ̕͡

0.333333333333
False   Příliš žluťoučký kůň úpěl ďábelské ódy.  
于 2014-03-09T08:49:06.560 に答える
12

箱を作りますoverflow:hidden。実際に Zalgo テキストを無効にするわけではありませんが、他のコメントに損害を与えるのを防ぎます。

.comment {
  /* the overflow: hidden is what prevents one comment's combining marks from affecting its siblings */
  overflow: hidden;
  /* the padding gives space for any legitimate combining marks */
  padding: 0.5em;
  /* the rest are just to visually divide the three comments */
  border: solid 1px #ccc;
  margin-top: -1px;
  margin-bottom: -1px;
}
<div class=comment>The below comment looks awful.</div>
<div class=comment>H̡̫̤ͭ̓̓̇͗̎̀ơ̯̗͒̄̀̈ͤ̀͡w͓̲͙͋ͬ̊ͦ̂̀̚ ͎͉͖̌ͯͅͅd̳̘̿̃̔̏ͣ͂̉̕ŏ̖̙͋ͤ̊͗̓͟͜e͈͕̯̮͌ͭ̍̐̃͒s͙͔̺͇̗̱̿̊̇͞ ̸ͩͩ͑̋̀ͮͥͦ̊Z̆̊͊҉҉̠̱̦̩͕ą̟̹͈̺̹̋̅ͯĺ̡̘̹̻̩̩͋͘g̪͚͗ͬ͒o̢̖͇̬͍͇̔͋͊̓ ̢͈͂ͣ̏̿͐͂ͯ͠t̛͓̖̻̲ͤ̈ͣ͝e͋̄ͬ̽͜҉͚̭͇ͅx̌ͤ̓̂̓͐͐́͋͡ț̗̹̄̌̀ͧͩ̕͢ ̮̗̩̳̱̾w͎̭̤̄͗ͭ̃͗ͮ̐o̢̯̻̾ͣͬ̽̔̍͟r̢̪͙͍̠̀ͅǩ̵̶̗̮̮ͪ́?̙͉̥̬ͤ̌͗ͩ̕͡</div>
<div class=comment>The above comment looks awful.</div>

于 2017-04-07T20:10:05.410 に答える
6

関連する質問が以前に尋ねられました: https://stackoverflow.com/questions/5073191/how-is-zalgo-text-implementedしかし、ここで予防に入るのは興味深いことです。

これを防ぐために、いくつかの戦略を選択できます。

  1. 発音区別符号を完全に組み合わせることを防ぎます (そして、多くの国際的なユーザーを怒らせます)。
  2. ホワイトリストまたはブラックリストを使用して組み合わせ文字を除外します (そして、少数の国際ユーザーを怒らせます)。
  3. 特定の数の文字の組み合わせを防止します (さらに少数のユーザーの小便)
  4. 健全なモデレーター コミュニティを持っている (すべての欠点があるので、ここで例としてあなたの質問を参照してください)
于 2014-03-09T08:24:37.577 に答える