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

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

ただいまの
回答率

87.36%

tuple型で格納しているためfind関数が使えない時の対処法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,811

score 20

 前提・実現したいこと

N-gramを自立語のみで取り出すプログラムを作っている時に以下のようなエラーが出ました. おそらく, tuple型のものに対しfind関数を適用できないというものなのですが, 方法が見つかりません. どのように対応したらいいでしょうか?

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

Traceback (most recent call last):
File "ngram.py", line 79, in <module>
main()
File "ngram.py", line 68, in main
bow = text2bow(argvs[2],mod="file")
File "ngram.py", line 20, in text2bow
if morp.find('名詞') > -1:
AttributeError: 'tuple' object has no attribute 'find'

 該当のソースコード

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Qiita: Pythonで単語N-gramを生成するモジュール <https://qiita.com/takumi_TKHS/items/942492b72aaf7b6a6213>

import sys
import subprocess as cmd

# テキスト -> 単語(形態素)集合
def text2bow(obj,mod):

    # input: ファイルの場合はmod="file", input: 文字列の場合はmod="str"
    if mod == "file":
        morp = cmd.getstatusoutput("cat " + obj + " | mecab -Owakati")
    elif mod == "str":
        morp = cmd.getstatusoutput("echo " + obj.encode('utf-8') + " | mecab -Owakati")
    else:
        print("error!!")
        sys.exit(0)

    if morp.find('名詞') > -1:
        a = morp
    elif morp.find('動詞') > -1:
        a = morp
    elif morp.find('形容詞') > -1:
        a = morp
    elif morp.find('形容動詞') > -1:
        a = morp
    else:
        pass
        sys.exit(0)

    words = a[1]
    words = words.replace('\n', '')

    bow = words.split(' ')

    return bow

# N-gramの生成
def gen_Ngram(words,N):

    ngram = []

    for i in range(len(words)):
        cw = ""

        if i >= N-1:
            for j in reversed(list(range(N))):
                cw += words[i-j]
        else:
            continue

        ngram.append(cw)

    return ngram

# 出力
def output_Ngram(ngram):

    for i in range(len(ngram)):
        print(ngram[i])

def main():

    argvs = sys.argv

    # input: ファイルの場合
    bow = text2bow(argvs[2],mod="file")

    # input: 文字列の場合
    #bow = text2bow(obj=u"これはN-gramを生成するプログラムです.",mod="str")

    ngram = gen_Ngram(bow,int(argvs[1]))

    output_Ngram(ngram)

if __name__ == "__main__":

    main()

 試したこと

GithubやStackoverflowで検索しましたが, いまいちわかりませんでした...

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

該当箇所はmorpの中にあるかどうかをみてる処理ですかね。
inを使うのはどうでしょう。

tup = ('t', 'e', 's', 't')
print('s' in tup) # True
print('r' in tup) # False

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/26 11:43

    '''
    def text2bow(obj,mod):

    # input: ファイルの場合はmod="file", input: 文字列の場合はmod="str"
    if mod == "file":
    morp = cmd.getstatusoutput("cat " + obj + " | mecab -Owakati")
    elif mod == "str":
    morp = cmd.getstatusoutput("echo " + obj.encode('utf-8') + " | mecab -Owakati")
    else:
    print("error!!")
    sys.exit(0)

    key = ('名詞', '動詞', '形容詞', '形容動詞')
    if morp in key:
    morp2 = morp

    words = morp2[1]
    words = words.replace('\n', '')

    bow = words.split(' ')

    return bow
    '''

    このように書き換えたところ

    File "ngram.py", line 33
    key = ('名詞', '動詞', '形容詞', '形容動詞')
    ^
    IndentationError: unexpected indent
    と言われました. どこのインデントがおかしいのでしょう?

    キャンセル

  • 2018/10/26 11:49

    33行目付近のインデントだとおもいますよ。
    PyCharmなどのIDEを使っているのであれば、コードのフォーマットしましょう。

    キャンセル

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

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

関連した質問

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