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

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

ただいまの
回答率

91.35%

  • Python 3.x

    2414questions

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

  • Ubuntu

    847questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

  • Mecab

    100questions

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

mecabでセリフのみを抽出したい

解決済

回答 1

投稿 2017/11/20 17:15

  • 評価
  • クリップ 1
  • VIEW 84

aoisj

score 16

やりたいこと

mecabを用いて入力したテキストファイルのセリフ部分(「」や『』で囲まれている部分)の
名詞(代名詞,非自立名詞,数,固有名詞を除く)を取り出して行列selsに格納したいのですが、
作成したコードを実行してみたところ、selsには何も格納されておらず、
何も出力されませんでした。
(使用するテキストファイルに問題はなく、形態素解析のみであれば正常に実行できます。)

ループ内の考え方としては

今見ている形態素が
if '「'または'『'だった場合
 flag1にする
 ループの始めに戻る
else if '」'または'』'だった場合
 flag0にする
 ループの始めに戻る
else if flag1 かつ 名詞だった場合
 if 名詞が代名詞,非自立名詞,数,固有名詞のいずれかの場合
   ループの始めに戻る 
 selsに形態素を追加する


といった感じです。
分かりにくかったらすみません。

以下に作成したコードを記します

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import MeCab

m = MeCab.Tagger ("-Ochasen")

doc = input('select file:')
f = open(doc, "r",encoding = "utf-8")
text = f.read()
f.close()

#文字列を改行位置で区切って分割する(形態素解析)
chunks = m.parse(text).splitlines()

sels = []

#絞り込み
#chunk:形態素解析結果(1行の文字列)
for chunk in chunks:
    #水平タブ(\t)で区切り、文字列リストを作成
    cols = chunk.split('\t')
    if len(cols) >= 4:
        #parts:品詞の種類
        parts = cols[3].split('-')
        if cols[2] == '「' or '『':
            flag = 1
            continue
        elif cols[2] == '」' or '』':
            flag = 0
            continue
        elif (flag == 1 and parts[0].startswith('名詞')):
            if parts[1] in ['代名詞','非自立','数','固有名詞']:
            continue
            #要素を追加
            sels.append(cols[2])

print('\n%s:絞り込み結果↓\n' %doc)
for sel in sels:
    print(sel)


selsに形態素が格納されない原因と解決策を教えていただきたいです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

まず提示ソースで発生していたインデントエラーを修正しました。
おおまかな処理の流れとしては問題ありませんが、以下を見直す必要があります。
直接の原因は2です。

  1. flagは利用前に初期化しましょう。
  2. if cols[2] == '「' or '『': ではなくif cols[2] == '「' or cols[2] == '『':としてください。意図とは異なる判定文になっています。
  3. continueは不要です。
# 以下はタブ区切りの文字列とする
chunks = """
今日    キョウ    今日    名詞-副詞可能
の        ノ        の        助詞-連体化
天気    テンキ    天気    名詞-一般
は        ハ        は        助詞-係助詞
「        「        「        記号-括弧開
晴れ    ハレ    晴れ    名詞-一般
」        」        」        記号-括弧閉
でし    デシ    です    助動詞    特殊・デス         連用形
た        タ        た        助動詞    特殊・タ 基本形
。        。        。        記号-句点
EOS
""".splitlines()

sels = []

#絞り込み
#chunk:形態素解析結果(1行の文字列)
flag = 0 # 1
for chunk in chunks:
    #水平タブ(\t)で区切り、文字列リストを作成
    cols = chunk.split('\t')
    if len(cols) >= 4:
        #parts:品詞の種類
        parts = cols[3].split('-')
        if cols[2] == '「' or cols[2] == '『':   # 2
            flag = 1
            #continue # 3
        elif cols[2] == '」' or cols[2] == '』': # 2
            flag = 0
            #continue # 3
        elif (flag == 1 and parts[0].startswith('名詞')):
            if parts[1] in ['代名詞','非自立','数','固有名詞']:
                continue
            #要素を追加
            sels.append(cols[2])

for sel in sels:
    print(sel)
# 晴れ

投稿 2017/11/20 18:00

編集 2017/11/20 18:01

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/20 19:11

    ありがとうございます。
    can110さんからいただいたアドバイスのおかげで
    解決できました。

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

  • 解決済

    Pythonで2重forループを抜ける方法

    Pythonで2重forループを抜ける際、以下のコードで抜けられるということは知っているのですが なぜこれで抜けられるのかがわかりません。 特に 5-7行目のelse ~ br

  • 受付中

    形態素解析の結果の一部のみを抽出したい

    前提・実現したいこと csvファイルにある文章をPythonを経由してMeCabで形態素解析をしています。  結果を出力する際、特定の品詞(名詞、形容詞、接続詞)と原形だけ

  • 解決済

    pythonでMecabを利用した語彙解析がうまくできない。

    ●環境 ・Windows Edition:Windows 7 Professional  Service Pack 1 ・pythonバージョン:Python 3.6.2 (v3.

  • 解決済

    mecab 品詞 選択

    やりたいこと 選択したテキストファイル内の文章をmecabを用いて形態素解析し、 品詞(名詞、動詞など)を絞り込みたいと考えています。 現在、テキストファイルの文章を形態素解析する

  • 解決済

    複数のテキストファイルをLDAモデルに

    やりたいこと 複数のテキストファイルを入力とし、指定したトピック数に分類するプログラムを作成したいと考えています。 現在、一つのテキストファイルをLDAモデルに投入するプログラムは

  • 解決済

    指定した言葉を排除したい

    やりたいこと テキストファイルからトピックモデルを作成するプログラムを実装中なのですが、コーパスを生成するのに用いる辞書に指示語(あれ、ここ、そちら)や、それ自体に重要な意味を持た

  • 解決済

    テキストに番号を付けて管理したい

    困っていること 入力したファイルのトピックを抽出するための前段階として 指定したディレクトリ内の.txtファイルを用いてLDAモデルを作成するプログラムを実装したのですが、 現在の

  • 受付中

    1つのファイルのトピックを調べたい(LDAモデル)

    質問 LDAモデルに詳しい方に質問です。 また、以下に記すプログラムで 複数の小説のテキストファイルからLDAモデルを作成したとき、その中に含まれる 1つの文書のトピックを参照

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

  • Python 3.x

    2414questions

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

  • Ubuntu

    847questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

  • Mecab

    100questions

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