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

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

ただいまの
回答率

88.58%

Pythonのリストで品詞の条件指定をした上で指定位置に要素を追加するときのエラー

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 625

tenjin

score 274

 前提・実現したいこと

Pythonのリストで品詞の条件指定をした上で、指定位置に要素を追加しようとしています。

 発生している問題・エラーメッセージ

該当のソースコードでエラーが表示されないので

['skiing', 'man', 'hill']
#以下のようにしたい
['skiing', 'man', 'in', 'hill']

 該当のソースコード

import nltk
from nltk import data, pos_tag, word_tokenize
import collections
noun = ['NN', 'NNP', 'NNPS', 'NNS']
l =  ['skiing', 'man', 'hill']
i = ['in']
#配列の後ろから2文字目と1文字目が名詞ならその間に前置詞を入れる
if(pos_tag(l[-1]) in noun and pos_tag(l[-2]) in noun): 
    l.insert(-1, i[0]) 
print(l)

 試したこと

print(pos_tag(l[-1]))
[('h', 'NN'), ('i', 'NN'), ('l', 'VBP'), ('l', 'NN')]

このように出たのでpos_tagが問題だと考えられますが、

>>> text = word_tokenize("They refuse to permit us to obtain the refuse permit")
>>> nltk.pos_tag(text)
[('They', 'PRP'), ('refuse', 'VBP'), ('to', 'TO'), ('permit', 'VB'), ('us', 'PRP'),
('to', 'TO'), ('obtain', 'VB'), ('the', 'DT'), ('refuse', 'NN'), ('permit', 'NN')]


以外の方法で単語の品詞を出力する方法がわかりません。

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

python3.6

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

pos_tagの引数は「単語の文字列」ではなく「単語の文字列のlist」を渡す必要があります。

>>> from nltk import pos_tag
>>> pos_tag(['skiing', 'man', 'hill'])
[('skiing', 'VBG'), ('man', 'NN'), ('hill', 'NN')]

このように取得できますが、この時点でちゃんと単語と品詞のtupleが要素のlistになっているので、これを保存しておいて適宜処理すれば良いです。

動かしていませんが、こんな感じでできるでしょう。

# 中略
pos_data = pos_tag(l)

if pos_data[-1][1] in noun and pos_data[-2][1] in noun:
   l.insert()  # 略

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る