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

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

ただいまの
回答率

90.76%

  • Python 3.x

    5346questions

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

ある関数をfor文の中に組み込んで求める形式で出力したい

解決済

回答 1

投稿 編集

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

James1201

score 7

①
word2id = collections.defaultdict(lambda: len(word2id) )
sentence = rl

def convert_word(sentence):
    return [word2id[word.lower()] for word in sentence.split()]

print(sentence)
print(*convert_word(sentence) )
print(dict(word2id) )


②
bindata = open("test.txt").read()
text = bindata

t = Tokenizer(mmap=True)
results = []

lines = text.split("\r\n")
for line in tqdm(lines):
    s = line
    s = s.replace("|", "")
    s = re.sub(r"《#.+?》", "", s)
    s = re.sub(r"[#.+?]", "", s)
    tokens = t.tokenize(s)
    # 必要な語句だけを対象とする - 5
    r = []
    for tok in tqdm(tokens):
        if tok.base_form == "*":
            w = tok.surface
        else:
            w = tok.base_form
        ps = tok.part_of_speech
        hinsi = ps.split(",")[0]
        if hinsi in ["名詞", "形容詞", "副詞", "動詞", "記号"]:
            r.append(w)
    rl = (" ".join(r)).strip()
    results.append(rl)
    print(rl)


の中に組み込んで

[アンパンマン 、 側近 バノン 氏 解任   政権 屋台骨 揺らぐ]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[ドナルド・トランプ 、 側近 バノン 氏 解任   政権 屋台骨 揺らぐ]
[9, 1, 2, 3, 4, 5, 6, 7, 8]

{'アンパンマン': 0, '、': 1, '側近': 2, 'バノン': 3, '氏': 4, '解任': 5, '政権': 6, '屋台骨': 7, '揺らぐ': 8, 'ドナルド・トランプ': 9}


のように、

1文
1ベクトル
1文
1ベクトル
ラベルの説明

で出力したいのですが、別々で実行するとどうしても

アンパンマン 、 側近 バノン 氏 解任   政権 屋台骨 揺らぐ 
 ドナルド・トランプ 、 側近 バノン 氏 解任   政権 屋台骨 揺らぐ
0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8
{'アンパンマン': 0, '、': 1, '側近': 2, 'バノン': 3, '氏': 4, '解任': 5, '政権': 6, '屋台骨': 7, '揺らぐ': 8, 'ドナルド・トランプ': 9}


のように1文の後にベクトルが来ず、さらにベクトルが1行に連なって出力されてしまいます。

求める出力

[アンパンマン 、 側近 バノン 氏 解任   政権 屋台骨 揺らぐ]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[ドナルド・トランプ 、 側近 バノン 氏 解任   政権 屋台骨 揺らぐ]
[9, 1, 2, 3, 4, 5, 6, 7, 8]

{'アンパンマン': 0, '、': 1, '側近': 2, 'バノン': 3, '氏': 4, '解任': 5, '政権': 6, '屋台骨': 7, '揺らぐ': 8, 'ドナルド・トランプ': 9}


にするにはどのように②の中に①の何をどのようにを挿入すれば良いのでしょうか...、どなたかご教授お願い致します。

こちらが読み込むテキストになります

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • LouiS0616

    2018/05/01 21:46

    ①②の順で並べても、②①の順で並べても上手く動作しないようですが、どのように『別々に実行した』のでしょうか。

    キャンセル

  • James1201

    2018/05/01 22:10

    申し訳ありません。②の中の print(*convert_word(sentence) )が余計でした。これでうまく作動するかと思います。ちなみに自分は②、①の順に動かしています。

    キャンセル

回答 1

checkベストアンサー

+1

自然言語処理は門外漢なのですが、とりあえずご所望の処理は次のように書けそうです。

for s in sentence.split('\n'):
    print(s)
    print(*convert_word(s))

print(dict(word2id))

実行結果

アンパン マン 、 側近 バノン 氏 解任   政権 屋台骨 揺らぐ
0 1 2 3 4 5 6 7 8 9
 トランプ 大統領 、 側近 バノン 氏 解任   政権 屋台骨 揺らぐ
10 11 2 3 4 5 6 7 8 9
{'アンパン': 0, 'マン': 1, '、': 2, '側近': 3, 'バノン': 4, '氏': 5, '解任': 6, '政権': 7, '屋台骨': 8, '揺らぐ': 9, 'トランプ': 10, '大統領': 11}

なお

ファイルを読み込む際に、前以て行毎のリストになるようにすれば、後々楽かと思います。

text = [line.strip() for line in open('test.txt').readlines()]

コメントを受けて

標準出力をテキストファイルに持っていく方法は、主に二つあります。

  • リダイレクトを利用する方法
    コマンドラインから呼び出している場合に有効。> 出力先.txtで流し込める。
$python モジュール名.py > result.txt
  • 標準出力を切り替える方法
    モジュールの冒頭で、標準出力をファイルストリームに切り替える方法。
    なお、元に戻したい場合はsys.stdout = sys.__stdout__でok。
import sys
sys.stdout = open('result.txt', 'w')

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/05 14:25

    お返事遅くなってすみません、有難うございます!
    ちなみに、この出力をcsvに書き出すにはどうしたら良いでしょうか...!
    一通り調べてみたのですが、いまいち見当たらなかったのでお尋ねしたいです...!

    キャンセル

  • 2018/05/05 14:40

    文字列の行でしょうか?数値化した行でしょうか?最後の辞書でしょうか?

    キャンセル

  • 2018/05/05 14:46

    とりあえず、出力通りに、

    文字列の行
    数値化した行
    文字列の行
    数値化した行

    最後の辞書

    のように書き出したいです!

    キャンセル

  • 2018/05/05 14:48

    csvじゃなくてtxtファイルだったらものすごく楽なんですけど、アリでしょうか?

    キャンセル

  • 2018/05/05 14:50

    でしたら、とりあえずtxtで大丈夫です!

    キャンセル

  • 2018/05/05 15:11

    有難うございます!
    勉強にもなり、本当に助かりました!

    キャンセル

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

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

関連した質問

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

  • Python 3.x

    5346questions

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