中国語の単語分割とキーワード抽出の概要

この記事は、問題バンクの重複チェック要件の実現プロセスと、「NLP 自然言語処理の原則と実践」の学習プロセスに基づいています。不備があるはずです、ご指摘ください。

導入

中国語の単語のセグメンテーションは、中国語環境における自然言語処理 (NLP) の主な問題です。主な難点は、中国語が英語と異なることです. 単語を分割するために使用される明確な区切り文字 (スペースなど) があり、異なる分割方法が必ずしも言語の問題を抱えているわけではありません. 例:

  1. 既婚者/僧侶/未婚者。
  2. 既婚者と未婚者

基本的な考え方

評価指標

一般に、中国語の単語のセグメンテーションは、Precision、Recall、および F-score の 3 つの次元から評価されます。一般的に、私たちがより注意を払うのはFスコアです。下の図 (画像ソース https://github.com/lancopku/pkuseg-python ) に示すように、この図は 3 つの中国語単語分割ツールの 3 つの指標を示しており、ユーザーが単語分割の結果を比較するのに便利です。 3 つのツールのインデックスによる特定のデータ セット
ここに画像の説明を挿入

F-score は F1-Measure と呼ばれることもありますが、この 2 つは同じ概念です。

モデルの評価基準

モデル (セマンティック モデル、分類/クラスタリング モデルなどを含む) の場合、一般に、モデルの効果を判断するための 4 つの指標があります。

  1. Accuracy (accuracy rate) -サンプルの総数のうち、正しく判断された数の割合
  2. Recall (再現率) -正解数全体に対する正しく判断された数の割合
  3. 精度(精度、精度率) -結果の総数に対する正しい判断の数の割合
  4. F1-Measure—— PrecisionとRecallの調和平均(harmonic mean;相互平均)で、同時に正解数、誤判定数、合計結果数の関係に関係することを意味します。 .

共通の解決策

中国語の単語のセグメンテーションには、主に 2 つの考え方があります。

  1. セマンティックベースの実装
  2. 統計的確率に基づく

プログラミング言語の開発履歴、社会環境、市場の需要など、さまざまな要因の影響を受けて、現在主流の中国語の単語分割ツールはほとんどが python と java です。一般的な単語セグメンテーション ツールを以下に示します。ここにはコピー オンラインの紹介が多すぎます。個人的には、カスタム シソーラスと単語の頻度をサポートする場合、これらのプロジェクトは、オープン ソース コミュニティで何年にもわたって繰り返された後、それほど複雑ではない言語分析シナリオのほとんどを満たすことができるはずだと思います。

  1. 吃音分詞 - ネイティブに python をベースに、go、java、php、Node.js のバージョンもありますが、公式のメンテナンス プロジェクトではありません.php バージョンを例にとると、それを使用した後、遅いことがわかりました.更新、コードのバグ、コードの柔軟性の欠如、スケーラビリティの欠如などの問題。
  2. HanLp - Java に基づいて開発されました。
  3. funNLP - Python に基づいて開発されました。
  4. sego - go 言語に基づいて開発されました。
  5. scws - 元は php です。github での最後の更新は 2016 年でした。中国語、英語、数字の混合テキストを使用した実際の効果は、単語が途切れ途切れになっている php バージョンよりもはるかに悪いものです。

中国語の単語セグメンテーションにおける HMM と Viterbi については、私の別のブログ記事HMM、Viterbi と中国語の単語のセグメンテーションを参照してください。

アプリケーション

センシティブな単語の検出

センシティブ ワードの検出は、一般に 2 つの方法で実装されます。

  1. シソーラス + 有限自動ステート マシン (Deterministic Finite Automaton、DFA) に基づく

    シソーラスからプレフィックス インデックス フォレストを構築し、DFA+ センシティブ ワード プレフィックス インデックス フォレストに基づいてトラバースし、センシティブ ワードを判断します。

  2. シソーラス + 中国語単語セグメンテーション ツールに基づく

    有限自動ステート マシンとの比較。実は、この方法のポイントは、単語分割結果の単語ごとにのみセンシティブな単語を判断することです。効果の観点からは、その精度はセンシティブ ワード検出トレーニングの結果 (単語の頻度) に依存します。しかし、よりインテリジェントなDFAのようにコンテキストを考慮しないと一致しません。センシティブ ワードの検出結果が何らかの形でユーザーにフィードバックされると、この方法を使用することで得られるユーザー エクスペリエンスは、DFA に基づくよりも優れたものになります。

しかし、上記の方法のどれに依存する場合でも、辞書の問題を最初に解決しなければならないことがわかります。シソーラスに関しては、github に非公開でアップロードされたシソーラスがいくつかあります。また、Weibo、Baidu、Tencent などのエンタープライズ チームが公開している無料の機密シソーラスを検索することもできます。しかし、情報源に関係なく、デリケートな言葉は常に時間に敏感であり、定期的なメンテナンスが必要です。

キーワード抽出

キーワード抽出は実際には細分化されたアプリケーション シナリオであり、その上位レベルのアプリケーションは主に長いテキスト キーワードの検索に見られます (ES のテキスト検索原理に直接適用することはできず、ES インデックス ワード セグメンテーション方法と検索語セグメンテーション方法は依存します)。単語分割ツールの選択)、テキスト類似検索、自動要約。一般的なアルゴリズムには TF-IDF アルゴリズムと TextRank アルゴリズムが含まれ、吃音単語セグメンテーションは両方のアルゴリズムをサポートします。
キーワードの精度は、単語のセグメンテーションの精度に依存します。また、TF-IDF では、キーワード抽出の基本的な方法として、テキストに出現する単語が多く、他のテキストに出現する単語が少ないほど、その単語がキーワードである可能性が高くなります。したがって、実際のアプリケーションでは、限られたテキスト セットまたは特定の垂直フィールド テキスト セットを処理する場合、まず、限られたテキスト セットまたは垂直フィールド サンプルの IDF 辞書をカウントし、次に IDF に基づいてキーワード抽出を実行すると、効果的に改善できます。精度。

類似テキストの重複排除

類似テキストの重複排除には多くの解決策がありますが、ここではいくつかの重要なアイデアを紹介します。実際のアプリケーションでは、アルゴリズムの効率、データ量、実装の難しさ、出力モードなどのさまざまな要因を考慮する必要があります。

  1. キーワード抽出に基づいて、類似ハッシュがキーワードに基づいて計算されます。2 つのテキストが類似している場合、抽出されたキーワードも類似または同等であり、対応する計算された類似ハッシュ値も類似または同等である必要があります。大規模なデータ チェックではよくあることですが、100% 信頼できるわけではありません。類似・同等判定問題に対応して、類似するハッシュ値の類似・同等判定問題に変換できる。
  2. 暴力、各テキストは、コレクション内の他のテキストとのハミング距離または編集距離距離を計算し、全体の長さに対する距離の比率が一定のしきい値よりも大きい場合、類似していると判断されます。テキストが複雑すぎず、データ量も多くない場合、実装コストは低く、アルゴリズムは単純で、特定のテキスト特性に合わせて最適化された後の精度は非常に高くなる可能性があります。テキスト収集空間のサイズが n の場合、n 2 n^2を実行する必要があると考えられます。n2比較。

実際、同様のテキストの最大の難点は、個人的にはパフォーマンスではなく精度だと思います。次のテキストを例に取ります。

  1. 以下の正しいオプションを選択してください。
  2. 以下の間違ったオプションを選択してください。

この観点からすると、この 2 つの違いは 1 つの単語にすぎませんが、実際の意味は大きく異なります。この種の問題は、実際には短いテキストの類似性比較でより一般的である可能性があります。この点については、現時点で個人的にこれ以上の解決策はなく、アイデアのある学生からの提案を歓迎します。私の一時的な解決策は、この 2 つは似ていますが、sim のハッシュ値はまだ等しくないということです (単語のセグメンテーションにより、正しいものと正しくないものを区別できます)。したがって、sim ハッシュ値が等しくない限り、それらは一時的に分類されませんが、これにより明らかに Recall が減少します。

よくある問題

Q: 中国語単語セグメンテーション ツールに基づく単語セグメンテーションのパフォーマンスは非常に低くなりますか?

テキストがそれほど長くない場合、単語セグメンテーションのパフォーマンスは非常に高くなります。吃音の単語分割を例にとると、php7.3環境で、平均長さ約200のテキストが1000個あります.データのリクエスト+単語分割+キーワード抽出+SimHash計算+保存(バッチ更新)に約1秒しかかかりません)、1 行の長さが 300 テキストを超えない場合、単語の分割時間は 1 ミリ秒未満です。現在の CPU パフォーマンスは非常に強力です.タスクが多すぎず、CPU リソースが限られている場合、注意を払う必要があるのは単語分割のパフォーマンスではなく、**; データベース取得によって実装されるコードの時間の複雑さです。効率 (MySQL select が最適化されるなど)、データベース書き込み効率、外部要求が発生するかどうか、発生する場合は外部要求によって消費される時間。**もちろん、具体的な問題は実際の状況に応じて分析する必要があり、パフォーマンスの問題を引き起こす可能性は、私が言及した点に限定されるべきではありません。

Q: 中国語の単語セグメンテーション ツールはそのまま使用できますか?

私の経験では、それが学習のためだけのものであれば、すぐに使用できると見なすことができます。ただし、機密性の高い単語の検出やその他の垂直分野 (テキスト重複除去、テキスト検索などを含むがこれらに限定されない) に使用する場合。提案は、できるだけ多くの信頼できる垂直ドメイン シソーラスを収集し、保持されているデータに基づいてシソーラスを数え、それを単語セグメンテーション ツールにロードすることです (一般に、オープン ソースの単語セグメンテーション ツールは、ユーザー定義の辞書をロードするためのインターフェイスを提供します)。単語セグメンテーションとキーワード抽出の F スコアを効果的に改善できます。さらに、実際のアプリケーションでは、多くの特殊な記号や不要な記号がある場合、最初にそれらを処理するためのロジック コードを追加することをお勧めします (html エンティティ、タグ、エスケープされたテキスト内の冗長な非表示文字など)。 Fスコアの改善にも役立ちます。

Q: NLP ベースの関数の場合、適切な F スコアはどれくらいですか?

実際、Fスコアがどれくらいが適切かはわかりません。この質問は、実際のビジネス シナリオと組み合わせて回答する方が簡単かもしれません (学術研究であれば、高いほど良い)。私の経験では、F スコアが 90% 以上に達すると、コストは 1% 増加するごとに指数関数的に増加します (単語選択戦略を繰り返し調整し、シソーラスと単語頻度ファイルを改善し、再統計/分析する必要があります)。関連フィールド)、すべての調整が必ずしも普遍的であるとは限りません。そのため、個人的には実際のシーンと合わせて判断することをお勧めします。たとえば、問題バンクには 1300W+ のデータがあり、Precision は 90%+ に増加しています (特定の科目の特定の問題タイプでは、99%+ に達すると考えることもできます)。この時点で、全データに占めるエラー データの割合は非常に小さい (おそらく 1% 未満) と推定されます. その後、これらの重複したチェック データは一時的に非表示 (ソフト削除) され、後で発見されたときに復元されます。 . この方法は全体に有益ですが、製品体験への影響は明らかではありません。

Q: 実際のアプリケーションで、精度要件が非常に高い場合はどうすればよいですか?

この種の問題は、本番環境でより一般的である可能性があります。例えば、1000W以上のデータがあった場合、1%の誤判定でも10Wのデータは誤判定せず、10万個の誤判定でも大きな損失となります。現時点では、テキスト コレクションの特性を積極的に分析し、ターゲットを絞ったツール コードの変更、シソーラスの補足、ストップ ワードの追加、単語の頻度の変更などによって適合度を向上させることができます。箱?)。これは過剰適合の問題を引き起こす可能性がありますが、既知の限られたデータセットのみを扱っている場合、過剰適合は悪いことではないと思います。

おすすめ

転載: blog.csdn.net/qq_23937195/article/details/102586257