アイソモカ

知の遊牧民の開発記録

怠け者の根性なしではなかったっぽい(精神ソフトウェア不具合対応記録)

この記事は7月上旬〜8月上旬に下書きしたものを少し編集し、8月下旬に投稿したものです。

 6月末に文字通り泣きながらこの一連のツイートを書き、自分にとって自分の不得意な部分の何が問題なのか改めて考え、カウンセリングルームと精神科に行き、服薬と検査を開始することができた。

これはホンマに文章として出力するのに勇気がいる話なんですけど、修士課程の途中で「ア、ぼく研究者向いてないな」と気づいて諦めたつもりだったのに、研究への未練タラタラでそれを考えるたびに文字通り涙出てくるの、そろそろどうにかせなアカンと思っていて。

「怠け者で根性がないどうしようもない奴だ」ではなかったのだととても安心した。どうにかうまくいくかもしれないと希望が持てるようになった。

目次

  • 目次
  • 主な不具合
    • 今考えてみると
    • いったんは諦めたつもり
  • 明らかになってきた経緯
  • ツイートしてから
  • 不具合対応の専門家に会う
    • カウンセリング
    • 精神科
  • 不具合まとめ
続きを読む

疑問に思ったことを聞いただけなのに、怒られがち

やっちまった。

どうやらこのダブルコンボに、それまでの話の流れを把握していなくて論点がずれているというのも加わって、トリプルコンボを踏んでしまったようだ。

反省している。実は、この手の怒られが発生したのは、一度や二度ではない。失敗を繰り返さないために、なにがどうなっているのかを考えるのが今回の記事である。

なお、ぼくは人が口から出す(あるいは体で表現する)「ことば」と、頭の中にある「考え」を分けて考えている。 怒らせるつもりがなかった、傷つけるつもりがなかったとしても、口から出たことばが問題なのであって、どういうつもりだったかは(他者には観測できないので)関係がない。 思いやりを持ちましょう、敬意を持ちましょうみたいな、そういう外から見えない部分にはあまり興味がない。思想・良心の自由は人間の権利だからだ(憲法でも保障されている)。

  • はじめに:人間がわかりたい
  • 仮説:2つの文化
  • 対応策:謝って、敵意がないことを示す
  • 今後の課題
    • あちら側の文化の話
      • 指摘や疑問を否定だと捉えるのは、どうしてなのか
      • 論点をずらす、重箱の隅をつつく
    • 殴り合いというメタファー
    • 謝罪とその周辺
  • おわりに
続きを読む

はじめての語用論 第1章〜第3章

文脈や場面なしにことばを理解することはできないのではないかと思い、語用論に興味を持ち、教科書を読んでいます。端的にいうと空気が読めたい。

章末の練習問題の解答を書いてみます。問題を解くと、さらさらっと読んだだけではあまり理解できていなかった部分を読み直せて考えられるので良いですね。正解かどうかは自信がないので、これ違うんじゃない? というのがあったら、ぜひ教えてください(あるいは議論しましょう)。

第1章 語用論とは何か

ことばは単に出来事を叙述するためだけに使われるのではなく、話し手・書き手が、聞き手・読み手に影響を及ぼそうとして使われる場合もある。

練習問題

問1

次の例は電話上の会話である。この会話のやりとりから、どのような語用論的な情報を読み取ることができるだろうか。

(1)

A: So can you please come over here again right now?

B: Well, I have to go to Edinburgh today sir.

A: Hmm. How about this Thursday?

Bの発話の語用論的意味は、「今日は行くことができない」という間接的な断りであるが、それは次の理由による。

  • 我々がテクストを理解しようとする際に前接文と後接文の間に意味的関係性を見出そうとするので(言語的コンテクスト)、Aの問いにBが yes, I can / no, I cannot と直接的に答えなくても不自然な発話にならない。
  • AとBは、「Edinburgh はAのいる場所からは遠い」という知識(一般知識的コンテクスト)を共有している。

問2

小説、映画のシナリオ、広告、キャッチコピーなどを、コンテクストを考慮に入れて分析してみよう。

最近 Twitter で見た話。

@WwZuttonetaiYo:「うちの息子の嫁ね、カレーを豚肉で作るのよ…もうほんまに信じられんわ…」とすごい深刻な顔で年配女性のお客さんから愚痴られたんだけど、数日考えた今も何が悪いのかサッパリわからない…イスラム教だったのか…??

 

@sunameritaaaaan:大阪でも70代以上の年配の方なら、カレーや肉じゃがに豚肉使う=旦那の稼ぎが悪いから牛肉買われへん って偏見があるんやと思う 生活水準が中以上の家庭は特にその傾向が強い だから、そのお姑さんは嫁の育ちを暗に皮肉っている可能性アリです(しかも息子の稼ぎは牛肉買えるだけある筈って前提で)

同じ日本語話者であっても、地域や世代により文化が異なり、コミュニケーションに齟齬が生まれることと、社会・文化的コンテクストの多さに驚いた。

第2章 グライス語用論

まず、会話のなかにある原理(自然法則)、グライスの4つの公理を確認した。4つの公理から、言外の推意が生まれる。公理の新展開についても紹介されている。

練習問題

問1

次の発話では、話し手は、ある会話の公理をわざと破ることによって、聞き手にある推意を伝達していると考えられる。

(1) コンテクスト:話し手は、X嬢が歌った歌を批評している。

Miss X produced a series of sounds corresponding closely to the score of “Home Sweet Home”. (Grice 1989: 37)

その公理とはどの公理だろう。また、この場合の推意とはどのような推意だろうか?

様態の公理(Maxim of Manner)「明快であれ」が破られている。話し手は、明快に ‘Miss X sang “Home Sweet Home”’ と言わない。わざと推意を生み出すことにより、言っちゃ悪いけど下手だったよと伝えようとしている。

問2

「もう」と「まだ」には習慣的推意があると考えられる。

(i) 花子さんはもう資格試験に合格した。

(ii) 花子さんはまだ資格試験に合格していない。

「もう」と「まだ」の持っている習慣的推意とは何か考えてみよう。

慣習的推意は、真理条件的意味(その発話で記述されている現象)から独立した意味。真理条件的意味に対する話者の驚きなどを表す。

(i)

  • 真理条件的意味:花子さんは資格試験に合格した。
  • 慣習的推意:試験に合格したのは話者の想定より早かった。

(ii)

  • 真理条件的意味:花子さんは資格試験に合格していない。
  • 習慣的推意:試験に合格するのが話者の想定より遅い。あるいは、現時点では合格していないが、将来合格する可能性がある。

「やっと」「ようやく」「ついに」「とうとう」も習慣的推意をもつことばだ。

物事をポジティブに捉えて幸せになろう! みたいな話で、コップ中にの水が半分ある時、「まだ半分ある」と思いますか? それとも「もう半分しかない」と思いますか? って話を思い出した。

第3章 情報語用論

この章では、文の中での「背景」と「焦点」、談話や聞き手の意識の中での情報の「新」と「旧」が、助詞や冠詞、アクセントという形式にどう反映されるのかを考えた。

練習問題

問1

以下の2つの文は、いずれも「山田さん」が主語であり、伝達する命題内容も同一であると考えられる。

(1) 山田さんが大阪にいます。

(2) 山田さんは大阪にいます。

これらの文が使われる場面の違いを、焦点・背景・QUD といった用語を用いて説明してみよう。

(1) 「山田さん」は焦点であり、「大阪」は背景である。

(2) 「は」が主語が非焦点の場合に付加される背景マーカーとして働いている。「山田さん」は背景である。

典型的な会話では、お互いに情報提供をして知識を増やすよう、何らかの疑問(QUD, Question-under-Discussion) をめぐって展開される。1と2を回答とする QUD は、

(1') 大阪には誰がいますか。

(2') 山田さんはどこにいますか。

となる。これらが明示的に提示されるか、暗黙のうちに了解される場面で、1と2の文が自然な回答となる。

暗黙のうちに提示される場面を考えてみた:
(1") 
A: 神戸の会社から新規で問い合わせが来たな。訪問して説明したほうがいいと思うんだけど、誰に頼もうか?
B: 山田さんが大阪にいます。山田さんに担当してもらうのがいいんじゃないでしょうか。

(2")
A. 山田さんは、今日は休みですか?
B. 山田さんは大阪にいます。先月から本社勤務になったんですよ。

問2

主語・目的語を標示する格助詞「が」・「を」は、「は」と交替するほか、(話しことばでは)脱落する場合もある。

(3) この時計 [が/は/φ] 壊れているみたいです。

(4) おすし [を/は/φ] 食べたの?

情報構造と格助詞の脱落(の可否)について考えてみよう。

(3)

  • この時計が壊れているみたいです。:「この時計」が焦点となっており、情報状態的に「新」。旧情報は「壊れている」で、問題の原因究明をする中で時計が原因だと分かったような場面での発話と考えられる。このとき、格助詞が脱落すると不自然になる。

  • この時計は壊れているみたいです。:「この時計」が背景、情報状態的には「旧」。「壊れている」が新情報。格助詞が脱落し、「この時計、壊れているみたいです」となっても自然。

(4)

  • 「おすしを食べたの?」:文全体が焦点だが、情報状態的には旧情報、旧情報である「お寿司を食べた」を確認する場面での発話と考えられる。
  • 「お寿司食べたの?」:「おすし」は情報状態的には「新」であるが、背景となっている(取り立て助詞の「は」)。
  • 格助詞が脱落した「おすし食べたの?」は、「を」を使った場合と同値。

問2の(3)(4)を見ると、共通して旧情報の場合に格助詞の脱落が可能だが、他の場合にも同じなのだろうか。これはよく分からなかった。主語・目的語を標示する格助詞「が」・「を」の場合に限るのかも知れない。

麻辣燙(麻辣湯、まーらーたん)を食べましょう

昨年末に初めて食べてから、麻辣燙が好きです。

ぼくはまだ日本でしか食べたことがないので、日本のお店の話です。

どんな食べ物?

中華圏で人気の、具沢山で麺入りの辛いスープです。お店によって香辛料たっぷり薬膳だったり、博多とんこつラーメンっぽい白いスープだったりします。

特徴は、具材と麺が選べること。辛さも調節できます。

全部スープの色が違いますね。

どうやって注文するの?

お店に入ると、大きい冷蔵庫があります。まずは荷物を置いて、具材を選びましょう。

このお店では、具材が1人分ずつ串に刺さっていました。

こちらのお店では、具材は1人分ずつ小さいポリ袋に入っていました。衛生的。

冷蔵庫の横辺りに、トレイかボウルかカゴのような容器が置いてあるので、食べたい食材を入れていきます。肉、魚介、野菜、卵、豆製品などなど。5種類も選べば充分でしょう。いっぱい食べたい人はいっぱい入れよう。

選び終わったら、店員さんに渡します。すると、麺の種類を聞かれるので、答えます(インスタント麺が王道らしいですが、つるつる麺や春雨もあります。個人的には太めの春雨が好きです)。辛さも選びます。

店員さんが厨房で調理して、どんぶりで提供されます。いただきます。

お値段は、具材が1本100円とか、1袋何円とか、そんなかんじで、麺とスープの基本料金もかかるので、具材5種類+麺+スープで1000円程度になるのではないでしょうか。

中国語分からないんですけど?

お店により、店員さんにより、日本語のレベルはさまざまです。日本語母語話者の場合もあるし、カタコトだったり、全部中国語だったり。日本語非母語話者の店員さんが話すのがぶっきらぼうに聞こえるかも知れないですが、怒っているわけではなく普通なので心配しないで。

英語より日本語のほうが通じる可能性が高いと思います。店員さんも日本で暮らしている人なので、最低限の日本語はできるはず。

全部中国語の店でも、具材は実物を見れば大体何か分かるし、指差したり身振り手振りで話したりすればなんとかなります。ちょっとした旅行の気分です。数字や挨拶だけでも聞き取れれば、より気楽になるでしょう。

不安な場合は、日本人がやっている店を選べば安心かも知れません。

どこにあるの?

東京なら池袋や西川口、大阪なら難波・日本橋にお店があります。ほかの地域にもあるかも。 詳しくは Google Map で検索しましょう。

以下、ぼくが行ったお店です。

王道鸭脖 池袋店(池袋)

このお店は、麻辣燙以外に火鍋などもありました。

無限麻辣湯 食べる薬膳スープ(日本橋

オタロードのすぐ近くです。

メニューも店員さんも日本語でした。初心者にやさしいセットメニューもあります。香辛料たっぷりで体に良さそうな薬膳スープ。

張亮麻辣燙 3号店(難波)

メニューも店員さんもお客さんも中国語で、旅行の気分。茶葉蛋(お茶味の煮卵)が味しみしみで美味しかった。

今後もあちこち行ってみたいと思います。

食べましょう

おひとり様で行って気楽に食べるも良し、複数人で行ってワイワイ食べるも良し。

なかなか海外旅行に行けそうにない今、ちょっとでも旅行気分を味わうのにぴったりではないでしょうか!!!

開発記録 200311 Wed (データフレーム欠損位置を他のデータフレームにも反映)

自主課題(ということにしておきましょう。オシゴトでポチョポチョやっている開発で、どうするかなあと考えていて、家に帰って作った)。

課題

2つのデータフレームを比較したい。2つのデータフレームの行と列は共通だが、1つのデータフレームには欠損値が含まれている。欠損値があると比較できないので、前処理のひとつとして、片方の欠損値の位置をもう片方に反映する。

実行結果

raw_df1 は欠損のないデータフレームで、raw_df2 は欠損のあるデータフレーム。欠損値 Nan は、位置 (1, 2), (2, 1), (3, 0) にある。

df1 は欠損位置を反映した後のデータフレーム。位置 (1, 2), (2, 1), (3, 0) が Nan になっている。 なお、df2raw_df2 のまま。

$ python mask_nan_pandas.py 
raw_df1:
      0    1    2
0  1.0  2.0  3.0
1  1.0  2.0  3.0
2  1.0  2.0  3.0
3  1.0  2.0  3.0 

raw_df2:
      0    1    2
0  2.0  4.0  6.0
1  2.0  4.0  NaN
2  2.0  NaN  6.0
3  NaN  4.0  6.0 

--------------------
df1:
      0    1    2
0  1.0  2.0  3.0
1  1.0  2.0  NaN
2  1.0  NaN  3.0
3  NaN  2.0  3.0 

df2:
      0    1    2
0  2.0  4.0  6.0
1  2.0  4.0  NaN
2  2.0  NaN  6.0
3  NaN  4.0  6.0 

メモ:欠損値 np.nan かどうかを判定する

欠損値同士を == で比較しても False となってしまうため、欠損値かどうかを判定するには np.isnan()math.isnan() を使う。

👉 NumPyの配列ndarrayの欠損値np.nanを他の値に置換 | note.nkmk.me

メモ:df.itertuples() で行ごとに読む

参考 👉 pandas.DataFrameのforループ処理(イテレーション) | note.nkmk.me

for i, row in enumerate(df.itertuples()):
        print(row)

 ↓

Pandas(Index=0, _1=2.0, _2=4.0, _3=6.0)
Pandas(Index=1, _1=2.0, _2=4.0, _3=nan)
Pandas(Index=2, _1=2.0, _2=nan, _3=6.0)
Pandas(Index=3, _1=nan, _2=4.0, _3=6.0)

コード

もっとスマートでシンプルなやり方があるんじゃないかと思いつつ、分からなくてこうなった。

# mask_nan_pandas.py
import numpy as np
import pandas as pd


# 生のデータフレームを作る
def make_df():
    df1 = pd.DataFrame({\
        '0':[1, 1, 1, 1],\
        '1':[2, 2, 2, 2],\
        '2':[3, 3, 3, 3]\
    }, dtype=np.float32)

    df2 = pd.DataFrame({\
        '0':[2, 2, 2, np.nan],\
        '1':[4, 4, np.nan, 4],\
        '2':[6, np.nan, 6, 6]\
    }, dtype=np.float32)

    return df1, df2


# データフレーム内の欠損値を探し、リストで返す
def get_iloc_nan(df):
    iloc_nan_list = []
    for i, row in enumerate(df.itertuples()):
        for j, value in enumerate(row[1:]):
            if np.isnan(value):
                iloc_nan_list.append((i, j))
    return iloc_nan_list


# 位置を指定して NaN で置き換える
def mask(df1, df2):
    for locat in get_iloc_nan(df2):
        df1.iloc[locat[0], locat[1]] = np.nan
    return df1, df2


if __name__ == '__main__':
    raw_df1, raw_df2 = make_df()
    print('raw_df1:\n', raw_df1, '\n')
    print('raw_df2:\n', raw_df2, '\n')
    print('-'*20)
    df1, df2 = mask(raw_df1, raw_df2)
    print('df1:\n', df1, '\n')
    print('df2:\n', df2, '\n')

開発記録 200306 Fri (お魚の本 2章, 相互情報量, 次元削減)

お魚の本 (ゼロから作る Deep Learning自然言語処理編) 2.3 カウントベースの手法 を読んで書いてみる。

2.4.1~2.4.3 相互情報量、次元削減、SVD

SVD は分かったような分からないようななので、ちゃんと計算したい。

メモ:行列の大きさを得る .shape

アレイについて。co_matrix.shape で行列の大きさ (行, 列) が得られる。

co_matrix = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]])
print(co_matrix)
print(co_matrix.shape)
↓
[[1 1 1]
 [2 2 2]
 [3 3 3]
 [4 4 4]]
(4, 3)

メモ:辞書のループに .items() を使う方法

辞書について。 word_to_id.items() で、

print(word_to_id.items())
↓
dict_items([('you', 0), ('say', 1), ('goodbye', 2), ('and', 3), ('i', 4), ('hello', 5), ('.', 6)])

タプルのリストが得られる。以下のようにループ。

for word, word_id in word_to_id.items():
    ...

count_method_small.py を実行してみた

初めに言があった。言は神と共にあった。言は神であった。

John 1-1, KJV from biblestudytools.com

 ...
text = 'In the beggining was the Word, and the Word was with God, and the Word was God.'
 ...

f:id:piijey:20200306223811p:plain
count_method_small_word.png

小さいコーパスやとどう解釈したらいいのか分からへんなあ。

開発記録 200305 Thu (お魚の本 2章, カウントベース)

今日は雨が降ったり雹が降ったり晴れたり曇ったり、山みたいな天気だった。

お魚の本 (ゼロから作る Deep Learning自然言語処理編) 2.3 カウントベースの手法 を読んで書いてみる。

2.3.2~2.3.6 単語の共起行列、コサイン類似度を使った類似単語のランキング表示

メモ:大きい順にインデックスを取る

# common/util.py
 ...
for i in (-1 * similarity).argsort():
 ...

argsort() は、配列の要素を小さい順にソートしたときのインデックスのリスト。配列にマイナスをかけて argsort() を使うと、大きい順になる。 大きい順にソートした時のインデックスのリストは、[0 2 4 5 1 3 6]

いままで sort()sorted() を使っていたけど、今回のようにリストのインデックスが他のリストのインデックスや辞書の key と共通する場合は、 argsort() を使ってループを回すと便利そう。

全部表示してみた

# study_2_3_6.py
import sys
sys.path.append('.')
from common.util import preprocess, create_co_matrix, cos_similarity, most_similar

if __name__ == '__main__':
    text = 'You say goodbye and I say hello.'
    corpus, word_to_id, id_to_word = preprocess(text)
    co_matrix = create_co_matrix(corpus, len(word_to_id))

    for idx in id_to_word:
        most_similar(id_to_word[idx], word_to_id, id_to_word, co_matrix)

[query] you
 goodbye: 0.7071067758832467
 i: 0.7071067758832467
 hello: 0.7071067758832467
 say: 0.0
 and: 0.0

[query] say
 and: 0.7071067785348971
 .: 0.4999999968750001
 you: 0.0
 goodbye: 0.0
 i: 0.0

[query] goodbye
 i: 0.9999999949999999
 you: 0.7071067758832467
 hello: 0.49999999749999996
 say: 0.0
 and: 0.0

[query] and
 say: 0.7071067785348971
 you: 0.0
 goodbye: 0.0
 i: 0.0
 hello: 0.0

[query] i
 goodbye: 0.9999999949999999
 you: 0.7071067758832467
 hello: 0.49999999749999996
 say: 0.0
 and: 0.0

[query] hello
 you: 0.7071067758832467
 goodbye: 0.49999999749999996
 i: 0.49999999749999996
 say: 0.0
 and: 0.0

[query] .
 say: 0.4999999968750001
 you: 0.0
 goodbye: 0.0
 and: 0.0
 i: 0.0