18

Javaを使用してテキストを単純化できる最高のツールは何ですか?

テキストの簡略化の例を次に示します。

John, who was the CEO of a company, played golf.
                       ↓
John played golf. John was the CEO of a company.
4

4 に答える 4

34

あなたの問題は、複雑な文や複文を単純な文に変換する作業だと思います。文献の文の種類に基づいて、1つの独立した節から単純な文が作成されます。複合文と複雑な文は、少なくとも2つの句から構成されます。また、句には主語と動詞が必要です。
したがって、あなたの仕事はあなたの文を形成する節に文を分割することです。

Stanford CoreNLPの依存関係の解析は、複合文と複雑な文を単純な文に分割するための完璧なツールです。オンラインでデモを試すことができます。サンプル文から、以下に示すように、スタンフォード型依存関係(SD)表記の
解析結果が得られます。

nsubj(CEO-6, John-1)
nsubj(played-11, John-1)
cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
det(company-9, a-8)
prep_of(CEO-6, company-9)
root(ROOT-0, played-11)
dobj(played-11, golf-12)

節は、どのカテゴリが主語であるか(SD内)の関係から識別できます(例:nsubjnsubjpass)スタンフォード依存関係マニュアルを参照してください。基本節は、動詞部分として
から抽出し、主語部分として依存することができます。上記のSDから、2つの基本的な条項があります。

  • ジョンCEO
  • ジョンは遊んだ

基本的な句を取得したら、別の部分を追加して、句を完全で意味のある文にすることができます。これを行うには、 StanfordDependencyManualを参照してください。

ちなみに、あなたの質問は、文から意味のあるサブセンテンスを見つけることに関連している可能性があります


3番目のコメントへの回答:

主語のペアを取得したら、動詞、つまりnsubj(CEO-6, John-1)、その依存関係にリンクしているすべての依存関係を取得します。ただし、どのカテゴリが主語であるかを除き、これらの依存関係から一意の単語を抽出します。

例に基づいて、nsubj(CEO-6, John-1)からトラバースを開始するとJohn-1、取得できますがnsubj(played-11, John-1)、そのカテゴリは対象であるため、無視する必要があります。

次のステップは、パーツからトラバースすることCEO-6です。あなたが得るでしょう

cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
prep_of(CEO-6, company-9)

上記の結果から、トラバースする新しい依存関係が得られました(つまりwas-4, the-5, company-9、headまたはdependentのいずれかにある別の依存関係を見つけます)。
今あなたの依存関係は

cop(CEO-6, was-4)
det(CEO-6, the-5)
rcmod(John-1, CEO-6)
prep_of(CEO-6, company-9)
det(company-9, a-8)

このステップでは、にリンクされているすべての依存関係のトラバースを終了しましたnsubj(CEO-6, John-1)。次に、すべての頭と扶養家族から単語を抽出し、これらの単語に追加された番号に基づいて昇順で単語を配置します。この番号は、元の文の語順を示します。

John was the CEO a company

新しい文には一部が欠けています。つまり、of。この部分はに隠されていprep_of(CEO-6, company-9)ます。Stanford Dependency Manualを読むと、折りたたまれたSDと折りたたまれていないSDの2種類があります。ofなぜこれが隠されているのか、そしてこの隠された部分の語順を取得する方法を理解するためにそれらを読んでください。

同じアプローチで、2番目の文を取得します

John played golf

于 2012-03-07T17:51:34.713 に答える
7

この状況の基本的なケースに対して非常に単純なアルゴリズムを設計できると思いますが、実際のケースは多すぎる可能性があるため、そのようなアプローチは手に負えないものになります:)

それでも私は声を出して考え、アプローチを書き、Pythonコードを追加する必要があると思いました。私の基本的な考え方は、主に実際に起こっていることのモデルを明示的に公開することによって、第一原理から解決策を導き出すことです。そして、他の理論、モデル、ライブラリに依存しないようにしてから、HANDおよびSCRATCHで実行してください。


目標:文が与えられたら、そこから文を抽出します。

例:会社の最高経営責任者であったジョンはゴルフをしました。

期待される成果:ジョンは会社のCEOでした。ジョンはゴルフをしました。


これが、ここで起こっていることの私のモデルであり、モデルの仮定の形で書かれています:(公理?)

MA1。簡単な文は、サブセンテンスを挿入することで拡張できます。MA2。サブセンテンスは、1つ以上のエンティティの資格/変更(追加情報)です。MA3。サブセンテンスを挿入するには、展開するエンティティのすぐ横にコンマを置き(詳細情報を提供します)、サブセンテンスを添付します。これを拡張機能と呼びます。拡張機能が終了したら、別のコンマを配置します。

このモデルを考えると、アルゴリズムは、少なくとも最初に単純なケースに対処するために簡単にすることができます。

  1. DETECT:センテンスが与えられたら、センテンス内のコンマのペアを探して、拡張句があるかどうかを検出します。
  2. EXTRACT:2つのコンマが見つかった場合は、2つの文を生成します。2.1EXTRACT-BASE:基本文:2つのコンマの間のすべてを削除すると、基本文が取得されます。2.2 EXTRACT-EXTENSION:拡張文:拡張文内のすべてを取得し、「who」をその直前の単語に置き換えます。それはあなたの2番目の文です。
  3. 印刷:基本文はそれに依存しているため、実際には最初に拡張文を印刷する必要があります。

それが私たちのアルゴリズムです。はい、それはハックのように聞こえます。です。しかし、私が今学んでいることは、1つのプログラムでトリックを使用する場合、それはハックであり、より多くのものを処理できる場合、それはテクニックであるということです。

それでは、状況を少し拡大して複雑にしましょう。

複利の場合:例2.会社のCEOであったジョンは、CFOのラムとゴルフをしました。

それを書いているときに、CFOの「whowas」というフレーズを省略していることに気づきました。それは私たちのアルゴリズムが失敗するという複雑なケースに私たちをもたらします。そこに行く前に、動作する2のより単純なバージョンを作成しましょう。

例3.会社のCEOであったジョンは、CFOであるラムとゴルフをしました。

例4.会社のCEOであるジョンは、CFOのラムとゴルフをしました。

まだ終わっていないのを待ってください!

例5.CEOであるJohnと当時CFOであったRamは、魅力的なゲームであるGolfをプレイしました。

これを可能にするには、モデルの仮定を拡張する必要があります。

MA4。複数のエンティティが同様に拡張される場合がありますが、拡張句は通知されるエンティティのすぐ隣にあるため、混乱を招くことはありません。(例3のアカウント)

MA5。'who was'句は、リスナーが推測できるため、省略できます。(例4のアカウント)

MA6。一部のエンティティは人であり、「who」を使用して拡張され、一部のエンティティは「which」を使用して拡張されます。これらの拡張ヘッドのいずれかを省略できます。

では、アルゴリズムでこれらの複雑さをどのように処理するのでしょうか。

これを試して:

  1. SPLIT-SENTENCE-INTO-BASE-AND-EXTENSIONS:文にコンマが含まれている場合は、次のコンマを探し、その間にあるものをすべて拡張文に抽出します。終了コンマまたは開始コンマがなくなるまで続行します。この時点で、基本文と1つ以上の拡張文のリストが作成されているはずです。

  2. PROCESS_EXTENSIONS:各拡張機能について、「whois」または「whichis」がある場合は、拡張機能の見出し語の前の名前に置き換えます。拡張機能に「whois」または「whichis」がない場合は、先頭の単語とを配置します。

  3. 印刷:最初にすべての拡張文、次に基本文。

怖くない。

今後数日のうちに時間があれば、Pythonの実装を追加します。

ありがとうございました

ラヴィ・アナスワミー

于 2013-01-11T22:34:42.333 に答える
4

一般的なケースでは、既知のアルゴリズムを使用してこの問題を解決することはほとんどありません。これは、強力なAI領域に入り込んでいます。人間でさえ文法をうまく解析することはできません!

問題は、どこまで単純化するか、どのような仮定をするかに関しては非常にあいまいであることに注意してください。あなたはあなたの例をさらに進めて言うことができます:

ジョンは存在の名前であると想定されています。ジョンの人種は不明です。ジョンは過去のある時点でゴルフをしました。ゴルフはゴルフと呼ばれる球技を指すと想定されていますが、ジョンがプレーしたゴルフの変種は不明です。過去のある時点で、ジョンは会社のCEOでした。CEOは、会社の文脈では「最高経営責任者」を意味すると想定されていますが、これは指定されていません。会社は不明です。

レッスンが明確でない場合:単語の正確な意味を決定しようとすればするほど、より多くのワームの缶が開き始めます......いつ行うべきかを知るには、人間のようなレベルの判断と解釈が必要です止まる。

さまざまなJavaベースのNLPツールを使用して、いくつかのより単純なケースを解決できる場合があります。「優れた自然言語処理ライブラリはありますか」を参照してください。

于 2012-03-07T06:39:07.283 に答える
1

AlchemyApiが最良の選択肢だと思います。それでも、必要なことを正確に行うには、多くの作業が必要になります。また、ほとんどのコメンテーターがすでに言っているように、100%の品質の結果が得られない可能性があります。

于 2012-03-07T13:40:32.767 に答える