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

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

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

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Q&A

解決済

2回答

3483閲覧

Rで、listのnames属性を取得したい

hacosato

総合スコア48

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

0グッド

0クリップ

投稿2018/06/17 03:21

編集2018/06/19 11:57

Rで、listのnames属性を取得して、あたらしいベクトルを作りたいです!

R

1library(RMeCab) 2 3(word <- RMeCabC("いつも答えてくれてありがとう")) 4

これをすると、

R

1[[1]] 2 副詞 3"いつも" 4 5[[2]] 6 動詞 7"答え" 8 9[[3]] 10助詞 11"て" 12 13[[4]] 14 動詞 15"くれ" 16 17[[5]] 18助詞 19"て" 20 21[[6]] 22 感動詞 23"ありがとう"

こういう結果が返ってきます(意図通り)。
これを使って、

R

1mylist <- c("いつも_副詞", "答え_動詞", "て_助詞", "くれ_動詞", "て_助詞", "ありがとう_感動詞")

となるようなベクトルを作りたいです(最終目標)。

names属性をlistで得られれば、あとはmylist <- paste(word, word.names, sep = "_")
みたいなやつをやればいいとおもうので、names属性を取得したいです。やりかたがわかりません…。

「names(word)」かとおもいましたが、NULLが返ってきてしまうのどうしてでしょうか…?

追加 2018/06/18 17:30

str(word)すると、以下のようになります。これはどのように読んだらよいものでしょうか…?

R

1List of 6 2 $ : Named chr "いつも" 3 ..- attr(*, "names")= chr "副詞" 4 $ : Named chr "答え" 5 ..- attr(*, "names")= chr "動詞" 6 $ : Named chr "て" 7 ..- attr(*, "names")= chr "助詞" 8 $ : Named chr "くれ" 9 ..- attr(*, "names")= chr "動詞" 10 $ : Named chr "て" 11 ..- attr(*, "names")= chr "助詞" 12 $ : Named chr "ありがとう" 13 ..- attr(*, "names")= chr "感動詞"

names(word[[1]])すると、以下のようになります。いい線いってると思うんですが…。

R

1[1] "副詞"

でもnames(word)するとNULLになってしまいます…。

追加 2018/06/19 20:50

R

1result <- list() 2for (i in 1:length(word)) { 3 (val <- names(word[[i]])) 4 result <- append(result, val) 5}

このようにして、品詞名のリストを手にすることができました!!
しかし、いまだに本質を理解することができていない気がします…。

R

1lapply(word, "[[", names)

こんな感じでapply使って、達成できそうだと思ったんですが…。

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

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

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

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

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

guest

回答2

0

ベストアンサー

RMeCabは持っていないので、マニュアルを通読したのみによる推測ですが、次のような形でできませんか?

word_unlist <- unlist(word) mylist <- paste(word_unlist, names(word_unlist), sep="_")

RMeCabCなるものがどんな構造のデータを返してくるかは、str(word)などとして眺めてみるといいと思います。

追加 2018/06/18 17:30をうけて追記

乗りかかった舟で、手元のcentOSにRMeCabをインストールして眺めてみました。「リストが入れ子」とした推測は事実ではありませんでした。しかし回答者さんの認識もおそらく正確ではありません。

多分回答者さんは、MeCabCが吐き出したlistであるwordの構造を次のようにとらえておられると思います。

リストの要素(単語)名前(品詞)
1いつも副詞
2答え動詞
3助詞
4くれ動詞
5助詞
6ありがとう感動詞

しかし正確には、次のようになっているのですね。

リストの要素
11番目の単語に対応する名前付きベクトル
22番目の単語に対応する名前付きベクトル
33番目の単語に対応する名前付きベクトル
......

ややこしいのですが、名前はwordを構成する6個の要素についているのではないのですね。

したがって、names(word)では品詞名は習得できません。しかし、names(word[[1]])とすれば副詞と返ってくるはずです。

ではここで、ちょっといたずらをしてみます。

names(word) <- c("fukushi", "doushi", "joshi", "doushi", "joshi", "kandoushi")

str(word)を見てみましょう。

List of 6 $ fukushi : Named chr "いつも" ..- attr(*, "names")= chr "副詞" $ doushi : Named chr "答え" ..- attr(*, "names")= chr "動詞" $ joshi : Named chr "て" ..- attr(*, "names")= chr "助詞" $ doushi : Named chr "くれ" ..- attr(*, "names")= chr "動詞" $ joshi : Named chr "て" ..- attr(*, "names")= chr "助詞" $ kandoushi: Named chr "ありがとう" ..- attr(*, "names")= chr "感動詞"

「リストの要素に名前がついている」のと「名前付きベクトルが要素になっている」の違いが分かるのではないでしょうか。

投稿2018/06/17 04:12

編集2018/06/18 16:35
KojiDoi

総合スコア13671

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

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

hacosato

2018/06/17 04:59

ありがとうございました! きちんと動きました。namesはlistでもベクトルでも効くという認識でしたが、どうしてlistだとうまくいかなくてベクトルにするとうまくいくのでしょうか…。
KojiDoi

2018/06/17 05:43

リストが入れ子になっていたりしませんか。str(word)で確認できると思いますが。
hacosato

2018/06/18 08:31

遅くなってしまいすみません。コメントありがとうございます。str(word)の結果を追記しました。names(word[[1]])の結果などからこれは入れ子ではないと思ったんですがそんなことないでしょうか…?
hacosato

2018/06/19 11:58

わざわざありがとうございます。 ヒントをご提示いただいたのだと認識しました???? “いたずら”の結果、namesがリストの要素そのものに対して付与されたのは理解できました! そしてそれは、わたしが手に入れようとしているのとは別物だということもわかりました。 しかし、names(word[[1]])なる操作で手に入るものがなんなのかまだわかりません…。 Pythonでいうところの内包表記みたいなことをすればうまくいきそうだと思ったので、 Rでならapplyを使って、unlistしなくともnamesが手に入る方法があると思ったのですが、 そんなことはないでしょうか…。 できの悪い生徒ですみません……。
KojiDoi

2018/06/19 18:22

word[[1]]で参照されるのは、リストの要素、つまりここでは「個々の名前付きベクトル」です。したがってnames(word[[1]])で名前付きベクトルの名前、すなわち品詞名が取得できます。 apply系関数は、リストの要素をひとつづつ取り出しては所定の関数に与える機能を持ちます。lapply(word, "[[", names)では、リストの要素についてさらに[[で要素を取り出す形になりますからダメです。 品詞をベクトルとして取り出したければsapply(word, names)で充分です。 ついでに最終目的までやってしまうなら、sapply(word, function(x){paste(x, names(x), sep="_")})でいいでしょう。
hacosato

2018/06/20 01:53

大変ありがとうございました…迷走したのに結果はシンプル…!! 「最終目的までやってしまうなら」は無名関数ですよね…自分で使いこなせるまでいってないのでお勉強します。 このたびは長らくお付き合いいただきほんとうにありがとうございました!
guest

0

得たい結果のかたちが

R

1> str(result) 2List of 6 3 $ : chr "副詞" 4 $ : chr "動詞" 5 $ : chr "助詞" 6 $ : chr "動詞" 7 $ : chr "助詞" 8 $ : chr "感動詞"

ということなら、以下でどうでしょうか。

R

1result <- unname(sapply(word, attributes))

投稿2018/06/19 17:05

fiwa

総合スコア1192

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

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

hacosato

2018/06/20 01:55

ありがとうございました! attributesっていうのもnamesみたいに使えるんですね???? 知らないことばかりで勉強になります。 apply関係、まだぜんぜん使いこなせないので、ごくカンタンなことしかできません。お勉強します。 向こうもこちらも、たくさんの質問にお付き合いいただきありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問