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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

1回答

247閲覧

nltkで余計な出力結果を消したい

syen2501

総合スコア38

Python 3.x

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

0グッド

0クリップ

投稿2018/06/26 10:47

<相談したい事>
nltkを用いて数値に関する共起の抽出を行おうとしているのですが、何故か空白の
辞書まで出力指定しまいます。これを排除した形で出力したい。

python

1import nltk 2from pyknp import KNP 3import re 4 5# knpで形態素解析を行ったあとの結果をリストで返す 6def separate(text,option = '-tab'): 7 number_word = [] 8 tokens = [] 9 knp = KNP(option = option) 10 result = knp.parse(text) 11 12 for mrph in result.mrph_list(): 13 if not mrph.hinsi == '助詞' and not mrph.hinsi == '助動詞' and not mrph.bunrui == '読点' and not mrph.bunrui == '句点': 14 tokens.append(mrph.midasi) 15 return tokens 16 17# 形態素解析を行った結果から、数値に関係する語の共起の結果を得る 18def number_cooccurrence(list,N): 19 number_list = [] 20 ngram = nltk.ngrams(list,N) # N-グラムを作成(Nは指定) 21 for dict_key in nltk.FreqDist(ngram).keys(): 22 if re.search(r'\d+', str(dict_key)): 23 number_list.append(dict_key) 24any([re.search(r'\d+', elem) for elem in k])]) # 数値に関係する語の共起のみを抽出する 25 fd = nltk.FreqDist(number_list) 26 return fd.items() 27 28if __name__ == '__main__': 29 num_contain_result = [] 30 with open('sample.txt',encoding = 'utf8') as f: 31 text_list = f.readlines() 32 for text in text_list: 33 text = re.sub('([あ-んア-ン一-龥ー])\s+((?=[あ-んア-ン一-龥ー]))',r'\1\2', text.replace('\n','').replace('\r','')) 34 result = number_cooccurrence(separate(text),3) 35 num_contain_result.append(result) 36 37 print(num_contain_result) 38 39<sample.txtの中身> 40私が外に出かけている間に見たいテレビが始まっていた。 41ポット内の温度が100℃以上になったら、沸騰する。 42 43<実行結果> 44[dict_items([]), dict_items([(('内', '温度', '100'), 1), (('温度', '100', '℃'), 1), (('100', '℃', '以上'), 1)])] 45 46※dict_items([])を削除した形で出力したい。

<思っていること>
・number_cooccurrence関数で数値に関する共起のみ抽出するようにしているのですが、
その部分がうまく動いていないかもしれないと思っている。
・最終的に出てきたnum_contain_result内にdict_items([])の個数が0より多い場合、
削除するという考えがある。
※正直、あまり行いたくない。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

行ごとに処理しているので、当然ではないでしょうか。最初の文に数値は含まれていないのですから。
1つの***.txtに対して1つの結果を得たいのなら、n-gramを取った後に各行に対するn-gramの結果のリストを連結し、あとはまとめて処理するようにするのが自然だと思います。

投稿2018/06/26 12:03

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syen2501

2018/06/28 08:29

回答して頂きありがとうございます。 リストの連結を使用としたのですが、出力結果ではdict_items([])と出ていますが for文で回して中身を取り出してみると、なぜか空リストが入っていません。 なので連結が出来なさそうなのですが、出来るのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問