python 形態素解析について
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 669
表題の件で質問させてください。
あるテキストファイルを読み込んで、文単位で形態素解析を行い名詞だけ抽出し、基本形を文ごとのリストにしたいと考えています。
このようなテキストを形態素解析するとして
まず冒頭、天皇陛下の御公務の負担軽減等について申し上げます。現在、有識者会議で検討を進めており、近々論点整理が行われる予定です。
①以下のようなひとまとめのリストではなく
['冒頭', '天皇陛下', '公務', '負担', '軽減', '等', '現在', '有識者', '会議', '検討', '論点', '整理', '予定'
②このような文単位で形態素解析されたリストを作りたいです
[['冒頭', '天皇陛下', '公務', '負担', '軽減', '等'], ['現在', '有識者', '会議', '検討', '論点', '整理', '予定']
以下のコードを作成したのですが、このやり方では①のようになってしまいます
②のような形にするにはどのように処理を書くべきでしょうか?
初歩的な質問になりますがアドバイス宜しくお願い致します。
import re
import numpy as np
from collections import Counter
from janome.tokenizer import Tokenizer
import itertools
def readin(filename):
with open(filename, "r") as afile:
whole_str = afile.read()
sentenses = (re.sub('。', '。 \n', whole_str)).splitlines()
return [re.sub('','', u) for u in sentenses if len(u)!=0]
t = Tokenizer()
filename = (r'C:\Users\Desktop\abe-enzetsu-2017-01-20.txt')
string = readin(filename)
ret = []
for sentense in string:
sentense.splitlines() #1行に区切る(for sentense in stringで分離してるから要らない?)
for v in t.tokenize(sentense): #形態素解析する
if v.part_of_speech.split(',')[0] in ['名詞']: #名詞のみ抽出(なぜか引数なしsplit()では何も表示されない)
print(v.base_form) #確認
ret.append(v.base_form) #基本形でリストに格納
print(ret)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
あまりもとのコードに手を入れずに書くとこういう感じで期待した動作になりますか?
tmp_ret
という一時的なリストを用意しただけですが。
ret = []
for sentense in string:
sentense.splitlines() #1行に区切る(for sentense in stringで分離してるから要らない?)
tmp_ret = [] # 各センテンス用の一時的なリストを用意
for v in t.tokenize(sentense): #形態素解析する
if v.part_of_speech.split(',')[0] in ['名詞']: #名詞のみ抽出(なぜか引数なしsplit()では何も表示されない)
print(v.base_form) #確認
tmp_ret.append(v.base_form) #基本形で一時的なリストに格納
ret.append(tmp_ret) # メインのリストに追加
print(ret)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/06/14 14:23
返答遅くなってしまい申し訳ありません
頂いたコードで目標を達成することが出来ました
ありがとうございます