![見出し画像](https://assets.st-note.com/production/uploads/images/85665384/rectangle_large_type_2_c503e37dc0b43bc652392570f3aa75cb.png?width=1200)
【JKI】031_Extracting_Keywords_from_a_Website
【JKI_031】課題を確認
Just KNIME It! (JKI)
今回の挑戦はこちら
![](https://assets.st-note.com/img/1661674653276-OiwXZjupeq.png?width=1200)
問題文をGoogle翻訳し少し加筆して以下に
課題31:ウェブサイトからキーワードを抽出する
レベル: 簡単
説明: このごちそうは何ですか?
この課題では、Web ページからテキストを抽出し、キーワード検索を実行して、キーワードのタグクラウドを作成します。
ソリューションには、キーワードのタグクラウドとレシピの推測が含まれている必要があります。
ヒント: このチャレンジに必要なノードは全部で 5 つだけです (うち 2 つはText Processing の検証済みコンポーネントです)。
【サンプルデータの取得】
csvファイルをダウンロードして、KNIME workflow (WF)内に格納して相対パスで読み込むところはいつもの通りですが、結果を見て驚きました。
設定:
![](https://assets.st-note.com/img/1661674796931-7ZagJTrBD7.png?width=1200)
結果:
![](https://assets.st-note.com/img/1661674815429-4V7mE2vFST.png?width=1200)
csvにURL一つだけです。
以下ネタバレを含んでいます
私はついここで上記のサイトにアクセスしてしまい、課題であるレシピの推測の正解を知ってしまいましたがそれは後ほど。自分で推測したい方はまだ見ない方がいいです。
【keyword search KNIME】
今回の課題は「Web ページからテキストを抽出し、キーワード検索を実行」
するのですが、私は自然言語処理など全く経験がないです。
そこで上記タイトルのクエリでGoogle検索して下記のサイトが見つかりました。
なるほど、SEOにも使えるコンポーネントなんですね。このサイト自体もSEO対策してたりするのかな。
SEO(Search Engine Optimization)とは、YahooやGoogle等の検索結果の画面で自社のサイトを検索結果の上位に表示させる技術の事です。
上記KNIME社ブログ「How to build a KNIME workflow for semantic search and improve SEO」の筆者であるAli Asghar Marviさんが下記のKNIME workflow (WF)を公開して下さってます。
これ、もう正解そのものを含んでますよね。難易度が「簡単」とはこういうことかなと思いました。このWFを私が自力で0から構築は到底できないですが、KNIMEコミュニティがあれば大丈夫という一例だと思います。
今回の課題に必要な部分をそのまんまいただいて下記に紹介します。
【WFのコピペで実装完了】
上記WFを自分のKNIME APにインポートしました。
![](https://assets.st-note.com/img/1661675049877-r70ic8KsPw.png?width=1200)
立ち上げると私の環境では追加インストールが必要なextensionsがあるようなので「YES」
![](https://assets.st-note.com/img/1661675076474-jbHC0urGGI.png?width=1200)
「Next」
![](https://assets.st-note.com/img/1661675092927-utWPFQ3t77.png?width=1200)
(以下略)でKNIME再起動後に
下記のWFから必要部分をコピー
![](https://assets.st-note.com/img/1661675120392-dNkewIsqeE.png?width=1200)
自分の今回の解答WFへ貼り付けてノードを繋いで出来上がり。設定を変える必要すらなかったです。
![](https://assets.st-note.com/img/1661675145072-JPIxXcFPjn.png?width=1200)
では各コンポーネントなど体験していきます。
【Web Text Scraper】
上記ブログをGoogle翻訳して以下引用させていただきました。
このコンポーネントは、外部 Web ライブラリ (「BoilerPipe」) に接続して、入力 URL からテキストを抽出します。次に、不要な HTML タグとボイラープレート テキストを除外します。(ヘッダー、メニュー、ナビゲーション ブロック、スパン テキスト、コア テキスト以外のすべての不要なコンテンツ。)
Boilerpipe で使用されるアルゴリズムとそのパフォーマンスの最適化の詳細については、研究論文「Boilerplate Detection using Shallow Text Features 」に記載されています。
このコンポーネントは、URL の列を入力として受け取り、文字列形式のテキストを含む列を出力として生成します。有効な HTML コンテンツのみがサポートされ、関連する他のすべてのスクリプトはスキップされます。
Javaでの実装なんだと興味深く拝見しました。
![](https://assets.st-note.com/img/1661675320383-Ei7M3Crr5I.png?width=1200)
![](https://assets.st-note.com/img/1661675335924-Uv42RdGgym.png?width=1200)
また、上記のWF実行時に、WF内のdataフォルダにBoilerpipe環境が新たに作られていました。仕組みは私のような初心者には全くわかってないですが、KNIMEってこんなこともできるんだと感心。
![](https://assets.st-note.com/img/1661675357786-r5mt4bIzra.png)
わけもわからないで眺めてばかりでもいけないので先に進めます。以下は設定と結果です。
![](https://assets.st-note.com/img/1661675385620-YmLHyKG6pg.png)
設定:
![](https://assets.st-note.com/img/1661675404202-xHKLf37Gql.png?width=1200)
結果:
![](https://assets.st-note.com/img/1661675431998-z0CopH6kTY.png?width=1200)
【Strings To Document】
![](https://assets.st-note.com/img/1661675462621-OOKIL0j7gK.png)
日本語化されたディスクリプションによれば
指定された文字列をドキュメントに変換します。
各行ごとにドキュメントが作成され、その行に添付されます。
指定された列の文字列は、タイトル、著者、およびフルテキストとして使用されます。
さらに、定義されたカテゴリ、ソース、タイプ、および日付が設定されます。
うーん、初めて見たし使いどころがもう一つよくわからないノードです。
今回は次のKeyword SearchノードがDocument型のデータ入力しか受け付けないので利用は必須かなと理解しました。
設定:
![](https://assets.st-note.com/img/1661675535477-cOxranWwHG.png?width=1200)
結果:
![](https://assets.st-note.com/img/1661675595710-mGSRu2TlPD.png?width=1200)
ノードの出力テーブルだけでは何が起きたかわかりにくいですが、ドキュメント形式のデータが生成したと言うことで次に行きます。
【Keyword Search】
![](https://assets.st-note.com/img/1661675640616-3t7ThRKviY.png)
再びブログの記事を翻訳しての引用です。
このコンポーネントは
3 つの手法 (用語共起、LDA を使用したトピック抽出、および TF-DIF) を実装して、キーワードを抽出します。
1. 単語の共起— 最も頻繁に出現する単語のペアが抽出されます。
2. 潜在的ディリクレ配分 (LDA) — コーパス内のドキュメントをトピックにクラスター化するアルゴリズムで、各トピックは関連する関連キーワードのセットによって記述されます。
3. 用語頻度 - 逆ドキュメント頻度 (TF-IDF) — ドキュメント内の単一キーワードの重要性は用語頻度 (TF) によって測定され、コーパス内の同じキーワードの重要性は逆ドキュメント頻度 (IDF) によって測定されます。 )。これらのメトリクスの積 (TF-IDF) は、コーパス内のドキュメントとそのドキュメントのみを識別するために単語がどの程度関連しているかについて適切な妥協点を提供します。次に、TF-IDF ランキングが最も高い単語が抽出されます。
さっぱりわからない
私は湯川学ではないので謎解きはなくあっさりと次へ進めます。今回はTF-IDFの結果を用いてのタグクラウド生成をするようです。
![](https://assets.st-note.com/img/1661675859566-VO6iWpBugK.png?width=1200)
TFノードとIDFノードも初めてみましたが、Infocomさんはちゃんと日本語化して下さっていて感心しました。
TFノード:
各文書に従った各用語の相対的な用語頻度(tf)を計算し、tf値を含む列を追加します。
tf値は、ある文書に対する用語の絶対頻度を、その文書の全用語数で割って算出されます。
IDFノード
与えられたドキュメントのセットに従って、各用語の逆ドキュメント頻度(idf)の3つのバリエーションを計算し、idfの値を含む列を追加します。
スムーズidf、正規化idf、確率的idfです。
デフォルトのバリアントは、次のように指定されたスムーズidfです: idf(t) = log(1 + (f(D) / f(d, t))).
正規化idfは次のように定義されます:idf(t) = log(f(D) / f(d,t)).
確率的idfは次のように定義される: idf(t) = log((f(D)-f(d,t))/
ここで、f(D)はすべてのドキュメントの数、f(d,t)は用語tを含むドキュメントの数である。
ブラックボックスのまま使いたくないとは思って中を見たものの、パンドラの箱だった。ふたを一瞬開けて、そっとふたをして、次へ進みます。
一応読んでみた記事は下記に共有しておきます。
「単語の出現頻度」が高い方が重要(TF)と考える一方で、「いろんな文書に出てくるよく見る単語はそこまで重要ではない」こと(IDF)も合わせて評価する指標なのですね。感覚的にはなるほどと思いました。
設定:
![](https://assets.st-note.com/img/1661676120788-jwoWSujtlo.png?width=1200)
結果:
![](https://assets.st-note.com/img/1661676148195-8UQVsaSpqP.png?width=1200)
TF-IDFスコア順に並べられた単語群を見たら何のレシピかは容易に推測が付くでしょうが次へ。
【Tag Cloud】
![](https://assets.st-note.com/img/1661676230232-ZNSaCehgQD.png)
日本語化されたディスクリプションによれば
タグクラウドは、視覚的な特性を操作することで、単語の重要性を示す単語の表現です。
より詳しい利用法なども記載されていますが今日は割愛します。タグクラウドをインタラクティブに利用できる便利なノードなのですが、今回は下記設定での実行結果を見るだけにします。
設定:
![](https://assets.st-note.com/img/1661676280621-9nys1fGfOr.png?width=1200)
結果:
![](https://assets.st-note.com/img/1661676304100-XWvzDKEffT.png?width=1200)
もう完全にストロベリーケーキやがな。
KNIME Hubに解答は上げています。
おまけ:
【JKI_030 感想戦】
今回も本質的には正解できたようです。
但し手を掛け過ぎたようでした。
公式解答はこちら。
なるほどJoinerとPivotingでの効率よいデータ整形はいいですね。
![](https://assets.st-note.com/img/1661676563736-CicLhCpVsd.png?width=1200)
2000年と最近のTop3比較は見ればわかるでしょってことなのか特に記載などなかったです。ま、いいか!
記事を読んでいただきありがとうございます。 先人の智慧をお借りしつつ、みなさんに役立つ情報が届けられたらと願っています。 もしサポートいただけるなら、そのお金はKNIMEの無料勉強会の開催資金に充てようと思います。