これは、PHP用のWeb記事の解析および言語検出ライブラリです。このライブラリは、Webページから記事の内容を読み取り、すべてのHTMLを削除し、テキストや機械学習プロセスに適した生のテキストのみを提供します。
私が開発したプロジェクトでは、多くの既存のオープンソースソリューションが優れた出発点を見つけましたが、それぞれにユニークな失敗がありました。このライブラリは、言語検出の追加機能を追加しながら、3つの異なるアプローチを単一のソリューションに集約します。
このライブラリはpackagist.orgを介して配布されるため、Composerを使用して依存関係を取得できます
composer require crscheid/php-article-extractor
このライブラリは、あなたのためにHTMLを取得しようとします。 exportextractorクラスを作成し、その上のparseURL関数を呼び出して、希望するURLを通過するだけで必要です。
use Cscheide ArticleExtractor ArticleExtractor ;
$ extractor = new ArticleExtractor ();
$ response = $ extractor -> processURL ( " https://www.fastcompany.com/3067246/innovation-agents/the-unexpected-design-challenge-behind-slacks-new-threaded-conversations " );
var_dump ( $ response );関数processURL 、リクエストに関連付けられたタイトル、テキスト、およびメタデータを含む配列を返します。テキストがnullの場合、これは解析の失敗を示します。以下は、上記のコードの出力です。
ライブラリがリダイレクトに続いた場合、フィールドresult_url異なります。このフィールドは、リダイレクト後に実際に取得された最終ページを表します。
array(5) {
["parse_method"]=>
string(11) "readability"
["title"]=>
string(72) "The Unexpected Design Challenge Behind Slack’s New Threaded Conversations"
["text"]=>
string(8013) "At first blush, threaded conversations sound like one of the most thoroughly mundane features a messaging app could introduce.After all, the idea of neatly bundling up a specific message and its replies in ..."
["language_method"]=>
string(7) "service"
["language"]=>
string(2) "en"
["result_url"]=>
string(126) "https://www.fastcompany.com/3067246/innovation-agents/the-unexpected-design-challenge-behind-slacks-new-threaded-conversations"
}
すでにHTMLを持っている場合は、 parseHTML関数を使用して、同じロジックを介して処理されたHTMLを使用できます。
use Cscheide ArticleExtractor ArticleExtractor ;
$ extractor = new ArticleExtractor ();
$ myHTML = <load from some source>;
$ response = $ extractor -> processHTML ( $ myHTML );
var_dump ( $ response );関数parseHTML 、リクエストに関連付けられたタイトル、テキスト、およびメタデータを含む配列を返します。テキストがnullの場合、これは解析の失敗を示します。以下は、上記のコードの出力です。
プロセスコール中にHTMLを取得しようとしていないため、この場合はフィールドresult_url含まれません。
array(5) {
["parse_method"]=>
string(11) "readability"
["title"]=>
string(72) "The Unexpected Design Challenge Behind Slack’s New Threaded Conversations"
["text"]=>
string(8013) "At first blush, threaded conversations sound like one of the most thoroughly mundane features a messaging app could introduce.After all, the idea of neatly bundling up a specific message and its replies in ..."
["language_method"]=>
string(7) "service"
["language"]=>
string(2) "en"
}
また、言語検出サービスのキーとカスタムユーザーエージェント文字列のキーを渡すことにより、 ArticleExtractorクラスを作成することもできます。詳細については、以下をご覧ください。
言語検出は、HTMLメタデータ内の言語仕様を探すか、検出言語サービスを利用することによって処理されます。
記事の言語を検出できる場合、ISO 639-1形式の言語コードと検出方法は、それぞれFields languageとlanguage_methodで返されます。 language_methodフィールドは、正常に見つかった場合、 htmlまたはserviceいずれかである場合があります。
言語の検出が失敗するか利用できない場合、これらのフィールドは両方ともnullとして返されます。
言語を検出するには、サインアップできるAPIキーを使用する必要があります。ただし、このライブラリを使用せずに使用することもできます。 HTMLメタデータに記事の言語に関する情報が含まれていない場合、 languageとlanguage_method null値として返されます。
言語検出サービスを利用してこのライブラリを利用するには、APIキーを渡して言語を検出することにより、 ArticleExtractorオブジェクトを作成します。
use Cscheide ArticleExtractor ArticleExtractor ;
$ extractor = new ArticleExtractor ( ' your api key ' );発信リクエストのためにユーザーエージェントを設定することができます。そのためには、次のように、目的のユーザーエージェント文字列をコンストラクターに渡します。
use Cscheide ArticleExtractor ArticleExtractor ;
$ myUserAgent = " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36 " ;
$ extractor = new ArticleExtractor ( null , $ myUserAgent );読みやすさ、ガチョウ、またはカスタム処理を備えたグースのいずれかで、読み取りを試みる方法を強制することができます。これは、読みやすさまたはグースが特定のWebサイトで特定の問題を抱えている場合に役立ちます。
方法を強制するために、コンストラクターに3番目の引数を提供するだけです。 4つの有効な方法は、 readability 、 goose 、 goosecustom 、またはcustomです。
$ extractor = new ArticleExtractor ( null , null , " goose " );バージョン1.0の時点で、出力形式が変更され、見出しに新しいラインブレークを提供しています。これは、特に文の境界を決定する際の自然言語処理アプリケーションにとって重要です。この動作が望ましくない場合は、必要に応じて追加のニューラインを削除するだけです。
この変更は、ヘッダーと段落のHTML要素が単に剥奪された場合、見出しと手続文の間に分離がない問題がしばしば発生することが多いために行われました。
テキストフィールドの出力形式の例
n
A database containing 250 million Microsoft customer records has been found unsecured and onlinen
NurPhoto via Getty Imagesn
A new report reveals that 250 million Microsoft customer records, spanning 14 years, have been exposed online without password protection.n
Microsoft has been in the news for, mostly, the wrong reasons recently. There is the Internet Explorer zero-day vulnerability that Microsoft hasn't issued a patch for, despite it being actively exploited. That came just days after the U.S. Government issued a critical Windows 10 update now alert concerning the "extraordinarily serious" curveball crypto vulnerability. Now a newly published report, has revealed that 250 million Microsoft customer records, spanning an incredible 14 years in all, have been exposed online in a database with no password protection.n
What Microsoft customer records were exposed online, and where did they come from?n
ユニットテストはこの分布に含まれており、依存関係をインストールした後にphpunitを使用して実行できます。推奨されるアプローチは、この目的のためにDockerを使用することです。そのため、システムに依存関係をインストールする必要さえありません。
注:ユニットテストでの言語検出が適切に機能するように、環境変数
DETECT_LANGUAGE_KEY検出言語キーで設定してください。
これにより、Composer Docker画像を使用して要件をダウンロードします。一部の依存関係はまだPHP 8をサポートしていないため--ignore-platform-reqsの使用に注意してください。
docker run --rm --interactive --tty --volume $PWD:/app composer --ignore-platform-reqs install
これにより、PHP 7.4コマンドライン環境内でダウンロードしたPHPunit依存関係が実行されます。
docker run -v $(pwd):/app -w /app -e DETECT_LANGUAGE_KEY=<yourapikey> --rm php:7.4-cli ./vendor/phpunit/phpunit/phpunit