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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

1回答

1059閲覧

CaboChaで係り受け関係の単語とその品詞を取得したい

Kodanosuke

総合スコア42

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2019/09/21 07:33

前提・実現したいこと

CaboChaをつかって係り受け関係にある単語とその品詞を取得したいと思っています.
以下のコードを使って進めようと思っています.
このコードでは単語を取得できるのですが,その品詞をどのように取得したらよいかわかりません.
どなたかご教授いただけないでしょうか.

該当のソースコード

Python3

1import CaboCha 2 3c = CaboCha.Parser() 4 5sentence = "太郎はこの本を二郎を見た女性に渡した。" 6 7tree = c.parse(sentence) 8 9# 形態素を結合しつつ[{c:文節, to:係り先id}]の形に変換する 10chunks = [] 11text = "" 12toChunkId = -1 13for i in range(0, tree.size()): 14 token = tree.token(i) 15 text = token.surface if token.chunk else (text + token.surface) 16 toChunkId = token.chunk.link if token.chunk else toChunkId 17 # 文末かchunk内の最後の要素のタイミングで出力 18 if i == tree.size() - 1 or tree.token(i+1).chunk: 19 chunks.append({'c': text, 'to': toChunkId}) 20 21# 係り元→係り先の形式で出力する 22for chunk in chunks: 23 if chunk['to'] >= 0: 24 print(chunk['c'] + " → " + chunks[chunk['to']]['c'])

試したこと

token.featureで品詞などの情報がとれることはわかりました.
しかし,係り元と係り先の単語の区別をどうしたらいいかわかりません.

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

quickquip

2019/09/21 08:34

> 係り受け関係にある単語とその品詞を取得したいと思っています 係り受け関係は文節間につきます。 係り受け関係にあるのは「単語」ではない、という点で誤りがあるので、"品詞を取得したい"というのは無理です。 "実際にやりたいこと"に寄せた内容に書き換える方がいいと思いました。
Kodanosuke

2019/09/24 04:55

質問の内容が悪く誤解を招いたようで申し訳ありません. cabochaは中でmecabが動いており,文節内に含まれる単語もわかるようです. 文節同士の係り受け構造とともに,その文節内の単語も取得したかったのでこのような質問をしました.
quickquip

2019/09/24 05:15 編集

文節内の形態素の集合のすべての品詞を取りたい、というなら質問として納得できますが、あなたは自分で文節内の単語(形態素)を取り出してその表層を結合しています。
guest

回答1

0

ベストアンサー

token.surface に対応する品詞情報が token.feature です。
どちらも係り元の情報です。

投稿2019/09/21 08:09

segavvy

総合スコア958

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

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

Kodanosuke

2019/09/24 04:55

これのかかり先を取得しようとしたらどのようにしたらいいでしょうか?
segavvy

2019/09/24 08:48

例えば「太郎は」という文節がかかり元で、そのかかり先が「渡した」になりますよね。 この「太郎は」という文節は、「太郎」と「は」という2つの形態素から構成されています。そのため「太郎」や「は」単独では、かかり先の情報は得られないのです。 ご提示されているソースコードの「# 形態素を結合しつつ」というコメントは、この「太郎」と「は」を結合して文節にして処理していることを指しています。token.surfaceを結合してtextに代入されていますよね。この結合前にtoken.featureを取り出せば、個々の形態素の品詞が分かります。 かかり先も同様で、品詞を得るためには、かかり先の文節ではなく、その形態素ごとに確認する必要があります。 一度、コマンドプロンプトで −−−−−−−−−− cabocha -f1 太郎はこの本を二郎を見た女性に渡した。 −−−−−−−−−− を実行してみると良いかもしれません。 *で始まる行がCaboChaによるかかり元/かかり先の情報で、それ以外の行がMeCabによる解析結果です。*で始まる行とそれ以外の行が1対1ではないことがお分かりいただけるかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問