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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1934閲覧

rubyでmecab

kamatmt

総合スコア25

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2016/01/20 22:25

2つのファイル内には

今テレビで町田特集やってる!
【ひみつのアラシちゃん】
麺は微妙だがちゃあしゅう凄く美味しい理かもねー
スペインバル・ジローナ・虎ノ門ヒルズが取り上げられました

このような形でそれぞれ一文ずつ形態素解析し、単語ごとに配列にいれたいのですが、
これを実行すると

15: [BUG] Segmentation fault at 0x00000000000000
ruby 2.1.8p440 (2015-12-16 revision 53160) [amd64-freebsd10]

このようなエラーがでます。まったくわからないので困っています。
お願いします。

ruby

1#encoding: utf-8 2#形態素解析 3#名詞抽出 4 5require "MeCab" 6require "kconv" 7 8require "nkf" 9########### 10def hinsi(sentence) 11 mecab = MeCab::Tagger.new 12 node = mecab.parseToNode(sentence) 13 word = [] 14 begin 15 node = node.next 16 data="#{node.surface.toutf8},#{node.feature.toutf8}" 17 if data.split(",")[1].toutf8 == "名詞" then 18 if data.split(",")[2].toutf8 =~ /一般|固有名詞/ then 19 word.push("#{node.surface.toutf8}") 20 end 21 end 22 end until node.next.feature.include?("BOS/EOS") 23 24return word 25end 26############## 27#ファイル入力 28def read_data_file(filename) 29 sentence=[] 30 f=File.open("#{filename}","r:UTF-8") 31 f.each_line{|data| 32 sentence.push(data) 33 } 34k= sentence.length 35t=[] 36for j in 0..k-1 do 37 t[j]=NKF.nkf("-Xw",sentence[j]) 38end 39 40t.uniq! 41 42return t 43end 44 45#ファイル数 46si=[] 47 si[1]="r1.txt" 48chan=[] 49 chan[1]="r2.txt" 50 51############## 52 53 54cosr1=[] 55 56d1=[] 57d2=[] 58 59 d1 = read_data_file(si[1])#si[1]が1つのファイル内 60 d2= read_data_file(chan[1])#d1が全文章d1[]が一文 61 dlength=d1.length 62 for g in 0..dlength do 63 cosr1[g]=hinsi(d1[g]) 64 end 65 puts d1 66 puts cosr1,"\n" 67 68 69

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

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

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

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

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

guest

回答1

0

ベストアンサー

hinsi()メソッドを呼び出したときに引数sentenceがnilの場合があるようです。mecab.parseToNode(sentence)でsentenceがnilだと、parseToNodeがnilを想定していない(mecabライブラリでStringなのかチェックをしていない)ため、そのままCのライブラリにおかしな値を渡してしまい、Segmentation faultで落ちてしまうのだと思われます。

終わりの方のcosr1[g] = hinsi(d1[g])ところでd1[g]がnilならhinsiに渡さないようにすればうまくいくと思います。

【ワンポイントアドバイス】

ファイル名:行番号: [BUG] Segmentation fault at 十六進数

このエラーは本来Ruby上では発生するはずが無いエラーです。Pure Rubyの世界ではこのエラーは起こりえません。このエラーの原因となりえるのはRuby本体のバグか、Cで作られた拡張ライブラリのバグになります。Ruby本体のバグは滅多にありませんので、ほとんどの場合はCで作られた拡張ライブラリのバグです。

Cで作られた拡張ライブラリの中には、今回のmecabのように、引数がStringであるかのチェックをせずにStringだと前提としているような、チェックが甘いものがあります。Rubyは動的型付けですので、C言語上で処理する場合は、事前の型チェックが必須ですが、それを怠ると今回のようなことがおきます。推奨すべき実装としては、型チェックを行って、想定外の型であればRubyのエラーを起こすようにすべきでしょう。

ただ、作者にエラー報告しても、すぐに直るわけではありませんので、ある程度は自分のコードで回避する必要がある場合があります。

投稿2016/01/21 11:42

raccy

総合スコア21733

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問