質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

16838閲覧

JSONの値で条件分岐したい(形態素解析の後の処理)

saikin

総合スコア16

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2019/04/01 06:31

編集2019/04/02 03:00

###【前提】

「ある文章」を「JSONの単語」に分解した後、適切な単語を取得したいです。

次のような「kuromoji.js」というプラグインを利用した分解機能を使っています。
https://takuyaa.github.io/kuromoji.js/demo/tokenize.html

###【目的】
下記の【JavaScript】によって【JSON】が出力される状況です。

【抽出の条件】に従い適切な単語を取得して、【JavaScript】にあるvar result_arr = ['美しい','山'];のような配列を生成したいです。

【抽出の条件】とは【JSON】の値での条件分岐なのですが、その方法がわかりませんでしたので、教えていただきたく存じます。

###【JavaScript】
「kuromojiBuilder」や「tokenizer」を定義する前半部分は割愛させてください。
とりあえずこのコードによって【JSON】が出力される感じです。

javascript

1window.tokenize= function(words){ 2 kuromojiBuilder.then(function(tokenizer){ 3 var token= tokenizer.tokenize(words) 4 5 // 現状はこうして【JSON】を出力しています 6 document.querySelector('pre').innerHTML= JSON.stringify(token,null,2) 7 }) 8} 9 10// 下記の【JSON】から次の配列を取得したい流れです。 11// var result_arr = ['美しい','山'];

###【JSON】
たとえばこれが出力されたとします。

JSON

1[ 2 { 3 "word_id": 171750, 4 "word_type": "KNOWN", 5 "word_position": 1, 6 "surface_form": "美しい", 7 "pos": "形容詞", 8 "pos_detail_1": "自立", 9 "pos_detail_2": "*", 10 "pos_detail_3": "*", 11 "conjugated_type": "形容詞・イ段", 12 "conjugated_form": "基本形", 13 "basic_form": "美しい", 14 "reading": "ウツクシイ", 15 "pronunciation": "ウツクシイ" 16 }, 17 { 18 "word_id": 1530210, 19 "word_type": "KNOWN", 20 "word_position": 4, 21 "surface_form": "山", 22 "pos": "名詞", 23 "pos_detail_1": "一般", 24 "pos_detail_2": "*", 25 "pos_detail_3": "*", 26 "conjugated_type": "*", 27 "conjugated_form": "*", 28 "basic_form": "山", 29 "reading": "ヤマ", 30 "pronunciation": "ヤマ" 31 } 32]

###【抽出の条件】
肝心の【JSON】から配列を作るための条件がこちらの2つです。

1."pos"が名詞か副詞の場合は、basic_formの値を取得する。

2."pos"が形容詞か動詞の場合は、「pos_detail_1自立」で、「conjugated_form基本形」の、basic_formの値を取得する。

この条件のように【JSON】の値での条件分岐というのがまるでわからず、質問させていただきました。

そしてこの2つの条件では「美しい」「山」が取得されますので、それらを【JavaScript】のvar result_arr = ['美しい','山'];に入れて活用したいという流れを考えています。

JSONも初めてでかなり苦戦してしまっています。
宜しくお願い致します。

###補足(Lhankor_Mhy様へ)
配列の重複状況について画像で補足致します。
テキストボックスに「美しい山」を一度だけ「Ctrl + v」するとこの画像のようになります。
イメージ説明
一度の「Ctrl + v」でなぜか配列が2つ出てまして、上の方は必要な配列ですが、下の方は値が重複しているのがご覧いただけると思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

形容詞か動詞の場合で「pos_detail_1が自立ではない」場合はなにを返せばいいのでしょう?

とりあえず、書いてあるとおりにコードを書くと、こんな感じかと思います。

js

1JSON.parse(` 2[ 3 { 4 "word_id": 171750, 5 "word_type": "KNOWN", 6 "word_position": 1, 7 "surface_form": "美しい", 8 "pos": "形容詞", 9 "pos_detail_1": "自立", 10 "pos_detail_2": "*", 11 "pos_detail_3": "*", 12 "conjugated_type": "形容詞・イ段", 13 "conjugated_form": "基本形", 14 "basic_form": "美しい", 15 "reading": "ウツクシイ", 16 "pronunciation": "ウツクシイ" 17 }, 18 { 19 "word_id": 1530210, 20 "word_type": "KNOWN", 21 "word_position": 4, 22 "surface_form": "山", 23 "pos": "名詞", 24 "pos_detail_1": "一般", 25 "pos_detail_2": "*", 26 "pos_detail_3": "*", 27 "conjugated_type": "*", 28 "conjugated_form": "*", 29 "basic_form": "山", 30 "reading": "ヤマ", 31 "pronunciation": "ヤマ" 32 } 33] 34`).map(function(e){ 35 if ( e.pos==="名詞" || e.pos==="副詞" ) return e.basic_form; 36 if ( ( e.pos==="形容詞" || e.pos==="動詞" ) && e.pos_detail_1 === "自立" && e.conjugated_form === "基本形" ) return e.basic_form; 37}) 38 39/* 40美しい,山 41*/

投稿2019/04/01 08:21

Lhankor_Mhy

総合スコア36074

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saikin

2019/04/02 01:33

ありがとうございます。ご回答の方法で大体できました。 あと配列の作り方についてですが、下記で最後の行の「console.log(result);」だと、「美しい、山、美しい、山」のように、配列の値が重複してしまうのですが、この場合ですとどうすればいいでしょうか? var result = []; window.tokenize = function(words){ kuromojiBuilder.then(function(tokenizer){ var token = tokenizer.tokenize(words) token.map(function(e){ if ( e.pos==="名詞" || e.pos==="副詞" ) { var word1 = e.basic_form; result.push(word1); } if ( ( e.pos==="形容詞" || e.pos==="動詞" ) && e.pos_detail_1 === "自立" && e.conjugated_form === "基本形" ) { var word2 = e.basic_form; result.push(word2); } }) console.log(result); // 「美しい、山、美しい、山」のように、配列の値が重複してしまう }) }
Lhankor_Mhy

2019/04/02 01:43

そのコードの前半部分は当方で再現できませんので、ご提示のJSONデータに差替えましたところ、「配列の値が重複してしまう」問題は再現しませんでした。 おそらく、ご提示のJSONデータと、質問者が見ているJSONデータに、相違があるのではないでしょうか。
saikin

2019/04/02 02:14 編集

たしかに、前半部分を「token」でなく「提示のJSONデータ」に差し替えますと重複は起こりませんでした。重複の原因は仰るように前半部分の「token」に問題があるようですね。 「token」データの再現はこちら(http://jsdo.it/59naga/kuromoji-js)でできます。 まずこちらに「美しい山」を入力すると「提示のJSONデータ」が出力されると思いますが、それが「token」の中身です。 そしてこちらのJavaScriptの18行目以降を先の返信に置き換えてみると、重複が発生してしまうのです。 もしお時間ございましたらご覧頂けますと幸いです。
Lhankor_Mhy

2019/04/02 02:30

そちらのHTMLに、 <input autofocus onKeyup="tokenize(event.target.value)"> とあります。 これは、押したキーが上がるたびに実行せよ、ということです。 なので、「美しい山」をショートカットでペーストすると、Ctrl と v と二つのキーの分の2回実行されますから、重複します。 (試しに手打ちしてみてください。もっと増えるはずです)
saikin

2019/04/02 03:01

何度もありがとうございます。 仰る「重複」は「配列が2回コンソールに出る」という意味ですよね。 つまりこのような。 Array [ "美しい", "山" ] Array [ "美しい", "山" ] これは問題ないです。入力時に都度判定したいので。 申し上げた「重複」は「配列の値が2つずつ出る」という意味です。 つまりこのような配列が出力されるということです。 Array [ "美しい", "山", "美しい", "山" ] この状態を質問に画像として補足致しましたので、もしよろしければご覧くださいませ。
Lhankor_Mhy

2019/04/02 03:04

> 仰る「重複」は「配列が2回コンソールに出る」という意味ですよね。 いいえ。 繰り返しになりますが、押したキーが上がるたびに実行されますから、その分だけ result.push() されますので、その分重複します。
Lhankor_Mhy

2019/04/02 03:07

私の回答のコードを採用していただければ、重複は起きないと思うのですが……
saikin

2019/04/02 03:11

重複処理は「コンソール表示処理」でなく「配列への追加処理(result.pushの処理)」でしたか。 ということは、「result.push」を「window.tokenize = function(words){}」の外に出せばいいということですね? でもその場合、pushすべきこれらの値 var word1 = e.basic_form; var word2 = e.basic_form; を、「window.tokenize = function(words){}」の外で取得することはできなくなりませんでしょうか??
saikin

2019/04/02 03:14 編集

>私の回答のコードを採用していただければ、重複は起きないと思うのですが…… ご回答のコードの採用させていただくにあたり、変更点は 「美しい山というJSON」.map(function(e){} を 「token」.map(function(e){} にしたところですが、 こう変更しないと動的に取得できず、いつも「美しい山というJSON」しか取得できないのではないかと考えたので。
Lhankor_Mhy

2019/04/02 03:27

まあ、回答を鵜呑みにされずに、試行錯誤をされるのはいいことだと思います。 > ということは、「result.push」を「window.tokenize = function(words){}」の外に出せばいいということですね? いいえ。 そうではなくて、result の結果が残っているので、次に実行されたときにそこに重ねて push() されているのです。
saikin

2019/04/02 03:45 編集

やっとわかりました。 var result = []; を window.tokenize = function(words){} の中に入れるんですね? このような初歩的な部分でお手を煩わせてしまい大変申し訳ございませんでした。 そして何度も、どうもありがとうございました。
Lhankor_Mhy

2019/04/02 03:49

ご解決されてなによりです。 ちなみに、 result = token.map(function(e){ if ( e.pos==="名詞" || e.pos==="副詞" ) return e.basic_form; if ( ( e.pos==="形容詞" || e.pos==="動詞" ) && e.pos_detail_1 === "自立" && e.conjugated_form === "基本形" ) return e.basic_form; }); でも同様の結果になると思います。参考までに。
saikin

2019/04/02 03:59 編集

だから「なんで回答したコード変えたんだ」と仰ったのですね…。とにかく「配列は最初に[]と書く」とか「配列の追加はpushする」という方法しか知らず、それに固執しておりました。失礼致しました。最後までありがとうございます。
guest

0

まずJSONはデータフォーマットであり条件を指定し抽出できる機能は備えていません。
ですのでご要望のJSONで特定の値の場合に取得するKeyを変えるということは不可能です。

その場合必要なものはJSなどプログラミングで取得したJSONを解析し変換する他ありません。
以下のようにJavaScriptで抽出処理を作らなければなりません。(サンプルなので期待どおりに動きませんが)

js

1window.tokenize= function(words){ 2 kuromojiBuilder.then(function(tokenizer){ 3 var output = []; 4 var token= tokenizer.tokenize(words); 5 console.log(token);//ブラウザでF12を押して出てくるデベロッパーツールのconsoleに出力される 6//ほしい情報を抽出する条件分岐 7 token.forEach(function(element) { 8 if(element['pos'] === '副詞'){ 9 output[] = element['basic_form']); 10 }else if(element['pos'] === '形容詞' || element['pos'] === '動詞'){ 11 output[] = element['pos_detail_1'] + ' ' + element['conjugated_form']; 12 } 13 }); 14//ここまで 15 // 現状はこうして【JSON】を出力しています 16 document.querySelector('pre').innerHTML= JSON.stringify(output,null,2); 17 }) 18} 19 20

JavaScriptの入門を読んで配列から目的のKeyを取得し別な配列を作れるよう学習する必要があります。

投稿2019/04/01 07:55

編集2019/04/01 07:57
namda

総合スコア705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saikin

2019/04/02 01:05

ありがとうございます。ご回答いただいたコードですが、 まずこちらのエラー↓でした。 SyntaxError: expected expression, got ')' たぶんこちらの行↓で、 output[] = element['basic_form']); 最後セミコロンの直前のかっこが不要ですよね。 (重箱の隅をつつくようで恐縮ですが、初学者ゆえ必要性について不満なので確認させてください。) そしてそれを削除しても、今度はこちらのエラー↓が出るようでした。 SyntaxError: expected expression, got ']' 何か修正点などございますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問