apeescape2.com
  • メイン
  • 製品ライフサイクル
  • ライフスタイル
  • 投資家と資金調達
  • Kpiと分析
技術

自然言語処理アプリケーションを構築する方法

自然言語処理(ソフトウェアアプリケーションが人間の言語を処理できるようにする技術)は、近年、ややユビキタスになっています。

グーグル検索は自然に聞こえる質問に答えることができます。 AppleのSiriはさまざまな質問を理解できるため、多くの企業が(合理的な)スマートチャットとボット電話を使用して顧客と通信しています。しかし、この一見「スマート」なソフトウェアは実際にどのように機能するのでしょうか。



この記事では、これらのアプリケーションを駆動するテクノロジーについて学習するとともに、自然言語処理ソフトウェアを自分で開発する方法についても学習します。

第11章はどういう意味ですか

この記事では、ニュースに値するアナライザー構築プロセスの例について説明します。証券のポートフォリオがあり、人気のあるニュースWebサイトを自動的に通過し、ポートフォリオに関連する記事を識別するアプリケーションが必要だとします。たとえば、株式ポートフォリオにMicrosoft、BlackStone、Luxotticaなどの企業が含まれている場合は、これら3つの企業に言及している記事に注意する必要があります。

スタンフォードNLPライブラリを使い始める

自然言語処理アプリケーションは、他の機械学習アプリケーションと同様に、連携して機能する比較的小さく、シンプルで直感的なアルゴリズムを基盤として構築されています。多くの場合、これらすべてのアルゴリズムがすでに実装および統合されている外部ライブラリを使用する方が理にかなっています。

この例では、 スタンフォードNLPライブラリ 、強力なJavaベースの自然言語処理ライブラリであり、多くの言語をサポートしています。

このライブラリで私たちが興味を持っている特定のアルゴリズムの1つは、文法のタグ付けです。文法タグは、テキスト内の各単語に品詞を自動的に割り当てるために使用されます。この文法タグ付けは、語彙特性に基づいてテキスト内の単語を分類し、周囲の他の単語との関連でそれらを分析します。

文法タグ付けアルゴリズムの正確な仕組みはこの記事の範囲を超えていますが、それについて学ぶことができます。 ここに 。

まず、新しいJavaプロジェクトを作成します(インタラクティブ開発環境を使用できます) ここに )そして、StanfordNLPライブラリを依存関係のリストに追加します。 Mavenを使用している場合は、それをpom.xmlに追加するだけです。 :

edu.stanford.nlp stanford-corenlp 3.6.0 edu.stanford.nlp stanford-corenlp 3.6.0 models

アプリケーションはWebページから記事のコンテンツを自動的に抽出する必要があるため、次の2つの依存関係も指定する必要があります。

de.l3s.boilerpipe boilerpipe 1.1.0 net.sourceforge.nekohtml nekohtml 1.9.22

これらの依存関係を追加することで、次に進む準備が整います。

アイテムの削り取りとクリーニング

アナライザーの最初の部分は、記事を取得し、Webページからコンテンツを抽出することです。

ニュースソースから記事を取得する場合、ページは通常、記事自体とは無関係な無関係な情報(埋め込みビデオ、アウトバウンドリンク、ビデオ、広告など)で埋められます。ここが ボイルパイプ が記載されています。

ボイルパイプ は、平均文長、コンテンツブロックで使用されるタグタイプ、コンテンツの密度などの特性を使用して、さまざまなコンテンツブロックを分析することにより、記事のメインコンテンツを識別する「クラッター」を削除するための非常に重要で効果的なアルゴリズムです。のアルゴリズム ボイラーパイプ マシンビジョンに基づくアルゴリズムなど、計算コストがはるかに高い他のアルゴリズムと競合できることが証明されています。あなたはでもっと学ぶことができます あなたのプロジェクトのウェブサイト 。

の図書館 ボイラーパイプ Webページスクレイピングのサポートがインストールされています。 WebからHTMLをフェッチし、HTMLからテキストを抽出し、抽出されたテキストをクリーンアップできます。 URLを取得して使用する関数extractFromURLを定義できます。 ボイルパイプ ArticleExtractorを使用して、最も関連性の高いテキストを文字列として返します。このタスクの場合:

import java.net.URL; import de.l3s.boilerpipe.document.TextDocument; import de.l3s.boilerpipe.extractors.CommonExtractors; import de.l3s.boilerpipe.sax.BoilerpipeSAXInput; import de.l3s.boilerpipe.sax.HTMLDocument; import de.l3s.boilerpipe.sax.HTMLFetcher; public class BoilerPipeExtractor { public static String extractFromUrl(String userUrl) throws java.io.IOException, org.xml.sax.SAXException, de.l3s.boilerpipe.BoilerpipeProcessingException { final HTMLDocument htmlDoc = HTMLFetcher.fetch(new URL(userUrl)); final TextDocument doc = new BoilerpipeSAXInput(htmlDoc.toInputSource()).getTextDocument(); return CommonExtractors.ARTICLE_EXTRACTOR.getText(doc); } }

図書館 ボイラーパイプ ボイラーパイプアルゴリズムに基づいて、ArticleExtractorを使用してさまざまな抽出機能を提供します。 HTMLでフォーマットされたニュース記事用に特別に最適化されています。 ArticleExtractor各コンテンツブロックで使用されるHTMLタグとアウトバウンドリンクの密度に焦点を当てています。これは、高速ですが簡単なDefaultExtractorよりも私たちのタスクに適しています。

追加された関数は私たちのためにすべてを処理します:

  • HTMLFetcher.fetch HTMLドキュメントを取得します
  • getTextDocumentテキストドキュメントを抽出します
  • CommonExtractors.ARTICLE_EXTRACTOR.getTextアルゴリズムを使用して記事から関連するテキストを抽出します ボイラーパイプ

今、あなたはあなたが見つけることができる光学の巨人エシロールとルックスオティカの合併に関連したサンプル記事でそれを試すことができます ここに 。このURLを関数に追加して、結果を確認できます。

次のコードをメイン関数に追加します。

public class App { public static void main( String[] args ) throws java.io.IOException, org.xml.sax.SAXException, de.l3s.boilerpipe.BoilerpipeProcessingException { String urlString = 'http://www.reuters.com/article/us-essilor-m-a-luxottica-group-idUSKBN14Z110'; String text = BoilerPipeExtractor.extractFromUrl(urlString); System.out.println(text); } }

広告、HTMLタグ、送信リンクなしで、記事の本文に出力情報が表示されます。これは私がそれを始めたときに私が得たもののほんの一部です:

MILAN/PARIS Luxottica de Italia (LUX.MI) y Essilor de Francia (ESSI.PA) han llegado a un acuerdo de una fusión de 46 billones de euros (49 billones de dólares) para crear *global eyewear powerhouse* con ingresos anuales de más de 15 billones de euros. El acuerdo de todo tipo de acciones es uno de los mayores vínculos transfronterizos de Europa y une a Luxottica, el mayor creador de lentes del mundo con marcas como Ray-Ban y Oakley, con el fabricante de lentes líder Essilor. 'Finalmente... dos productos que naturalmente se complementan – es decir monturas y lentes – serán diseñados, manufacturados y distribuidos bajo el mismo techo,' Leonardo Del Vecchio, fundador de Luxottica de 81 años, dijo en un comunicado el lunes. Las acciones en Luxottica subieron un 8.6 por ciento a 53.80 euros a las 1405 GMT (9:05 a.m. ET), con Essilor arriba un 12.2 por ciento a 114.60 euros. La fusión entre estos jugadores tan importantes en el mercado de lentes de 95 billones, se enfoca en ayudar a los negocios a aprovechar la demanda tan fuerte que se espera para lentes de prescripción y lentes de sol, debido a una población global que envejece y una toma de conciencia mayor con respecto al cuidado de los ojos. Los analistas Jefferies estiman que el mercado está creciendo entre…

そして、それが主要な記事の本文です。これが実装しやすいとは想像しがたいです。

スピーチの一部にラベルを付ける

記事の本文を正常に抽出したので、記事がユーザーに関心のある会社に言及しているかどうかを判断することに集中できます。

文字列や正規表現を検索したくなるかもしれませんが、このアプローチにはいくつかの欠点があります。

まず第一に、文字列検索は誤検知にさらされる可能性があります。たとえば、Microsoft Excelに言及している記事は、Microsoftに言及しているようにラベル付けされる場合があります。

第二に、正規表現の構成によっては、正規表現の検索によって偽陰性が発生する可能性があります。たとえば、「Luxotticaの四半期収益が予想を上回った」というフレーズを含む記事は、空白で囲まれた「Luxottica」という単語を見つける正規表現検索で失われる可能性があります。

最後に、多数の企業に関心があり、多数の記事を処理している場合、テキストの本文全体でユーザーのポートフォリオ内の各企業を検索すると、パフォーマンスが低下すると同時に、時間がかかる可能性があります。時間。

スタンフォードCoreNLPライブラリ 多くの強力な機能があり、これら3つの問題を解決する方法を提供します。

パーサーには、文法のタグ付けを使用します。特に、これを使用して、記事内のすべての適切な名前を見つけ、興味深い株式のポートフォリオでそれらを比較することができます。

NLPテクノロジーを組み込むことにより、ラベラーの精度を向上させ、前述の誤検知と誤検知を最小限に抑えるだけでなく、正しい名前はの一部を損なうだけなので、株式ポートフォリオと比較する必要のあるテキストの量を大幅に最小限に抑えます記事の全文。

python属性とは

次のようなデータ構造で記事を前処理する 会員相談の低コスト 、アイテムの分析にかかる時間を大幅に短縮できます。

スタンフォードのCoreNLPは、と呼ばれる非常に便利なタガーを提供します MaxentTagger これは、数行のコードで文法マークアップを提供できます。

簡単な実装は次のとおりです。

public class PortfolioNewsAnalyzer { private HashSet portfolio; private static final String modelPath = 'edu\stanford\nlp\models\pos-tagger\english-left3words\english-left3words-distsim.tagger'; private MaxentTagger tagger; public PortfolioNewsAnalyzer() { tagger = new MaxentTagger(modelPath); } public String tagPos(String input) { return tagger.tagString(input); }

タガー関数tagPosは、文字列を入力として受け取り、元の文字列の単語と対応する品詞を含む文字列を出力します。メイン関数で、PortfolioNewsAnalyzerをインスタンス化します。の出力を提供します スクレーパー タガー関数に移動すると、次のようなものが表示されるはずです。

MILAN/PARIS_NN Italy_NNP 's_POS Luxottica_NNP -LRB-_-LRB- LUX.MI_NNP -RRB-_-RRB- and_CC France_NNP 's_POS Essilor_NNP -LRB-_-LRB- ESSI.PA_NNP -RRB-_-RRB- have_VBP agreed_VBN a_DT 46_CD billion_CD euro_NN -LRB-_-LRB- $_$ 49_CD billion_CD -RRB-_-RRB- merger_NN to_TO create_VB a_DT global_JJ eyewear_NN powerhouse_NN with_IN annual_JJ revenue_NN of_IN more_JJR than_IN 15_CD billion_CD euros_NNS ._. The_DT all-share_JJ deal_NN is_VBZ one_CD of_IN Europe_NNP 's_POS largest_JJS cross-border_JJ tie-ups_NNS and_CC brings_VBZ together_RB Luxottica_NNP ,_, the_DT world_NN 's_POS top_JJ spectacles_NNS maker_NN with_IN brands_NNS such_JJ as_IN Ray-Ban_NNP and_CC Oakley_NNP ,_, with_IN leading_VBG lens_NN manufacturer_NN Essilor_NNP ._. ``_`` Finally_RB ..._: two_CD products_NNS which_WDT are_VBP naturally_RB complementary_JJ --_: namely_RB frames_NNS and_CC lenses_NNS --_: will_MD be_VB designed_VBN ,_, manufactured_VBN and_CC distributed_VBN under_IN the_DT same_JJ roof_NN ,_, ''_'' Luxottica_NNP 's_POS 81-year-old_JJ founder_NN Leonardo_NNP Del_NNP Vecchio_NNP said_VBD in_IN a_DT statement_NN on_IN Monday_NNP ._. Shares_NNS in_IN Luxottica_NNP were_VBD up_RB by_IN 8.6_CD percent_NN at_IN 53.80_CD euros_NNS by_IN 1405_CD GMT_NNP -LRB-_-LRB- 9:05_CD a.m._NN ET_NNP -RRB-_-RRB- ,_, with_IN Essilor_NNP up_IN 12.2_CD percent_NN at_IN 114.60_CD euros_NNS ._. The_DT merger_NN between_IN the_DT top_JJ players_NNS in_IN the_DT 95_CD billion_CD eyewear_NN market_NN is_VBZ aimed_VBN at_IN helping_VBG the_DT businesses_NNS to_TO take_VB full_JJ advantage_NN of_IN expected_VBN strong_JJ demand_NN for_IN prescription_NN spectacles_NNS and_CC sunglasses_NNS due_JJ to_TO an_DT aging_NN global_JJ population_NN and_CC increasing_VBG awareness_NN about_IN...

タグ付き出力をセットで処理する

これまでのところ、ニュース記事をダウンロード、クリーンアップ、タグ付けする機能が組み込まれています。ただし、記事にユーザーが関心のある企業について言及しているかどうかを判断する必要があります。

これを行うには、すべての固有名詞を収集し、ポートフォリオの一部の株式がそれらの固有名詞に含まれているかどうかを確認する必要があります。

すべての固有名詞を見つけるには、最初にタグ付き出力文字列を識別子に分割し(スペースを区切り文字として使用)、次にアンダースコア(_)の各識別子を分離し、音声の一部が適切かどうかを確認する必要があります名前。

すべての適切な名前を取得したら、それらをデータ構造に格納する必要があります。これは、目的に合わせて最適化されています。この例では、HashSetを使用します。重複エントリを禁止し、エントリの順序を追跡しないことのトレードオフとして、HashSet非常に迅速なメンバーシップの問い合わせが可能です。メンバーシップを求めることだけに関心があるので、HashSetそれは私たちの目的に最適です。

以下は、固有名詞の分離と保存を実装する関数です。この関数をクラスに配置しますPortfolioNewsAnalyzer:

javascriptで時間を取得する方法
public static HashSet extractProperNouns(String taggedOutput) { HashSet propNounSet = new HashSet(); String[] split = taggedOutput.split(' '); for (String token: split ){ String[] splitTokens = token.split('_'); if(splitTokesn[1].equals('NNP')){ propNounSet.add(splitTokens[0]); } } return propNounSet; }

ただし、この実装には問題があります。会社名が複数の単語で構成されている場合(たとえば、Luxotticaの例のCarl Zeiss)、この実装ではそれをキャッチできません。 Carl Zeissの例では、「Carl」と「Zeiss」が別々にセットに挿入されるため、一意の文字列「CarlZeiss」が含まれることはありません。

この問題を解決するために、すべての固有名詞を収集できます 続けて スペースで結合します。これを実現する更新された実装は次のとおりです。

public static HashSet extractProperNouns(String taggedOutput) { HashSet propNounSet = new HashSet(); String[] split = taggedOutput.split(' '); List propNounList = new ArrayList(); for (String token: split ){ String[] splitTokens = token.split('_'); if(splitTokens[1].equals('NNP')){ propNounList.add(splitTokens[0]); } else { if (!propNounList.isEmpty()) { propNounSet.add(StringUtils.join(propNounList, ' ')); propNounList.clear(); } } } if (!propNounList.isEmpty()) { propNounSet.add(StringUtils.join(propNounList, ' ')); propNounList.clear(); } return propNounSet; }

これで、関数は個々の固有名詞のセットを返す必要があります Y 連続する固有名詞(例:スペースで結合)。 propNounSetを印刷すると、次のように表示されます。

[... Monday, Gianluca Semeraro, David Goodman, Delfin, North America, Luxottica, Latin America, Rossi/File Photo, Rome, Safilo Group, SFLG.MI, Friday, Valentina Za, Del Vecchio, CEO Hubert Sagnieres, Oakley, Sagnieres, Jefferies, Ray Ban, ...]

ポートフォリオを固有名詞のセットと比較する

ほぼ完了です!

前のセクションでは、 スクレーパー これは、記事の本文をダウンロードして抽出できるもの、記事の本文を解析して固有名詞を識別することができるタガー、およびタグ付けされた出力を取得して固有名詞をHashSetに収集するレンダラーです。今やるべきことはHashSetを取ることです興味のある企業のリストと比較してください。

実装は非常に簡単です。次のコードをクラスに追加しますPortfolioNewsAnalyzer:

private HashSet portfolio; public PortfolioNewsAnalyzer() { portfolio = new HashSet(); } public void addPortfolioCompany(String company) { portfolio.add(company); } public boolean arePortfolioCompaniesMentioned(HashSet articleProperNouns){ return !Collections.disjoint(articleProperNouns, portfolio); }

すべてを統合する

これで、スクレイピング、クリーニング、タグ付け、収集、比較など、アプリケーション全体を実行できます。これは、アプリケーション全体で実行される関数です。この関数をクラスに追加しますPortfolioNewsAnalyzer:

public boolean analyzeArticle(String urlString) throws IOException, SAXException, BoilerpipeProcessingException { String articleText = extractFromUrl(urlString); String tagged = tagPos(articleText); HashSet properNounsSet = extractProperNouns(tagged); return arePortfolioCompaniesMentioned(properNounsSet); }

最後に、アプリを使用できます!

上記と同じアイテムを使用し、ポートフォリオ会社としてLuxotticaを使用した例を次に示します。

public static void main( String[] args ) throws IOException, SAXException, BoilerpipeProcessingException { PortfolioNewsAnalyzer analyzer = new PortfolioNewsAnalyzer(); analyzer.addPortfolioCompany('Luxottica'); boolean mentioned = analyzer.analyzeArticle('http://www.reuters.com/article/us-essilor-m-a-luxottica-group-idUSKBN14Z110'); if (mentioned) { System.out.println('Article mentions portfolio companies'); } else { System.out.println('Article does not mention portfolio companies'); } }

これを実行すると、アプリケーションは「記事がポートフォリオ企業に言及している」と出力するはずです。

Luxotticaポートフォリオ会社を記事に記載されていない会社(「Microsoft」など)に変更すると、アプリケーションは「記事にポートフォリオ会社が記載されていません」と印刷されます。

NLPアプリケーションの構築は難しい必要はありません

この記事では、URLから記事をダウンロードし、を使用して記事をクリーンアップするアプリケーションを構築するプロセスを実行します。 ボイルパイプ 、スタンフォードのNLPを使用して処理し、記事が特定の関心のある参照を行っているかどうかを確認します(この場合、ポートフォリオ内の企業)。すでに示したように、このテクノロジーのマトリックスを管理することは、他の方法では困難なタスクである、比較的簡単なタスクを実行します。

この記事が、自然言語処理の有用な概念と手法を教えてくれ、自然言語アプリケーションを自分で作成するきっかけになったと思います。

[注:この記事で参照されているコードのコピーを見つけることができます ここに 。

アジャイル、スクラム、かんばん:これらの言葉は本当に何を意味するのでしょうか?

アジャイル

アジャイル、スクラム、かんばん:これらの言葉は本当に何を意味するのでしょうか?
暗いUI。善と悪。規則ルール。

暗いUI。善と悪。規則ルール。

Uxデザイン

人気の投稿
残り火データ:残り火データライブラリの包括的なチュートリアル
残り火データ:残り火データライブラリの包括的なチュートリアル
あなたのデザインを後押しするための創造性の練習
あなたのデザインを後押しするための創造性の練習
アイコンの使いやすさとデザインのベストプラクティス
アイコンの使いやすさとデザインのベストプラクティス
2020年のプライベートエクイティの状態
2020年のプライベートエクイティの状態
Salesforceバックエンドエンジニア
Salesforceバックエンドエンジニア
 
ビッグデータ:医薬品のR&D窮状の処方箋
ビッグデータ:医薬品のR&D窮状の処方箋
スクラムの5つの誤った希望とそれらを修正する方法
スクラムの5つの誤った希望とそれらを修正する方法
GWTがブラウザの拡張現実を解き放つ方法
GWTがブラウザの拡張現実を解き放つ方法
宿題をする:AWS認定ソリューションアーキテクト試験の7つのヒント
宿題をする:AWS認定ソリューションアーキテクト試験の7つのヒント
最大フローと線形割り当て問題
最大フローと線形割り当て問題
人気の投稿
  • 次のデータ視覚化ツールのどれが定量的データを整理するために使用されますか?
  • これらのうち、プロジェクトから利用可能なキャッシュフローの合計額の尺度として使用されるのはどれですか
  • 不和のボットとは
  • phpはutf8をASCIIに変換します
  • クレジットカードのスパムを送信する方法pdf
カテゴリー
分散チーム 技術 その他 データサイエンスとデータベース リモートの台頭 バックエンド 革新 収益と成長 製品の担当者とチーム ツールとチュートリアル

© 2021 | 全著作権所有

apeescape2.com