フォーラム、チャット、ブログの一部の所有者は、組織的手段(ルールの設定)または技術(パーサーを使用)によって仲間の豊富さに苦労していますが、既存のアンチマットシステムの最大の欠点は、 shaded 、 zaprapenis 、 skigなどの驚くべき新語を生成する多数の誤検知です推測-オリジナルには「テレビン」という言葉がありました)。 また、スクリプト(および多くの場合、テキスト自体の作成者)は、誓う単語の途中の文字をアスタリスク(***)または文字「#$%^」に置き換えることがあります。黒い四角。
私たちは別の方向に進みます:画面上で見たいものを読者に自分で決めてみましょう:カラフルなロシアのマットか、それほどカラフルではない文学的なロシア。 ブラウザの拡張機能「私たちは誓わない」を開発し、冒とく的な表現を同義の文学表現に置き換えます。 拡張の主要かつ決定的な要件は、置換後のテキストの自然さと読みやすさです。 単にマットを取り除いて言語を貧しくしたくはありません -それを豊かにし、見返りに何かを提供します。
次の記事では、ロシア語のマットの表面的な言語研究、およびJavaScriptでの正規表現の短いコースと、Chromeブラウザーの拡張機能を作成するためのガイドを提供します。
パート1.言語学。 棚の上のロシアのマット
ロシア語には、3つの主要な単語を形成するわいせつなルートと、元々わいせつではなかったが、現代の言語ではタブーであるいくつかの単語があります。 有名な3文字の単語は、ロシア語のマットの中で最も生産性の高い単語形成単語であり、ロシア語一般の単語形式と派生語でおそらく最も豊富です。 また、それから形成された式が言語のほとんどすべての意味分野をカバーするという事実も興味深いです。 開発者としての私にとって、これは、異なるコンテキストでは、これらの表現を異なるアナログに置き換える必要があることを意味します。
ロシア語の単語には、プレフィックス、ルート、インターフィックス、サフィックス、エンディングの形態素が含まれることがあります。 知らない人のために、インターフィックスは2つ以上のルート(水歌、ゲートの数)をつなぐ単語の一部です。 単語に少なくとも1つのルートが存在することは必須であり、残りはオプションです。
ロシア語のマットのユニークな機能は、1つの形態素(たとえば、接頭辞)を変更すると、単語のセマンティクスを劇的に変更できることです。 さらに、 同じ接頭辞を持つ単語(または接頭辞がない単語)でも、ルートの後の接尾辞に応じて、異なる意味の負荷がかかる可能性があります。 語尾はセマンティクスに影響を与えませんが、単語と文の他のメンバーとの関係を示すだけです。
合計で、ロシア語には70個の接頭辞があり、そのうち20個はギリシャ語とラテン語(ex-、post-、hyper-など)から借用され、50個は元々ロシア語です。 誓いの言葉で借用された接頭辞は使用されないか、使用されますが、これは無視できるほどまれです。 また、考慮されるルートのそれぞれが既存のロシア語プレフィックスすべてで使用されるわけではないことに注意してください。これにより、既存のプレフィックスとルートの組み合わせの数が大幅に削減されます。 多くの接尾辞も同様に削除されます。
さまざまな接頭辞と接尾辞を使用して不正なルートから形成される単語とフレーズのセマンティクスには大きな違いがあるため、各式は個別に考慮する必要があります。 強力な言語構造を検索および置換するには、強力なツール-正規表現を使用します。
パート2.正規表現
合計で、拡張機能の現在のバージョンでは、約100個の正規表現が取得されましたが、その多くは互いに類似しているため、すべてを表現するのは無意味だと思います。 いくつかのテンプレートのみを詳細に検討しますが、これは一般的なJSでのレギュラーの使用と、この特定のケースでの私の思考の流れを説明するのに十分です。 私のGitHubで使用されている正規のフルセットを見ることができます 。
正規表現の紹介
JavaScriptの正規表現は、特別なRegExpオブジェクトを通じて機能します。 正規表現の短い表記の構文は次のとおりです。
//
最も単純なケースでは、スラッシュの間に厳密に指定された文字セットがあります。 例:
//
このような構造は、テキスト内の「ソーセージ」部分文字列のすべての出現を検出します。 重要: レジスタは重要です。つまり、このような式では見つからない文字列「ソーセージ」です。 大文字と小文字を区別しないようにするには、 iフラグを使用します。
//i
このデザインは、「ソーセージ」、「ソーセージ」、「ソーセージ」、および「ソーセージ」のすべての行に既に対応しています。
もちろん、処理されたテキスト内のすべての文は大文字で始まり、文内の単語は小文字で始まるようにします。 したがって、テキストに一貫して両方の正規表現を適用し、それらを同義で同じように感情的に色付けされた表現の1つに置き換えます。 たとえば、「恐怖」という言葉を取り上げます。
text = text.replace(//g, randomWord(["", ""])); text = text.replace(//i, randomWord(["", ""]));
replace()文字列オブジェクトメソッドは、2つの引数を取ります。
- 検索される正規表現または部分文字列は、ドキュメント内で検索が実行されるテンプレートです。
- テンプレートのすべての出現が置き換えられる文字列(または文字列を返す関数)
単語に同じ状態/現象/オブジェクトを記述する複数の単語形式がある場合、より複雑で議論の主題に近いものを考えてみましょう。
私たちは書きます:
text = text.replace(/(||)/g, " "); text = text.replace(/(||)/i, " ");
フォーム(A | B)Cの構成は、サブストリングACおよびBCに対応します。 上記のコード行を使用して、サブストリング「To get」、「To get」、「To get」のすべての出現を検索します。同じことを行いますが、大文字と小文字は区別しません。
構文(A | B)は、任意のネストレベルで、式の任意の部分で、何度でも使用できます。 これを、複数の接尾辞を持つさらに少し複雑な例で考えてみましょう。一般的な副詞は「悪い」です。 この単語には、「crap」、「crap」、さらには「crap」という非常に多くの接尾辞があります。 より粗い類似物の正規表現を作成する場合、ルートのe / eの交替と、文字の「e」が文字「e」に置き換えられることが多いという事実を考慮する必要があります。 これは必要ないので、これらすべてのフォームを考慮した正規表現を作成します。
/(|)(|)/
そして、適切な交換を行います。
text = text.replace(/(|)(|)/g, randomWord(["", "", "", "", ""])); text = text.replace(/(|)(|)/i, randomWord(["", "", "", "", ""]));
同様に、可能性のある語尾が与えられた場合、「悪い」という形容詞を使用します。これは、音声オブジェクトの品質に関する負の値の判断です。
text = text.replace(/(|)(|)((|||)|(|||)||)/g, " "); text = text.replace(/(|)(|)((|||)|(|||)||)/i, " ");
単純な加算と乗算により、例で与えられた正規表現を計算できます
/(|)(|)((|||)|(|||)||)/
40の可能な単語形式を見つけることができます。 そして、わいせつなルートを使用し、その結果、e / e-80を交互に使用する場合。
「バレエ」という単語を見つけて「オペラ」または「ミュージカル」に置き換えたいが、「バレエ団」、「クロスボウ」などの単語を変更しない場合は、次のようにする必要があります。
text = text.replace(/(\s|^)/g, randomWord(["", " "])); text = text.replace(/(\s|^)/i, randomWord([" ", ""]));
特殊文字^は、入力の始まりを意味します。 したがって、スペースの後に、または検索された行の先頭に「バレット」という単語があります。
はい、驚いたことに、ラテン文字で書かれた単語の境界は完全に定義されていますが、単語の境界を示すために使用される構造\ bはキリル文字では機能しません。
入力の終わりを示す特殊文字$も便利です。
パート3. Google Chrome拡張機能
拡張機能は、3つの主要部分で構成されます。
- 必要なmanifest.jsonマニフェストファイル。主な拡張オプションについて説明しています。
- 実際、すべての作業を行うjavascriptファイル。
- サイズが128x128、48x48、および16x16のアイコン。
マニフェストは単純です。
{ "manifest_version": 2, "name": " ", "version": "1.0", "icons": { "16": "icon32.png", "48": "icon128.png", "128": "icon128.png" }, "description": " .", "content_scripts": [ { "matches": ["*://*/*"], "js": ["content_script.js"], "run_at": "document_end" } ] }
構文については、 ソースから必要なものをすべて見つけることが最善です 。
スクリプトは、ページをロードした直後に起動され(マニフェストで「run_at」を明示的に指定:「document_end」)、その本体は3つの関数で構成されます。
- walk(ノード)は、HTMLドキュメントのノードを再帰的に走査する関数です。 受信するノードにテキストが含まれている場合、ノードをmakeItCultural()関数に渡します。
- makeItCultural(textNode)-正規表現に従ってパターンに従って部分文字列の置換を実行する関数。 複数の置換オプションがある場合、これらのオプションは配列としてrandomWord()関数に渡されます。
- randomWord(単語)-配列を取り、そのランダム要素を返す関数。
chrome://拡張機能/ページで、[開発者モード]チェックボックスをオンにし、[展開された拡張機能を読み込む...]ボタンをクリックして、拡張機能が含まれるフォルダーを選択します。 その後、テストし、修正します。各編集の後、拡張機能の近くにある[再読み込み]リンクをクリックすることを忘れないでください。
拡張機能をウェブストアに投稿するには、5ドルを1回支払う必要があります。 一般に、このプロセス全体はHabréの別の良い記事で完全に説明されているため、繰り返す理由はありません。
おわりに
結果として生じた拡張により、LJ Artemy Lebedevは新しい色とSergei Shnurovのインタビューをプレイすることを余儀なくされますが、彼はBig Petrovsky Zagibにとっては強すぎます(リンクは提供しません-自分でググってください、それは価値があります)。 ロシアのマットのトピックは無限に深く、十数件の学術作品が書かれています。 ある日、物理学者は弦理論を証明(または反証)し、エンジニアはパーソナル量子コンピューターを構築し、ポケットの中の誰もが冷原子炉を搭載したガジェットを持ち、ロシアのマットは完全には理解されません。
理解しやすく、すべての読者を退屈させないように、できるだけアクセスしやすいように書きましたが、ヒロインに座っている小中学生の生徒にとってはいつも通りでした。
完成した拡張機能はChromeウェブストアからインストールできます。ソースはGitHubにあります 。
ソースのリスト
Javascript.ru-正規表現 。
Chromeウェブストア-Google Developers
Alexey Plutzer-Sarno。 Great Mata Dictionary、Volume IおよびVolume II
PSコメントで誓わないでください。 私は大量のハブラリプレッションの犯人になりたくありません。