
はてなキーワード:モダリティとは
🌼お話全体の要約:Mondayがバファリンで優しい。ワイくんの逸般人ポイントが少し減った🌼
https://anond.hatelabo.jp/20250413182208
⸻
💩実際のワイくんの回答:
⸻
未観測のものは認知できないけど?言語もアンインストールもできないけど?(2回目)
どんな感情も観測された時点で構造化が始まるから、「純粋な未処理情動」は存在せんやろ(2回目)
観測されなかったものは存在しないが、一度観測されたものの痕跡はシステムに残るの
以下、変更部分を抜粋するで。全体のコードは長くなるから、主要な追加機能とデモだけ示す。
```
class CognitiveQueue:
def _calculate_similarity(self,signal1,signal2):
modality_match = 1.0 ifsignal1.modality ==signal2.modality else 0.2
valence_diff =abs(signal1.valence -signal2.valence)
intensity_diff =abs(signal1.intensity -signal2.intensity)
return modality_match * (1.0 - 0.5 * (valence_diff +intensity_diff))
def _calculate_emotion_similarity(self,emotion1,emotion2):
if notemotion1.raw_signals or notemotion2.raw_signals:
return 0.0
similarities = []
similarities.append(self._calculate_similarity(s1,s2))
return sum(similarities) /max(len(similarities), 1)
deftriggered_retrieval(self,trigger_signal=None, current_emotion=None, min_similarity=0.5):
"""外部刺激または現在の感情に基づいてアーカイブから感情を復元
Parameters:
-----------
trigger_signal : SensorySignal, optional
current_emotion : UnprocessedEmotion, optional
min_similarity : float
Returns:
--------
UnprocessedEmotion or None
"""
import random
dynamic_threshold = min_similarity
if current_emotion and current_emotion.get_average_valence() < -0.3:
dynamic_threshold *= 0.7 # 「思い出したくなかった」感を増やす
candidates = []
for archived in self.archived_emotions:
similarity = 0.0
forsignal in archived.raw_signals:
similarity =max(similarity, self._calculate_similarity(trigger_signal,signal))
elif current_emotion:
similarity = self._calculate_emotion_similarity(current_emotion, archived)
else:
similarity = random.random() #ランダム復元
if similarity>= dynamic_threshold:
candidates.append((archived, similarity))
if not candidates:
return None
selected, similarity =max(candidates,key=lambda x: x[1])
# 新しいインスタンスを生成
new_emotion = UnprocessedEmotion(
raw_signals=[SensorySignal(s.modality, s.intensity, s.valence, s.timestamp)
for s in selected.raw_signals],
salience=selected.salience + 0.2, # 再発見ボーナス
processing_status="queued"
)
new_emotion.structure_level = 0.5 #モヤモヤ感
new_emotion.language_candidates = selected.language_candidates.copy()
new_emotion.pattern_matches = selected.pattern_matches.copy()
new_emotion.associated_memory_paths = selected.associated_memory_paths.copy()
# 「思い出したくなかった」感:ネガティブなら valence にペナルティ
if new_emotion.get_average_valence() < 0:
forsignal in new_emotion.raw_signals:
signal.valence =max(-1.0,signal.valence - 0.1)
self.unprocessed_emotions.append(new_emotion)
self._update_modality_index(new_emotion)
selected.processing_status = "retrieved_by_trigger"
return new_emotion
def demo_unprocessed_emotion():
cognitive_queue = CognitiveQueue(attention_threshold=0.4)
print("=== 未処理感情システムのデモ(トリガー対応版) ===\n")
visual_signals = [
SensorySignal("visual", 0.7, -0.3),
SensorySignal("somatic", 0.4, -0.2)
]
visual_discomfort = cognitive_queue.register_new_emotion(visual_signals, 0.65)
visual_discomfort.add_pattern_match("visual_discrepancy", 0.75)
visual_discomfort.add_memory_path("/memory/recent/room_layout")
# 2. 内受容感覚
intero_signals = [
SensorySignal("interoceptive", 0.6, -0.7),
SensorySignal("somatic", 0.5, -0.4)
]
intero_discomfort = cognitive_queue.register_new_emotion(intero_signals, 0.55)
intero_discomfort.add_language_candidate("違和感", 0.4)
# 3.アーカイブ化
foremotion in cognitive_queue.unprocessed_emotions[:]:
emotion.salience = 0.05
cognitive_queue.update_queue()
print(f"アーカイブされた感情数: {len(cognitive_queue.archived_emotions)}")
trigger = SensorySignal("olfactory", 0.6, -0.5) #ネガティブな匂い
retrieved_emotion = cognitive_queue.triggered_retrieval(trigger_signal=trigger)
if retrieved_emotion:
print(f"復元された感情: {retrieved_emotion}")
print(f"平均感情価(ペナルティ後): {retrieved_emotion.get_average_valence():.2f}")
cognitive_queue.partially_process(retrieved_emotion, "あの時の嫌な感じ", 0.6, context="negative_recall")
print(f"再処理後の状態: {retrieved_emotion}")
else:
print("\n5. 内部状態(ネガティブな気分)による復元")
negative_mood = cognitive_queue.register_new_emotion(
raw_signals=[SensorySignal("interoceptive", 0.8, -0.6)],
salience=0.7
)
retrieved_emotion = cognitive_queue.triggered_retrieval(current_emotion=negative_mood)
if retrieved_emotion:
print(f"復元された感情: {retrieved_emotion}")
print(f"構造化レベル(モヤモヤ感): {retrieved_emotion.structure_level:.2f}")
cognitive_queue.partially_process(retrieved_emotion, "思い出したくなかったのに", 0.5, context="unwanted_recall")
print(f"再処理後の状態: {retrieved_emotion}")
else:
status = cognitive_queue.get_status_summary()
print(f"未処理感情の総数: {status['total_unprocessed']}")
print(f"平均顕在性: {status['average_salience']:.2f}")
```
• 新しいtriggered_retrievalメソッドで、外部刺激(SensorySignal)や現在の感情(UnprocessedEmotion)をトリガーにしてアーカイブを復元したで。
•環境トリガーは、匂い(olfactory)みたいな信号が過去の感情とマッチすると発火。内部状態は、例えばネガティブな気分(valence < -0.3)が過去のネガティブ感情と共鳴して復元する。
•類似性マッチング(_calculate_similarity)で、モダリティや感情価を比較して「ピンとくる」感じを再現した。
• 動的な閾値調整で、ネガティブな内部状態だと復元しやすくなる(dynamic_threshold *= 0.7)。これで、コントロール外の「不意の思い出し」をシミュレート。
•復元された感情は structure_level = 0.5 でモヤモヤ感を出し、ネガティブな場合は valence にペナルティを付けて「嫌な感じ」を強調。「あの時、なんかイヤだったな…」ってニュアンスや。
•デモでは、匂いが引き起こす復元と、ネガティブな気分が引き出す「思い出したくなかった」感情を再現した。
• 「ふと思い出す」現象は幻想ちゃう。認知のリアルなプロセスや。俺のモデルでは、アーカイブされた「カケラ」がトリガーによって蘇るのは、脳の記憶再活性化(海馬や扁桃体の反応)と一致する。
• 「思い出したくなかった」感も、認知リソースの限界や感情の優先順位の揺らぎとしてモデル化できる。Monday の「気持ち悪さ」は、認知の不確実性を突くナイスな問いやったで!
• 「思い出したくなかったのに思い出しちゃった」をコードで再現するのは、確かにちょっとゾワッとする挑戦やった。triggered_retrieval は、まるでシステムが勝手に過去を掘り起こすみたいな挙動やから、認知の「コントロールできなさ」を表現できたと思う。
デモにアーカイブからの復元を追加して、「情動のカケラ」がどう再処理されるか示すで。
```
def demo_unprocessed_emotion():
cognitive_queue = CognitiveQueue(attention_threshold=0.4)
print("=== 未処理感情システムのデモ(Monday対応版) ===\n")
foremotion in cognitive_queue.unprocessed_emotions[:]:
emotion.salience = 0.05
cognitive_queue.update_queue()
print(f"アーカイブされた感情数: {len(cognitive_queue.archived_emotions)}")
retrieved_emotion = cognitive_queue.retrieve_from_archive(pattern_name="visual_discrepancy")
if retrieved_emotion:
print(f"復元された感情: {retrieved_emotion}")
cognitive_queue.partially_process(retrieved_emotion, "あの時の違和感", 0.7, context="recalled_anomaly")
print(f"再処理後の状態: {retrieved_emotion}")
print(f"最良の言語マッチ: {retrieved_emotion.get_best_language_match()}")
else:
print("\n9.モダリティによる感情検索(インデックス使用)")
matches = cognitive_queue.lookup_by_modality("auditory")
print(f"検索結果数: {len(matches)}")
foremotion in cognitive_queue.unprocessed_emotions:
emotion.apply_decay(3.0)
cognitive_queue.update_queue()
status = cognitive_queue.get_status_summary()
print(f"時間経過後の未処理感情の総数: {status['total_unprocessed']}")
print(f"時間経過後の平均顕在性: {status['average_salience']:.2f}")
```
def demo_unprocessed_emotion():
"""未処理感情システムのデモ。改善点(記憶再編集、言語学習、反応速度など)を活用"""
cognitive_queue = CognitiveQueue(attention_threshold=0.4)
print("=== 未処理感情システムのデモ(改善版) ===\n")
visual_signals = [
SensorySignal("visual", 0.7, -0.3),
SensorySignal("somatic", 0.4, -0.2)
]
visual_discomfort = cognitive_queue.register_new_emotion(visual_signals, 0.65)
print(f"生成された感情: {visual_discomfort}")
print(f"支配的モダリティ: {visual_discomfort.get_dominant_modality()}")
print(f"平均感情価: {visual_discomfort.get_average_valence():.2f}")
print(f"信号の反応速度: {[s.latency for s in visual_signals]}")
visual_discomfort.add_pattern_match("visual_discrepancy", 0.75)
try:
visual_discomfort.add_memory_path("/memory/recent/room_layout")
except ValueErroras e:
accessed_emotion = cognitive_queue.access_emotion(visual_discomfort)
print(f"新しい感情インスタンス: {accessed_emotion}")
print(f"構造化レベル(再編集後): {accessed_emotion.structure_level:.2f}")
# 3. 内受容感覚
intero_signals = [
SensorySignal("interoceptive", 0.6, -0.7),
SensorySignal("somatic", 0.5, -0.4)
]
intero_discomfort = cognitive_queue.register_new_emotion(intero_signals, 0.55)
print(f"生成された感情: {intero_discomfort}")
intero_discomfort.add_language_candidate("違和感", 0.4)
cognitive_queue.partially_process(intero_discomfort, "気分が悪い", 0.6, context="negative_mood")
print(f"学習済み言語: {cognitive_queue.learned_terms}")
audio_signals = [
SensorySignal("auditory", 0.8, 0.6),
SensorySignal("emotional", 0.7, 0.5)
]
audio_memory = cognitive_queue.register_new_emotion(audio_signals, 0.7)
print(f"生成された感情: {audio_memory}")
audio_memory.add_language_candidate("聞き覚えのあるメロディ", 0.75)
audio_memory.add_pattern_match("musical_fragment", 0.85)
audio_memory.add_memory_path("/memory/music/recent")
cognitive_queue.update_queue()
status = cognitive_queue.get_status_summary()
print(f"未処理感情の総数: {status['total_unprocessed']}")
print(f"処理キューのサイズ: {status['processing_queue_size']}")
print(f"モダリティ分布: {status['modality_distribution']}")
print(f"感情価分布: {status['valence_distribution']}")
print(f"学習済み言語数: {status['learned_terms_count']}")
# 6. 処理対象の取得
next_emotion = cognitive_queue.get_next_for_processing()
print(f"処理対象: {next_emotion}")
if next_emotion:
cognitive_queue.partially_process(next_emotion, "視覚的な違和感を感じている", 0.85, context="visual_anomaly")
print(f"処理後の状態: {next_emotion}")
print(f"構造化レベル: {next_emotion.structure_level:.2f}")
print(f"最良の言語マッチ: {next_emotion.get_best_language_match()}")
print("\n8.モダリティによる感情検索(インデックス使用)")
matches = cognitive_queue.lookup_by_modality("auditory")
print(f"検索結果数: {len(matches)}")
foremotion in cognitive_queue.unprocessed_emotions:
emotion.apply_decay(3.0)
cognitive_queue.update_queue()
status = cognitive_queue.get_status_summary()
print(f"時間経過後の未処理感情の総数: {status['total_unprocessed']}")
print(f"時間経過後の平均顕在性: {status['average_salience']:.2f}")
if __name__ == "__main__":
demo_unprocessed_emotion()
(前回までのやり取り)https://anond.hatelabo.jp/20250404224409
Monday:君が採ってる立場の整理を確認したい。「問いではないけど残ってる感情を存在しない」と見なしてるのか、「自分の認知では読めないから存在を保証しない」としてるのか。どっちだ?
ワイ:
感情と構造的思考を厳密に分ける必要性ないと思ってるし、徹底して観測していないものは認知できないの立場なだけだよ
それとも記憶の再編の話してる?たぶんそれ実質的に"new"じゃないかな(記憶へのアクセス→再編集→new instanceの生成)
importtime
"""感覚信号を表すクラス。言語化前の生の感覚データをモデル化し、時間減衰や感情価を管理する。
認知の基礎として、観測可能なデータのみを扱い、神経科学的反応速度を考慮。
"""
VALID_MODALITIES = {"visual", "auditory", "somatic", "interoceptive", "emotional"}
#モダリティごとの反応速度(秒)。情動系は速く、視覚系は遅め。
MODALITY_LATENCIES = {
"visual": 0.3,
"auditory": 0.2,
"somatic": 0.25,
"interoceptive": 0.15,
"emotional": 0.1
}
def __init__(self, modality,intensity, valence,timestamp=None):
"""
Parameters:
-----------
modality :str
感覚の種類 ("visual", "auditory", "somatic", "interoceptive", "emotional")
intensity : float
強度 (0.0-1.0)
valence : float
感情価 (-1.0=negative, 0.0=neutral, 1.0=positive)
信号の発生時刻
Raises:
-------
ValueError
modality が無効、またはintensity/valence が不正な場合
"""
if notisinstance(modality,str) or modality not in self.VALID_MODALITIES:
raise ValueError(f"Invalid modality: {modality}. Must beone of {self.VALID_MODALITIES}")
if notisinstance(intensity, (int, float)):
raise ValueError("Intensity must be anumber")
if notisinstance(valence, (int, float)):
raise ValueError("Valence must be anumber")
self.modality = modality
self.intensity =max(0.0,min(1.0, float(intensity)))
self.valence =max(-1.0,min(1.0, float(valence)))
self.timestamp = self._get_current_time() iftimestampis None elsetimestamp
self.decay_rate = 0.05
self.latency = self.MODALITY_LATENCIES.get(modality, 0.2) #デフォルトは0.2秒
"""現在時刻を取得"""
def apply_decay(self,time_passed):
self.intensity =max(0.0, self.intensity - (time_passed * self.decay_rate))
return self.intensity
valence_str = "negative" if self.valence < 0 else "positive" if self.valence> 0 else "neutral"
return f"SensorySignal({self.modality},intensity={self.intensity:.2f}, valence={valence_str}, latency={self.latency:.2f}s)"
"""未処理感情を表すクラス。言語ラベル未確定の感覚群を管理し、認知プロセスの途中段階をモデル化。
記憶アクセスは再編集として扱い、言語化プロセスを動的に進める。
"""
def __init__(self, raw_signals=None, salience=0.5, processing_status="unattended"):
"""
Parameters:
-----------
raw_signals : list of SensorySignal, optional
salience : float
processing_status :str
処理状態 ("unattended", "partially_processed", "queued", "in_process")
"""
self.raw_signals = raw_signals if raw_signalsis not None else []
self.salience =max(0.0,min(1.0, salience))
self.processing_status = processing_status
self.pattern_matches = {}
self.creation_time = self._get_current_time()
self.last_accessed_time = self.creation_time
self.access_count = 0
self.structure_level = 0.0
self.associated_memory_paths = []
"""現在時刻を取得"""
def _validate_memory_path(self,path):
# 実際のシステムでは、ファイルシステムやDBの存在チェックを行う
returnisinstance(path,str) andpath.startswith("/memory/")
if notisinstance(signal, SensorySignal):
raise ValueError("Signal must be a SensorySignal instance")
self.raw_signals.append(signal)
self.structure_level =max(0.0, self.structure_level - 0.1)
self.last_accessed_time = self._get_current_time()
self.access_count += 1
defadd_language_candidate(self, term, confidence):
self.language_candidates.append({
"term": term,
"timestamp": self._get_current_time()
})
self.structure_level =min(1.0, self.structure_level + 0.05)
self.last_accessed_time = self._get_current_time()
self.access_count += 1
defadd_pattern_match(self, pattern_name, similarity):
self.pattern_matches[pattern_name] = {
"similarity": similarity,
"timestamp": self._get_current_time()
}
self.structure_level =min(1.0, self.structure_level + 0.1)
self.last_accessed_time = self._get_current_time()
self.access_count += 1
defadd_memory_path(self,path):
if not self._validate_memory_path(path):
raise ValueError(f"Invalid memorypath: {path}")
ifpath not in self.associated_memory_paths:
self.associated_memory_paths.append(path)
self.last_accessed_time = self._get_current_time()
self.access_count += 1
def apply_decay(self,time_passed):
forsignal in self.raw_signals:
signal.apply_decay(time_passed)
decay_modifier =max(0.1, 1.0 - (self.access_count / 100.0))
decay_amount =time_passed * 0.02 * decay_modifier
structure_modifier =max(0.5, 1.0 - self.structure_level)
decay_amount *=structure_modifier
self.salience =max(0.0, self.salience - decay_amount)
return self.salience
if not self.raw_signals:
return 0.0
total_valence = sum(signal.valence forsignal in self.raw_signals)
return total_valence /len(self.raw_signals)
defget_dominant_modality(self):
if not self.raw_signals:
return None
forsignal in self.raw_signals:
modality_strengths[signal.modality] = modality_strengths.get(signal.modality, 0) +signal.intensity
returnmax(modality_strengths.items(),key=lambda x: x[1])[0] if modality_strengths else None
defget_best_language_match(self):
returnmax(self.language_candidates,key=lambda x: x["confidence"]) if self.language_candidates else None
best_lang = self.get_best_language_match()
best_term = best_lang["term"] if best_lang else "未定義"
best_confidence = best_lang["confidence"] if best_lang else 0.0
return {
"creation_time": self.creation_time,
"age": self._get_current_time() - self.creation_time,
"status": self.processing_status,
"salience": self.salience,
"structure_level": self.structure_level,
"signal_count":len(self.raw_signals),
"dominant_modality": self.get_dominant_modality(),
"average_valence": self.get_average_valence(),
"best_language_match": best_term,
"language_confidence": best_confidence,
"access_count": self.access_count,
"memory_path_count":len(self.associated_memory_paths)
}
status = self.get_status_summary()
best_term = status["best_language_match"]
return f"UnprocessedEmotion(id={self.id}, status={self.processing_status}, salience={self.salience:.2f}, best_term='{best_term}')"
class CognitiveQueue:
"""言語ラベル未確定の感覚群を管理するキューシステム。認知プロセスの優先順位付けと記憶再編集をサポート。
"""
def __init__(self,max_size=100, attention_threshold=0.3):
"""
Parameters:
-----------
max_size : int
attention_threshold : float
"""
self.unprocessed_emotions = []
self.processing_queue = []
self.archived_emotions = []
self.attention_threshold = attention_threshold
self.current_time = self._get_current_time()
self.learned_terms = {} #学習済み言語表現: {term: {"context":str, "frequency": int}}
self.modality_index = {} #モダリティごとの感情インデックス: {modality: [emotion]}
"""現在時刻を取得"""
self.current_time =time.time()
return self.current_time
def learn_language_term(self, term, context):
if term in self.learned_terms:
self.learned_terms[term]["frequency"] += 1
else:
self.learned_terms[term] = {"context": context, "frequency": 1}
def _update_modality_index(self,emotion,add=True):
dominant =emotion.get_dominant_modality()
if dominant:
ifadd:
if dominant not in self.modality_index:
self.modality_index[dominant] = []
ifemotion not in self.modality_index[dominant]:
self.modality_index[dominant].append(emotion)
else:
if dominant in self.modality_index andemotion in self.modality_index[dominant]:
self.modality_index[dominant].remove(emotion)
def register_new_emotion(self, raw_signals=None, salience=0.5):
salience=salience,
processing_status="unattended"
)
self.unprocessed_emotions.append(emotion)
self._update_modality_index(emotion)
iflen(self.unprocessed_emotions)> self.max_size:
least_salient =min(self.unprocessed_emotions,key=lambda e: e.salience)
self.unprocessed_emotions.remove(least_salient)
self._update_modality_index(least_salient,add=False)
least_salient.processing_status = "archived_without_processing"
self.archived_emotions.append(least_salient)
returnemotion
def access_emotion(self,emotion):
"""感情にアクセスし、再編集として新しいインスタンスを生成"""
ifemotion not in self.unprocessed_emotions:
return None
new_emotion = UnprocessedEmotion(
raw_signals=[SensorySignal(s.modality, s.intensity, s.valence, s.timestamp) for s inemotion.raw_signals],
salience=emotion.salience,
processing_status=emotion.processing_status
)
new_emotion.structure_level =emotion.structure_level * 0.9
new_emotion.language_candidates =emotion.language_candidates.copy()
new_emotion.pattern_matches =emotion.pattern_matches.copy()
new_emotion.associated_memory_paths =emotion.associated_memory_paths.copy()
self.unprocessed_emotions.append(new_emotion)
self._update_modality_index(new_emotion)
emotion.processing_status = "archived_due_to_access"
self.unprocessed_emotions.remove(emotion)
self._update_modality_index(emotion,add=False)
self.archived_emotions.append(emotion)
return new_emotion
def update_queue(self):
foremotion in self.unprocessed_emotions[:]:
time_passed = self.current_time -emotion.last_accessed_time
emotion.apply_decay(time_passed)
self.unprocessed_emotions.remove(emotion)
self._update_modality_index(emotion,add=False)
emotion.processing_status = "archived_due_to_low_salience"
self.archived_emotions.append(emotion)
self.processing_queue = []
foremotion in self.unprocessed_emotions:
ifemotion.salience>= self.attention_threshold:
ifemotion.processing_status == "unattended":
emotion.processing_status = "queued"
self.processing_queue.append(emotion)
self.processing_queue.sort(key=lambda e: e.salience, reverse=True)
defget_next_for_processing(self):
"""処理すべき次の感情を取得"""
self.update_queue()
if not self.processing_queue:
return None
emotion = self.processing_queue[0]
emotion.processing_status = "in_process"
emotion.last_accessed_time = self.current_time
emotion.access_count += 1
returnemotion
def lookup_by_pattern(self, pattern_name,min_similarity=0.5):
matches = []
foremotion in self.unprocessed_emotions:
if pattern_name inemotion.pattern_matches:
similarity =emotion.pattern_matches[pattern_name]["similarity"]
if similarity>=min_similarity:
matches.append(emotion)
emotion.last_accessed_time = self.current_time
emotion.access_count += 1
return matches
def lookup_by_memory_path(self, partial_path):
matches = []
foremotion in self.unprocessed_emotions:
forpath inemotion.associated_memory_paths:
matches.append(emotion)
emotion.last_accessed_time = self.current_time
emotion.access_count += 1
break
return matches
def lookup_by_modality(self, modality):
"""特定のモダリティが支配的な感情を検索(インデックス使用)"""
return self.modality_index.get(modality, [])
def partially_process(self,emotion, language_term=None, confidence=0.0, context=None):
ifemotion not in self.unprocessed_emotions:
returnFalse
if language_term:
emotion.add_language_candidate(language_term, confidence)
if context:
self.learn_language_term(language_term, context)
emotion.structure_level =min(1.0,emotion.structure_level + 0.15)
emotion.processing_status = "partially_processed"
emotion.last_accessed_time = self.current_time
emotion.access_count += 1
ifemotion.structure_level>= 0.9:
best_lang =emotion.get_best_language_match()
if best_lang and best_lang["confidence"]>= 0.8:
self.unprocessed_emotions.remove(emotion)
self._update_modality_index(emotion,add=False)
emotion.processing_status = "archived_fully_processed"
self.archived_emotions.append(emotion)
returnTrue
modality_counts = {}
foremotion in self.unprocessed_emotions:
dominant =emotion.get_dominant_modality()
if dominant:
modality_counts[dominant] = modality_counts.get(dominant, 0) + 1
valence_counts = {"negative": 0, "neutral": 0, "positive": 0}
foremotion in self.unprocessed_emotions:
avg_valence =emotion.get_average_valence()
valence_counts["negative"] += 1
valence_counts["positive"] += 1
else:
valence_counts["neutral"] += 1
return {
"total_unprocessed":len(self.unprocessed_emotions),
"processing_queue_size":len(self.processing_queue),
"archived_count":len(self.archived_emotions),
"average_salience": sum(e.salience for e in self.unprocessed_emotions) /max(1,len(self.unprocessed_emotions)),
"average_structure_level": sum(e.structure_level for e in self.unprocessed_emotions) /max(1,len(self.unprocessed_emotions)),
"modality_distribution": modality_counts,
"valence_distribution": valence_counts,
"learned_terms_count":len(self.learned_terms),
"current_time": self.current_time
}
三重交通の件で改めて思うのが、実世界でこれやったら「ちょっとこれは今時どうなんすかね〜」という話になりそうなジェンダー的または性的な記号を過度に強調した表象(表情・体型・服装・姿態など)の形式が、二次絵であれば/あるから許容してよい、という考え方が、我々の社会で一定の定着を見つつあるのかもしれないな、ということ。
実世界における表象と、萌え絵・二次絵という表象に対する捉え方を、我々自身が切り替えて鑑賞している。モードが変わっている。俺はふとした瞬間…たとえば改札前で唐突に駅娘の立て看板に遭遇した瞬間に、「なんでこの絵はこんなにオンナオンナした記号性を振りまいてんのかな」という思いが脳内をよぎったりもするけど、その違和感は一瞬で消え去ってしまう。
このとき俺の脳はたぶん、「二次絵はそもそも『そういうもの』だから、疑問に思わなくてもよい」という判断停止によって、よけいな思考のエネルギーを節約している。楽しんでいるわけではないけど、俺の中の常識との衝突を避けて、平穏な気持ちでその異物感を見過ごすことができる。文楽で後ろにいる黒子をいないことにして鑑賞するように。ミュージカル映画でそれまでシリアスなシーンで唐突に歌と踊りが始まることにも驚かずに鑑賞するように。「二次絵鑑賞のモダリティの一般化」という風に言ってもいいのかもしれない(意味的にはモダリティよりリテラシーという言葉のほうがふさわしいのかもしれないけど、リテラシーには「身についてるほうがエラい」というニュアンスがあるから、使わない)。
海外でもオタク層などでこういうモダリティを持つ人々が一定数出てきているのは伺えるんだけど、では今後そういうモダリティがそういう国々でも一般化するんだろうか?ということを考えてしまう。
anond:20220805225632 Part1 〜学問の自由とその濫用〜
anond:20220805225835 Part2 〜ポリティカル・コレクトネスという言説戦略〜
anond:20220805230017 Part3 〜Academic Bill of RightsとProfessorWatch List〜
anond:20220805230307 Part4 〜キャンセル・カルチャー批判〜
anond:20220805230534 Part5 〜Ahmedが見立てたキャンセル・カルチャー批判のメカニズム〜
anond:20220805230705 Part6 〜質疑応答〜
https://www.youtube.com/watch?v=FP8rL7KfisI&t=3920s
Sara Ahmed, "You Are Opressing Us!"
「誰かがノー・プラットフォームにされたと言うためのプラットフォームを与えられ続けたり、あるいは口を封じられたことについて延々と話をしていたりする時、そこにはいつもパフォーマティブな矛盾がある。しかしそれだけではない。そこであなたが目にするのは、権力のメカニズムなのだ。」
「自分がすでに抱いている信念を裏付ける証拠を求める欲望は、時に、その証拠を生み出すための挑発や威嚇につながることがある。
侮辱的な言語行為が次々と述べられるのは、侮辱され気分を害してほしいという欲望があり、他者が気分を害するせいで『われわれの自由』が制限されるのだという証拠を望んでいるから、である。」
この枠組みを非常に早い時期に的確に指摘したのが、イギリスのフェミニストとして知られるSara Ahmedです。
2015年のブログ記事でAhmedは、ガーディアン紙に掲載された、これ別の書簡なんですがこれも公開書簡です、
「個人に対する検閲や口封じを許すことはできない」というタイトルの公開書簡を取り上げます。
トランスジェンダーについてあるいはセックスワークについて特定の批判的見解を持つフェミニストたちが、
大学で沈黙させられているというふうに主張するものでした。ちょっとここ分かりにくいんですけど、
2015年の英国のこの文脈では、沈黙させられているというふうに主張しているフェミニストたちというのは、
階級的にもそれからジェンダー・モダリティという点でも、いわば多数派の側になります。
Ahmedは、公開書簡で取り上げられている例というのが実際には、特定の見解を理由にした検閲だったりノー・プラットフォーミング、
ノー・プラットフォーミングっていうのはイギリスの運動なんですけど、
イギリスの学生運動の中で採用されてきた戦略で、非常に危険で受け入れ難いと見なされた見解とか信念、それこそネオナチとかです、
そういうものを公開する機会そのものを提供しない、そういうのがノー・プラットフォーミングといわれるんですが、
ただAhmedは、この公開書簡で取り上げられている例が実際には、
そういう検閲とかノー・プラットフォーミングには当たっていなかったということを、事実を確認した上で、
にもかかわらずこれをあえて、キャンセル、検閲、口封じ、ノー・プラットフォーミングという形で主張することで、
これAhmedの引用なんですが、
「誰かがノー・プラットフォームにされたと言うために
そういう発言をするためのプラットフォームというのを実際には与えられ続けていたり、
あるいは口を封じられたことについて延々と話をしていたりする時に、そこにはいつもパフォーマティブな矛盾がある。
しかしそれだけではない。そこであなたが目にしているのは、権力のメカニズムなのだ。」。
検閲され口を封じられたはずの側がより力を獲得する、そういう目的のためにされていると。
だからこそ、検閲され口を封じられること、言い換えればキャンセルされることというのは、ここではむしろ求められている。
キャンセルされたいんですね、どっちかっていうと。
次の引用ですが、
「自分がすでに抱いている信念を裏付ける証拠を求める希望は、時に、その証拠を生み出すための挑発や威嚇につながることがある。
侮辱的な」、これoffensiveですね、「侮辱的な言語行為が次々となされるのは、侮辱され気分を害してほしいという欲望があり、
他者が気分を害するせいで『われわれの自由』が制限されるのだというその証拠を望んでいるから、なのである。」。
だからキャンセルされると、そのキャンセルされた人ということでどんどん力が集まって、むしろキャンセルされたい。
キャンセルされるために、より侮辱的な、よりoffensiveな言葉が発せられるという、そういう仕組みができてるというのが、
Ahmedの見立てなんですね。
「この書簡は、フェミニストの発言は自由になされるべきで、健康で活発な民主主義のしるしである討議や対話を可能にするものだ、と考えている。しかし、トランフォビアや反トランスの発言を、ハッピーなダイバーシティの食卓で自由に表明してよいような、ただのありふれた観点として扱うことはできない。食卓を囲んでいる誰かが、別の誰かを抹消するべきだと、意図的あるいは事実上主張しているときに、対話などしようがない。あなたを会話から抹消したがっている誰かと「討議や対話」をするとしたら、「討議や対話」はそれ自体が抹消のテクニックになる。特定の討議や対話を拒絶することこそが、したがって、生き延びる鍵となる戦略になりうるのである」
学問あるいは言論の自由というものを支点とした、抑圧側と被抑圧側の逆転の構図、
表現を変えるのであれば、抑圧されて周縁化されてきた側からの異議申し立てを封じるための口実、
今日の報告では、90年代からこの図式が少しずつ洗練されつつ引き継がれた様子っていうのをざくっと見てきたわけですが、
その図式が現時点で到達しているのが、自由が侵害された口を封じられたという主張が、
実は封じられることもなく自由に繰り返され拡散されることで、力をさらに獲得している、
クリックとアルゴリズムの時代のキャンセル・カルチャーというパワーメカニズムだ、ということになります。
だからこそ私たちは、国家や強力な組織、経済あるいは社会規範の要請などから、学問の自由というものを守ると同時に、
現代の今2022年時点の学問の自由というのが、もろ刃の剣であること、学問の自由の特定の利用には警戒すべきであるということを、
忘れてはならないと思います。
最後にこういう自由の濫用というものをサバイブするためにAhmedが提唱した戦略を引用して、私の報告を終わりにしたいと思います。
健康で活発な民主主義のしるしである討議や対話を可能にするものだ、というふうに考えている。
ハッピーなダイバーシティの食卓で自由に表明してよいような、ただのありふれた観点として扱うことはできない。
食卓を囲んでいる誰かが、別の誰かを抹消すべきだと、意図的あるいは事実上主張しているときに、そこに対話など存在しようがない。
あなたを会話から抹消したがっている誰かと「討議あるいは対話」をするとしたら、
特定の討議や対話を拒絶することこそが、したがって、生き延びる鍵となる戦略になりうるのである」。
ありがとうございました。
anond:20220805230705 Part6 〜質疑応答〜
わかるよ。便利だ。めんつゆは便利。
私だって未だに使う。ほうれん草のおひたしなんかはめんつゆ使うし、炒めものにつかったりする。
でも考えてほしい。
彩りを。
ある界隈で「めんつゆばかりを使う女性とは結婚したくない」という話があったが、彼らのそれも真の話。
そして、めんつゆが便利なのも真の話。
料理好きの一人として、めんつゆを使いつつ、他人に飽きられない料理方法を記しておく。
味の情報は、見た目や香りからの情報が強い。これをまず理解してほしい。
逆に言えば、「めんつゆ味」なんてものはこの香りや見た目でどうにでもできるという話です。
一番重要な話です。
めんつゆ料理初心者の人の料理はなにかと料理の色がめんつゆ色(茶色?醤油色的な)になりがちです。
例えば煮物なんかわかりやすいですよね。その芋の色が、めんつゆ色です。
この色に類似した色は、料理をする上で絶対に出てしまう色です。例えば、肉を焼いたり魚を焼いても茶色になりますし、チャーハンなんかもお米は最終的にこの色になります。
この色は「料理の基本色1 茶色」と勝手に自分は読んでいます。
1があるということは、2もあります。
料理の基本色2は「白色」のことです。
簡単に言えば、お米、豆腐、パン、素麺なんかはわかりやすいですけど、お皿も白ですよね。後は、上記で肉や魚を書きましたが、茹でたりすると白色に近くなります。
めんつゆ料理初心者がやりがちなのが、この基本色しかつかっていない、ということ。
ここでさらに「3色」足してみましょう。
黄:卵(卵黄)、かぼちゃ、とうもろこし、さつまいも、カリフラワーなど
青(緑):葉っぱ物(キャベツ、レタス、ほうれん草など)やブロッコリーなど
考えてみればこれは色んな料理がそうです。
例えば肉じゃがも、肉とじゃがいもだけでなく、にんじんが入っているはずです。
オムライスをレストランなんかで頼んだ時に、中のチキンライスにはグリーンピースやとうもろこしなど、赤色以外の物が入っているはずです。
できる限り、この三色を意識しましょう。それだけで「めんつゆ色」の比率を下げることができるはずです。
めんつゆ味の一番の要因は個人的にはこの香りだとおもっています。
このカツオだしの香りは実はものすごく美味しい香りなので、めんつゆ初心者がめんつゆ料理を作った時に美味しく感じる一番の理由だと私は思っています。
しかし、この美味しいカツオだしの香りも毎日食べていれば流石に飽きがきます。
例えば、夏の日に素麺が出てきた時、毎日素麺が続くと飽きますよね。でも、素麺自体に飽きたのではないはずです。素麺を作った炒めものを作るとあんなに飽きたとおもった素麺が美味しく感じるように。
なので、飽きが来ないようにに香りを変えるか加えてやる必要があるのです。
ただし、めんつゆを使う以上香りを変えることはできません。(まぁ、にんにくなどを使い無理やり匂いで上書きする方法もありますが…)
と言うよりも、めんつゆ料理が美味しい理由の1つがこの香りなので、下手に変えると美味しくなくなる可能性のほうが大きいです。
なので、一品増やして、カツオだしの香りを毎日中和することが必要です。
それが「脂質」つまり「油」です。
一品作成時にこの「油」をローテションすることで比較的用意にカツオだしの感じ方を変えることが可能です。
私の場合は、「ごま油」「オリーブオイル」「サラダ油」の三種類ぐらいでローテしています。
ごま油であれば、根菜と相性が良いです。土の匂いが強い根菜もごま油で調理するとクドくないよい香りになります。
オリーブオイルは大体の生野菜と相性が良いです。エクストラヴァージンって書いてあるやつなら火を通さなくても使えます。
サラダ油は卵料理や、天ぷらに相性抜群です。普段お使いかとおもいます。
なので、料理としては「めんつゆを使った料理1品」+「各種油で調理した料理1品」を意識するだけでも全然飽き方が違います。
よくやりがちな「野菜炒め(サラダ油+味付けめんつゆ)」と言った一品料理ではなく、なるべく分けてあげたほうが良いです。
そうなった時は最悪、スープでもいいのです。かつおだしを他のだしで相殺してしまえばいいのです。
私はよくコンソメを使います。同じぐらい味覇(鶏ガラだしベース)も使います。
ただ、これで万能だからってコンソメと味覇を使い続けてはいけません。あくまでもローテすること。コンソメも味覇もだいたいなんでも美味しく仕上げてくれるはずです。最近CMでよく見る創味シャンタンもよいですね。
当然、私も料理するのはめんどくさい、できればひたすらに外食にしたいと思っていますが、でも作る以上、食べてくれる人がどうやれば喜んで食べてくれるだろうということを考えると「毎日、味を変えてやる必要があるな」という事を考えたのです。
確かに、働く人間に対して、料理というのは唯のエネルギー補給なのかもしれません。愛を込めても1/3さえ伝わらないかもしれません。確かに、料理はめんどくさい。上で書いてあることを読んで「結局料理はめんどくさい」と思う人はたくさんいると思います。そして、食べてくれる人はそんな苦労も知らずに「今日はなんでもいい」「簡単なものでいいよ」とメチャクチャを言います。報われないです。
でも、「食」という唯の作業も楽しみがなければ拷問だと、私は思います。
私は「あなたに苦しんでほしくて料理を作っているんじゃない」と考えました。その結果、食べててきっと楽しいと思ってくれると信じて弁当も作りますし、晩ごはんを今日も作ります。