![見出し画像](https://assets.st-note.com/production/uploads/images/89039077/rectangle_large_type_2_3fe993e371c563a5d4a2381e20aa36fc.png?width=1200)
【JKI】038_Word_Windows_02_TRAP
【JKI_038】課題を再確認
文章中の特定の単語の前後3語までのウィンドウサイズで語句抽出すると言う問題です。
サンプルのExcelを読みこんで、結果としてどういった画面表示で出力するかまでは紹介したので、続けて私の解答したworkflow (WF)のコンポーネントの中身を紹介します。
![](https://assets.st-note.com/img/1665814575672-7aQ3B6b00N.png?width=1200)
ただし、効率的ではないなと自分でも感じてはいるので公式解答を楽しみにしているところです。私のWF説明はざっくりとしておきます。
【トラップを踏みしめる製作工程紹介】
【入力制御】
![](https://assets.st-note.com/img/1665815884874-mbSoTgyVgC.png)
WFを実際に動かして検索操作をするための画面 (GUI)の設定用です。
String Widgetが検索語の入力ウィンドウ、
Text Outpur Widgetは注意書きを掲示するためのもの、
Table Editorはユーザが入力データ群を少し変えていろいろ試せたらと設置してみました。
Refresh Button Widgetは検索実行ボタンです。
設定内容などは割愛します。
【検索対象データ前処理】
![](https://assets.st-note.com/img/1665815971378-hL5f1UyHwT.png?width=1200)
様々なトラップつまり検索のために取り除く必要があった改行や句点などの処理をしています。
【Bag Of Words】3点セット
String To DocumentとBag Of Words CreatorとTerm To Stringの3点セットは、JKI第34回の公式解答から拝借しました。
正直言って私にとってはブラックボックスです。使ってみますと改行は語句の切れ目(デリミタ)として処理してくれますし、”I’d”や”dosen’t”は略されたままではありますが”I”と”’d”、”does”と”n’t”に分けるなど、文法的な内容も考慮した文字列処理をしてくれる優れモノ。
今回初めて自分で使ってみてツールとしての面白さを知りました。苦労はしたけど勉強になったなぁ。
【句読点処理】3つのString Manipulation
そのまま次の検索へ進めたかったのですが、一つ今回ならではの特殊な問題がありました。句読点のうち、読点だけは削除しないで前の単語とまとめて扱う必要があったのです。
(INPUT) I love eggs, but they need salt. -> (OUTPUT) I love eggs, but they need
ループの5回目のTerm To Stringの出力を見てみますと
![](https://assets.st-note.com/img/1665816179880-KsoaKh82zu.png?width=1200)
“great,”の部分が2行に分かれています。これをまとめるのが一苦労でした。次のメタノードの中身を紹介します。きっともっと良いアルゴリズムがあるでしょうが。
![](https://assets.st-note.com/img/1665816225661-xrIzI5TGpB.png)
![](https://assets.st-note.com/img/1665816240556-SOjrbMYdHM.png?width=1200)
要するに
縦に並んだデータをGroupByでまた横一列に半角スペース繋ぎで並べ、
String Manipulationで
” ,”の半角スペースを除去すると前の単語とまとめて扱えます。
また、句点である”?”, ”.” ,”!”は今回は全て除去しているようでしたので、もう一つのString Manipulationで処理しました。
そのあとの5つのノードはまた縦に単語データ群を並べ替えるだけが目的です。
その結果、
![](https://assets.st-note.com/img/1665816316774-drSyA0RRXZ.png?width=1200)
“great,”と読点付きで語句抽出ができています。
ちなみに3つ目となるString ManipulationはカラムをString型に指定しなおしています。
このノードがないと次の文章を扱う際に問題が生じるのです。
I'd love 2eggs and ham. Why is 2 attached to eggs?
より具体的に見ていきます。
Cell Splitterを下記の設定にしています。
![](https://assets.st-note.com/img/1665816410579-tCJie0Ihxz.png?width=1200)
すると、今回の語句のうち”2”だけは数値データだと判定されるので、Unpivotingでまとめた時に下図のような結果となります。
![](https://assets.st-note.com/img/1665816442768-Gbowc0cbKG.png?width=1200)
データ型が「不明」を意味する「?」になってしまい、後で集計する際のエラー発生原因になってしまいます。
3つのString Manipulationの設定は以下に示します。
![](https://assets.st-note.com/img/1665816938565-Y15JRh0CpZ.png?width=1200)
![](https://assets.st-note.com/img/1665817156855-YmmhoZspsw.png?width=1200)
![](https://assets.st-note.com/img/1665817165695-4wl7vo26Q3.png?width=1200)
出題者の仕掛けたトラップに全て引っかかった感があります。
今日のテーマソングはこちら。
TRAPだけに。
【完全一致検索実行と単語群抽出】2つのRow Splitter
![](https://assets.st-note.com/img/1665817240871-j0Ub9ISGXK.png?width=1200)
上図の各ノードの説明書きを見てもらえば流れは分かると思うのですが、1つめのRow Splitterで縦に並べてある単語群の何行目がヒットしたかを調べ、その値の前後±3を範囲として2つめのRow Splitterで単語群の抽出をしています。
2つのRow Splitterの設定を示します。
![](https://assets.st-note.com/img/1665817315836-N0byFBkAnp.png?width=1200)
![](https://assets.st-note.com/img/1665817331413-4IH09V0Xkf.png?width=1200)
![](https://assets.st-note.com/img/1665817348344-pfJAKaqOHd.png?width=1200)
![](https://assets.st-note.com/img/1665817361343-zFVsUlXjvM.png?width=1200)
【結果の集約と可視化】
![](https://assets.st-note.com/img/1665817396054-ILjwwleN3z.png?width=1200)
WFのあちこちからLoop EndやJoinerでデータを統合してきて、並べ替えなどして最後の出力はTable Viewでしています。
設定は可視化のためのGUIについてだけ、以下に示します。
コンポーネントの画面構成は下図の通りです。
![](https://assets.st-note.com/img/1665817495627-89ZouVeYhN.png?width=1200)
実際に表示される画面自体は前回に紹介済ですし、WFはKNIME Hubに。
以上、解答WFの製作工程紹介でした。
おまけ:
【JKI シーズン1】
これまで敢えて触れてきませんでしたが、下記の通りの告知がされています。
Season 1 of "Just KNIME It!" is slowly coming to an end: the last challenge will come out on October 26!
あと2回です。連続ドラマだと意外な黒幕が現れて、主人公が大ピンチになるあたりです。
実は第34回あたりからJKIの公式解答も次に何が起こるかわからないハラハラドキドキの展開になってきたなと思っています。
次週が待ちきれない!
記事を読んでいただきありがとうございます。 先人の智慧をお借りしつつ、みなさんに役立つ情報が届けられたらと願っています。 もしサポートいただけるなら、そのお金はKNIMEの無料勉強会の開催資金に充てようと思います。