2026年9月30日

2026年9月30日

WordPressの記事作りに自然言語処理(NLP)を使う:Natural Language APIで下書きを分析する

自然言語処理(NLP)は、文章から人名・製品名・概念などの「エンティティ」を取り出したり、文の感情や構造を判定したりする技術です。WordPressの記事作りでは、文章を自動で量産するよりも、書いた下書きが何について書かれている文章として読み取れるかを機械で確かめる使い方のほうが、品質を落とさずに取り入れやすい方法です。

この記事では、Google Cloud の Natural Language API を使って、WordPressの投稿本文からエンティティを取り出すWP-CLIコマンドを作り、その結果を記事の見直しに使う手順を解説します。WordPress本体にはNLPの機能はないため、外部のAPIを呼び出す形になります。

NLPで分かること・分からないこと

Natural Language API(v1)の主な機能は次のとおりです。日本語は、エンティティ分析・感情分析・構文解析に対応しています。コンテンツの分類(カテゴリの判定)は、日本語ではv2のモデルだけが対応しています(2026年11月時点の公式の対応言語一覧による)。

機能 分かること 記事作りでの使いみち
エンティティ分析 文章に出てくる人・組織・場所・製品・概念と、その重要度(salience) 主題が文章の中心として読み取れるかの確認
感情分析 文全体や文ごとの肯定・否定の度合い レビューや比較記事の論調の偏りの確認
構文解析 品詞や係り受け 長すぎる文や主語のない文を探す補助

一方で、NLPの分析結果は「その記事が検索で上位に表示されるか」を示すものではありません。Natural Language APIはGoogle Cloudの製品で、Google検索の順位を決める仕組みそのものではないからです。結果は、書き手が気づきにくい偏りを見つけるための参考情報として扱います。

文章の自動生成について

大規模言語モデルで文章を生成するプラグインやサービスもありますが、検索での扱いについてはGoogleが方針を公開しています。生成AIを使ったこと自体は問題にされず、評価されるのは内容が人の役に立つかどうかです。一方、検索順位を操作する目的で、価値の低いページを大量に作ることは、スパムポリシーの「大量生成されたコンテンツの不正使用(scaled content abuse)」に当たります。

生成した文章を使う場合は、事実関係を一次情報で確かめ、自分の経験や検証結果を加えてから公開してください。人の役に立つ記事かどうかを見直す観点は Helpful Content Update後のWordPressサイト対策 でまとめています。

準備:APIを有効にしてキーを作る

  1. Google Cloud コンソールでプロジェクトを作成し、課金を有効にします。Natural Language APIは文字数に応じた従量課金で、最新の料金と無料枠は公式の料金ページで確認してください。
  2. 「APIとサービス」から Cloud Natural Language API を有効にします。
  3. 「認証情報」でAPIキーを作成し、キーの制限で、使えるAPIを Cloud Natural Language API だけに絞ります。
  4. キーをWordPressの wp-config.php に定数として書きます。「編集が必要なのはここまでです」の行より上に置いてください。
define( 'NLP_API_KEY', 'ここに作成したAPIキー' );

APIキーは記事本文やテーマのファイル、Gitのリポジトリには入れないでください。キーの管理方法は WordPressのAPIキーを.envファイルで安全に管理する方法 で詳しく解説しています。

WP-CLIコマンドを作る

次のファイルを wp-content/mu-plugins/nlp-entities.php として保存します(mu-plugins フォルダーがなければ作ります)。mu-plugins に置いたファイルは自動で読み込まれ、管理画面での有効化は不要です。WP-CLIから実行したときだけ動き、通常のページ表示には影響しません。

<?php
/**
 * Plugin Name: NLP Entities for WP-CLI
 * Description: 投稿本文を Cloud Natural Language API で分析し、主要なエンティティを表示する WP-CLI コマンド。
 */

if ( ! defined( 'WP_CLI' ) || ! WP_CLI ) {
	return;
}

WP_CLI::add_command(
	'nlp entities',
	function ( $args, $assoc_args ) {
		if ( ! defined( 'NLP_API_KEY' ) || '' === NLP_API_KEY ) {
			WP_CLI::error( 'wp-config.php に NLP_API_KEY を定義してください。' );
		}

		$post = get_post( (int) $args[0] );
		if ( ! $post ) {
			WP_CLI::error( '投稿が見つかりません。' );
		}

		// ブロックのコメントやHTMLタグ、ショートコードを除いた本文を作る。
		$text = wp_strip_all_tags( strip_shortcodes( $post->post_title . "\n\n" . $post->post_content ) );

		$response = wp_remote_post(
			'https://language.googleapis.com/v1/documents:analyzeEntities',
			array(
				'timeout' => 30,
				'headers' => array(
					'Content-Type'   => 'application/json; charset=utf-8',
					'X-Goog-Api-Key' => NLP_API_KEY,
				),
				'body'    => wp_json_encode(
					array(
						'document'     => array(
							'type'     => 'PLAIN_TEXT',
							'language' => 'ja',
							'content'  => $text,
						),
						'encodingType' => 'UTF8',
					)
				),
			)
		);

		if ( is_wp_error( $response ) ) {
			WP_CLI::error( $response->get_error_message() );
		}

		$code = (int) wp_remote_retrieve_response_code( $response );
		$data = json_decode( wp_remote_retrieve_body( $response ), true );
		if ( 200 !== $code ) {
			$message = isset( $data['error']['message'] ) ? $data['error']['message'] : '';
			WP_CLI::error( sprintf( 'HTTP %d %s', $code, $message ) );
		}

		$entities = isset( $data['entities'] ) ? $data['entities'] : array();
		usort(
			$entities,
			function ( $a, $b ) {
				return $b['salience'] <=> $a['salience'];
			}
		);

		$limit = isset( $assoc_args['limit'] ) ? max( 1, (int) $assoc_args['limit'] ) : 15;
		$rows  = array();
		foreach ( array_slice( $entities, 0, $limit ) as $entity ) {
			$rows[] = array(
				'name'      => $entity['name'],
				'type'      => $entity['type'],
				'salience'  => round( $entity['salience'], 3 ),
				'mentions'  => isset( $entity['mentions'] ) ? count( $entity['mentions'] ) : 0,
				'wikipedia' => isset( $entity['metadata']['wikipedia_url'] ) ? $entity['metadata']['wikipedia_url'] : '',
			);
		}

		WP_CLI\Utils\format_items( 'table', $rows, array( 'name', 'type', 'salience', 'mentions', 'wikipedia' ) );
	},
	array(
		'shortdesc' => '投稿本文の主要なエンティティを表示します。',
		'synopsis'  => array(
			array(
				'type'        => 'positional',
				'name'        => 'post_id',
				'description' => '分析する投稿のID',
				'optional'    => false,
			),
			array(
				'type'        => 'assoc',
				'name'        => 'limit',
				'description' => '表示する件数',
				'optional'    => true,
				'default'     => 15,
			),
		),
	)
);

ポイントは次のとおりです。

  • wp_strip_all_tags() と strip_shortcodes() で、ブロックのコメントやHTMLタグを除いた文章だけを送ります
  • APIの documents:analyzeEntities に、document.type を PLAIN_TEXT、language を ja として送信します
  • 返ってきたエンティティを重要度(salience)の高い順に並べ、名前・種類・重要度・出現回数・Wikipediaの対応ページを表で表示します

WP-CLIのカスタムコマンドの作り方そのものは WP-CLIのカスタムコマンドを作る方法 で解説しています。

実行して結果を読む

下書きの投稿IDを指定して実行します。投稿IDは、投稿の編集画面のURL(post.php?post=123 の数字)で確認できます。

wp nlp entities 123
wp nlp entities 123 --limit=30

結果の見方は次のとおりです。

  • salience(重要度): 0〜1の値で、文章全体の中でそのエンティティがどれだけ中心的かを表します。記事の主題(例:「WordPress」「バックアップ」)が上位に来ていれば、文章が主題に沿って書かれていると読み取れます
  • 主題が上位に出ない場合: 前置きや周辺の話題が長すぎる、主題を「これ」「この機能」などの指示語で受けている、といった原因が考えられます。主題を明示する文に直し、もう一度実行して比べます
  • mentions(出現回数): 同じエンティティへの言及の数です。多すぎる場合は、同じ語の繰り返しで読みにくくなっていないかを確認します
  • wikipedia: エンティティがWikipediaの項目に対応づけられた場合にURLが入ります。固有名詞が意図した対象(同名の別の製品や人物ではないか)として認識されているかの確認に使えます

数値を上げること自体を目的にしないでください。重要度を上げるために主題の語を繰り返し詰め込むと、読者にとって読みにくい文章になります。

運用上の注意

  • 外部への送信: 下書きの本文がGoogle Cloudに送信されます。公開前の機密情報や個人情報を含む文章は分析しないか、社内の規程を確認してください
  • 費用の管理: 大量の投稿をまとめて分析すると費用がかさみます。Google Cloudの予算アラートを設定しておくと安心です
  • キーの漏えい対策: キーはAPIの制限を付けて作り、使わなくなったら削除します
  • 結果は参考情報: 分析結果は文章の見直しのきっかけであり、検索順位の予測ではありません

まとめ

  • WordPress本体にNLPの機能はないため、外部のAPIを使います。Natural Language APIのエンティティ分析は日本語に対応しています
  • mu-plugins にWP-CLIコマンドを置くと、wp nlp entities 投稿ID で下書きの主要なエンティティと重要度を確認できます
  • 主題が重要度の上位に出ない場合は、前置きの長さや指示語の多さを見直します
  • 文章の自動生成を使う場合も、事実確認と独自の経験・検証を加えてから公開します

お気軽にご相談ください

お見積りへ お問い合わせへ
▲