🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Mecab

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

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

Q&A

解決済

1回答

2135閲覧

【Python】dict型で取り込んだ少数の値を取り出したい

nabe0723

総合スコア4

Python 3.x

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

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Mecab

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

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

0グッド

0クリップ

投稿2019/09/16 09:22

編集2019/09/16 10:22

前提・実現したいこと

MeCabを使用した自然言語処理を行おうとしております。
Twitterから取得したテキストデータをMeCabにて単語ごと区切り、
元から保存している(辞書+極性値)テキストと合致する単語の極性値を取得します。
最終的に、tweetごとにどの程度極性値を持っているのかテキストに保存させたいと思っております。

発生している問題・エラーメッセージ

現在発生している問題が、dict型で取り込んだ(辞書+極性値)テキストが、tweet文章と合致するか条件分岐処理を行ったときに極性値をうまく取り出せていない問題が発生しております。
※(辞書+極性値)テキストは、単語ごとに1.0~-1.0の値を持っており、現在処理を行うと取り出す値がすべて-1.0のなってしまう問題(数値が丸められてしまっている?)が発生しております。

# -*- coding: utf-8 -*- #MeCabをimport import MeCab #アウトプット設定 outputfile = open('test-kekka.txt', 'w', encoding ='utf-8') #ツイートテキストを読み込み tweetfile = open('negaposit.txt', encoding = 'utf-8') #negaposi辞書を読み込み nega_posi = open('negaposi.txt', encoding = 'utf-8') #Mecabの辞書設定 tagger = MeCab.Tagger("-Ochasen") tagger.parse("") dic = {} result = "test" score = 0 goal = {} base_form = "a" base_value = 0 #行ごとに辞書の読み込み⇒検索とdicに保存 for line in nega_posi: line = line.rstrip() columns = line.split(':') base_form = columns[0] base_value = float(columns[3])*10000 dic[base_form] = str(base_value) #print(dic) for line in tweetfile: line = line.rstrip() node = tagger.parseToNode(line) while node is not None: #品詞情報取得 #Node.featureのフォーマット:品詞、品詞細分類1、品詞細分類2、品詞細分類3、活用形、原形、読み、発音 hinsi = node.feature.split(",")[0] if hinsi in["名詞"]: result = node.surface #print(result) elif hinsi in["動詞","形容詞"]: result = node.feature.split(",")[6] #print(result) else: result = "" if result in dic: print(result) score += float(dic[base_form]) else: score += 0 node = node.next goal[line] = score score = 0 #出力 for word in goal: print(word +'\t'+str(goal[word]), file = outputfile) ```Python3.x

試したこと

少数以下が丸められてしまっていると思っておりますので、
取り出した値をfloat型に変更したりは試しております。

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

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

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

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

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

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

quickquip

2019/09/16 10:02

ソースが読めなくなっているので編集しましょう
nabe0723

2019/09/16 10:24

ご指摘ありがとうございます。 先ほど修正致しました。 また不具合があればご連絡頂けると幸いです。
meg_

2019/09/16 11:55

「tweet文章と合致するか条件分岐処理を行ったときに極性値をうまく取り出せていない」箇所は上記コードのどこになりますか?
nabe0723

2019/09/16 12:29 編集

ご質問ありがとうございます。 下記箇所になります。 for line in nega_posi: line = line.rstrip() columns = line.split(':') base_form = columns[0] base_value = float(columns[3])*10000 dic[base_form] = str(base_value) #print(dic) ・ ・ ・ ・ if result in dic: print(result) score += float(dic[base_form]) else: score += 0 ⇒上記箇所にてtweet文章に含まれる単語がdic内に存在するか判断し、合致していた場合に、極性値を加算する形となります。 ※現状、dicに不具合があるのか確認しましたが、問題なかったので、上記のコードにてdicから値を取り出すときに不具合が発生しているのではないか思っております。
meg_

2019/09/16 12:37

if result in dic: で条件分岐しているのに、「float(dic[base_form])」となるのでしょうか? dic[result]ではないのですか?
nabe0723

2019/09/16 13:02

ご指摘ありがとうございます。 何回か回収を行っているうちに修正できていなかったことが問題でした。 初歩的なミスで大変申し訳ございません。 大変助かりました、ありがとうございます。
siruku6

2019/09/26 13:42

もし解決済みであれば、自信の解決方法を回答欄に記載して解決済みにしておきましょう
guest

回答1

0

自己解決

回答が遅くなりました。
本件、下記コードで解決致しました。
お手数をおかけし、申し訳ございません。

#MeCabをimport
import MeCab

#アウトプット設定
outputfile = open('test-kekka.txt', 'w', encoding ='utf-8')

#ツイートテキストを読み込み
tweetfile = open('negaposit.txt', encoding = 'utf-8')

#negaposi辞書を読み込み
nega_posi = open('negaposi.txt', encoding = 'utf-8')

#Mecabの辞書設定
tagger = MeCab.Tagger("-Ochasen")
tagger.parse("")

dic = {}
result = "test"
score = 0
goal = {}
base_form = "a"
base_value = 0

#行ごとに辞書の読み込み⇒検索とdicに保存
for line in nega_posi:
line = line.rstrip()
columns = line.split(':')
base_form = columns[0]
base_value = float(columns[3])*10000
dic[base_form] = str(base_value)

#print(dic)

for line in tweetfile:

line = line.rstrip()
node = tagger.parseToNode(line)

while node is not None:
#品詞情報取得
#Node.featureのフォーマット:品詞、品詞細分類1、品詞細分類2、品詞細分類3、活用形、原形、読み、発音
hinsi = node.feature.split(",")[0]
if hinsi in["名詞"]:
result = node.surface
#print(result)
elif hinsi in["動詞","形容詞"]:
result = node.feature.split(",")[6]
#print(result)
else:
result = ""

if result in dic: print(result) score += float(dic[result]) else: score += 0 node = node.next

goal[line] = score
score = 0

#出力
for word in goal:

print(word +'\t'+str(goal[word]), file = outputfile)

投稿2019/11/03 05:32

nabe0723

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問