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

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

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

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

Mecab

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

1回答

658閲覧

tf, dfが上手く表示されない

farinelli

総合スコア61

Python 3.x

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

Mecab

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2019/10/30 03:21

編集2019/11/12 15:40

テキストファイルから特定の文字列を除去した後,形態素解析によりストップワードを含まない2文字以上の名詞の単語を抽出し.それらのtf, df, idfを表示したいと考えています.
(Tf-idfVectorizerを使わないものとします)

プログラムを組んでみたのですが,
・tfが全て0と表示される
・dfが全て1と表示される

という問題が生じています.

この件に関しまして,解決策がご存知の方に是非ご教示頂きたいです.
宜しくお願いします.

###コード中の"#写真参照"の箇所の一部
イメージ説明

テキスト

protein.txt

1全ゲノム配列決定が容易になった結果,多くの新規遺伝子(タンパク質)の存在や機能を配列情報から予測することはかなり容易になった. 2とはいえ,どの生物種でも全遺伝子の1/3~1/2はその配列からだけでは機能を予測できない「機能未知タンパク質」をコードしている. 3生命現象の全体像を分子レベルから理解するためには,それら機能未知タンパク質の機能の解明も必要である. 4又,タンパク質配列のうち全くもって未知なものもあれば,多くの種で保存されている既知の機能部位を持つものもある. 5更に,タンパク質が持つ活性(分子機能)と細胞における働き(細胞内機能)は往々にして別の文脈で語られることが多く,これらを実験的に検証する系は未だ存在しない. 6本研究では,モデル生物である出芽酵母を用いて,関心のある機能未知タンパク質の機能部位の同定と機能解析をランダム変異導入法を用いて,安価かつ簡素に行う系を確立することを目的とする.

現状

tfs: [{'ゲノム': 0}, {'配列': 0}, {'決定': 0}, {'容易': 0}, {'結果': 0}, {'多く': 0}, {'新規': 0}, {'遺伝子': 0}, {'タンパク質': 0}, {'存在': 0}, {'機能': 0}, {'情報': 0}, {'予測': 0}, {'こと': 0}, {'とはいえ': 0}, {'生物': 0}, {'未知': 0}, {'コード': 0}, {'生命': 0}, {'現象': 0}, {'全体像': 0}, {'分子レベル': 0}, {'理解': 0}, {'ため': 0}, {'それら': 0}, {'解明': 0}, {'必要': 0}, {'うち': 0}, {'全く': 0}, {'もの': 0}, {'保存': 0}, {'既知': 0}, {'部位': 0}, {'活性': 0}, {'分子': 0}, {'細胞': 0}, {'働き': 0}, {'文脈': 0}, {'これら': 0}, {'実験': 0}, {'検証': 0}, {'研究': 0}, {'モデル生物': 0}, {'出芽': 0}, {'酵母': 0}, {'関心': 0}, {'同定': 0}, {'解析': 0}, {'ランダム': 0}, {'変異導入': 0}, {'安価': 0}, {'簡素': 0}, {'確立': 0}, {'目的': 0}] dfs: {'ゲノム': 1, '配列': 1, '決定': 1, '容易': 1, '結果': 1, '多く': 1, '新規': 1, '遺伝子': 1, 'タンパク質': 1, '存在': 1, '機能': 1, '情報': 1, '予測': 1, 'こと': 1, 'とはいえ': 1, '生物': 1, '未知': 1, 'コード': 1, '生命': 1, '現象': 1, '全体像': 1, '分子レベル': 1, '理解': 1, 'ため': 1, 'それら': 1, '解明': 1, '必要': 1, 'うち': 1, '全く': 1, 'もの': 1, '保存': 1, '既知': 1, '部位': 1, '活性': 1, '分子': 1, '細胞': 1, '働き': 1, '文脈': 1, 'これら': 1, '実験': 1, '検証': 1, '研究': 1, 'モデル生物': 1, '出芽': 1, '酵母': 1, '関心': 1, '同定': 1, '解析': 1, 'ランダム': 1, '変異導入': 1, '安価': 1, '簡素': 1, '確立': 1, '目的': 1}

理想の出力結果

tfs: {'ゲノム': oo, '配列': oo, '決定': oo, '容易': oo, …} dfs: {'ゲノム': oo, '配列': oo, '決定': oo, '容易': oo, …} #ooには任意の数字が入る

コード

renshu.py

1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3import redis 4import MeCab 5import codecs 6import re 7import numpy as np 8import collections 9 10# mecabを用いて単語を分割 11def mecab_analysis(text): 12 mecab = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') 13 mecab.parse('') 14 node = mecab.parseToNode(text) 15 output = [] 16 while node: 17 if node.surface != "": # ヘッダとフッタを除外 18 word_type = node.feature.split(",")[0] 19 if word_type in ["名詞"]: 20 output.append(node.surface) 21 node = node.next 22 if node is None: 23 break 24 return output 25 26# 特定の単語(引数:word)の出現回数を数える関数 27def count_words(word): 28 text = str(open("./protein.txt","r",encoding="utf-8").read()) 29 words = mecab_analysis(text) 30 return collections.Counter(words)[word] 31 32#総文書数を数える 33with codecs.open("./protein.txt", "r", "utf-8") as f: 34 corpus = f.read() 35N = sum(1 for line in open("./protein.txt")) 36 37mecab = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') 38mecab.parse('') 39m = mecab.parseToNode(corpus) 40 41#除外したい単語リスト 42rm_list = ["RT","https","co","さん","フォロー","本日","応募","今日","プレゼント","お金","FGO","無料","本人","投稿","動画","ツイート","リツイート","Twitter","ローソン","Peing","http","Amazonギフト券","bot","発売中","Youtube","www","WWW","質問箱","コラボ","フォロワー","DM","いいね","RT","lawson","://","!","peing","youtube","抽選","jp","リプ","キャンペーン","チケット","期間限定","DHC","日本","amp","人間","チャンネル","配信中","YouTube","WEB","楽しみ","イラスト","くじ","@","__"] 43 44#ストップワード 45stop_words = [] 46path = './stop_words.txt' 47with open(path) as g: 48 stop_words = g.readlines() 49 50#url, 返信, RT, 絵文字の除去 51corpus = re.sub(r"http\S+", "", corpus) 52corpus = re.sub(r"@(\w+) ", "", corpus) 53corpus = re.sub(r"(^RT.*)", "", corpus, flags=re.MULTILINE | re.DOTALL) 54emoji_pattern = re.compile("[" 55u"\U0001F600-\U0001F64F" 56u"\U0001F300-\U0001F5FF" 57u"\U0001F680-\U0001F6FF" 58u"\U0001F1E0-\U0001F1FF" 59"]+", flags=re.UNICODE) 60corpus = emoji_pattern.sub("", corpus) 61 62keywords = [] 63#単語のスクリーニング 64while m: 65 if m.feature.split(',')[0] == '名詞': 66 if m.surface not in rm_list: 67 if len(m.surface) >= 2: 68 keywords.append(m.surface) 69 #r.zincrby('words', 1.0, m.surface) 70 m = m.next 71 72#keywords = set(keywords) 73#print(keywords) 74#名詞の重複を消す 75nouns = [] 76for line in keywords: 77 if line not in nouns: 78 nouns.append(line) 79#print(nouns) 80 81#tf, idfの計算 82tfs = [] # 記事毎のリスト。リスト要素は記事内の単語毎のtf値 83dfs = {} # 単語毎のdf値 84for idx,doc in enumerate(nouns): 85 86 tf = {} 87 # docの出現回数 88 doc_count = count_words(doc) 89 90 if doc not in tfs: 91 tf[doc] = 0 92 else: 93 tf[doc] += 1/doc_count 94 95 # 単語毎のdf値 96 if doc not in dfs: 97 dfs[doc] = set() 98 dfs[doc].add(idx) 99 100 tfs.append(tf) 101 print(tfs)#写真参照 102 103#記事番号の集合の大きさ=出現数 104for term,doc_set in dfs.items(): 105 dfs[term] = len(doc_set) 106 107 #idfs = {k:np.log(1/v) + 1 for k, v in dfs.items()} #問題の箇所 108 109#print('nouns:',nouns) 110#print('tfs:',tfs) 111#print('dfs:',dfs) 112#print('idfs:',idfs)

補足情報(FW/ツールのバージョンなど)

iOS 10.15, Python 3.7.4, Atom

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

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

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

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

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

t_obara

2019/10/30 05:34

tfs.append(tf) この行のインデントは合っていますか?
farinelli

2019/10/30 05:39

訂正しました.失礼致しました.
t_obara

2019/10/30 05:53

if doc not in tf: はtfではなくtfsでは?
farinelli

2019/10/30 05:57

度々すみません.訂正しました.(結果は変わりませんでした)
t_obara

2019/10/30 06:09

細かな点で問題が色々ありそうなので、ちょっとずつ変数などが期待通りの結果を返しているのか、期待通り格納されているのかなどをprint文を適宜挿入して確認してみては? tfs.append(tf) だと、同じdocでも追加されるのですよね?
farinelli

2019/10/30 07:19

こちらの理解不足で恐縮ですが,同じdocというのは何を指してますでしょうか?
t_obara

2019/10/30 09:53

docの内容が同じ名前、例えば「タンパク質」だった場合です。
farinelli

2019/11/12 15:37

PC破損により返信が遅れてしまい申し訳ございません. docは追加されています.質問文を書き換えましたのでご確認ください.
t_obara

2019/11/13 01:09

同じdocの場合、カウントされるべきで、追加されてはいけないのでは?
guest

回答1

0

全体的にぐちゃぐちゃなので、どういうロジックで書けば意図通り動くのかをまずはよく考えてください。

一回ちゃんと擬似コードを書くと良いですよ。

投稿2019/11/12 16:10

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問