Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
文字列処理 / Python String
Search
kaityo256
PRO
November 01, 2022
Education
0
1.7k
文字列処理 / Python String
プログラミング基礎同演習
kaityo256
PRO
November 01, 2022
Tweet
Share
More Decks by kaityo256
See All by kaityo256
SSH公開鍵認証による接続 / Connecting with SSH Public Key Authentication
kaityo256
PRO
2
220
論文紹介のやり方 / How to review
kaityo256
PRO
15
77k
デバッグの話 / Debugging for Beginners
kaityo256
PRO
9
1.4k
ビット演算の話 / Let's play with bit operations
kaityo256
PRO
6
430
GNU Makeの使い方 / How to use GNU Make
kaityo256
PRO
15
5.1k
制限ボルツマンマシンの話 / Introduction of RBM
kaityo256
PRO
3
1.1k
論文の読み方 / How to survey
kaityo256
PRO
219
160k
リンゴゲームと貧富の差 / Origin of the disparity of wealth
kaityo256
PRO
14
14k
渡辺研Slackの使い方 / Slack Local Rule
kaityo256
PRO
9
9k
Other Decks in Education
See All in Education
統計学に必要な数学(線形代数含む)
kosugitti
0
330
Data Representation - Lecture 3 - Information Visualisation (4019538FNR)
signer
PRO
1
2.3k
Why Did Douglass Change His Mind?
oripsolob
0
470
Ch4_-_Cours_2.pdf
bernhardsvt
0
200
子どものためのプログラミング道場『CoderDojo』〜法人提携例〜 / Partnership with CoderDojo Japan
coderdojojapan
4
15k
Juvenile in Justice
oripsolob
0
490
横浜翠嵐高校 職業講話 / Talk for YOKOHAMA SUIRAN 2024
mura_mi
0
170
SkimaTalk Teacher Guidelines
skimatalk
0
710k
系統性を意識したプログラミング教育~ガチャを実装しよう~
asial_edu
0
270
小学校プログラミング教育、次の5年に向けて 〜つくること・学ぶことの歓びへ〜 /NextGenerationOfProgrammingEducation
kiriem
2
410
諸外国の理科カリキュラムにおけるビッグアイデアの構造比較
arumakan
0
140
探究的な学び:Monaca Educationで学ぶプログラミングとちょっとした課題解決
asial_edu
0
250
Featured
See All Featured
Building Adaptive Systems
keathley
41
2.5k
Building a Modern Day E-commerce SEO Strategy
aleyda
39
7.2k
Rails Girls Zürich Keynote
gr2m
94
13k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
30k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
135
33k
Side Projects
sachag
452
42k
Designing for humans not robots
tammielis
250
25k
Facilitating Awesome Meetings
lara
53
6.3k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.4k
The Pragmatic Product Professional
lauravandoore
33
6.5k
Transcript
1 35 文字列処理 プログラミング基礎同演習 慶應義塾大学理工学部物理情報工学科 渡辺
2 35 辞書 正規表現 文字とはなにか? 形態素解析
3 35 E3 81 82 メモリ上のデータ あ ディスプレイに文字を表示 この間に何が行われている?
4 35 ある文字の持つ 共通的な特徴(イデア) 文字コード (コードポイント) U+3042 符号化方法 (例: UTF-8)
11100011 10000001 10000010 あ あ MS ゴシック 字体 文字に振られた 識別番号 メモリ上での 表現方法 MS 明朝 字形 (フォント) 画面に表示する 「字の形」
5 35 文字コードとは、コンピュータで「文字」を表示するために割り当てた数字 ASCIIコードとは、ラテン文字や数字、記号などを表現する7桁の2進数 0x74: 01110100 0x65: 01100101 0x73: 01110011
0x74: 01110001 c = "test" 74 65 73 74 c メモリ 16進数:ビット表現 現代の計算機では 1バイト = 8ビット なので、最上位ビットが必ずゼロになる
6 35 01101100 01101111 01110110 01100101 l o v e
L O V E 01001100 01001111 01010110 01000101 二進表現 二進表現 ASCIIコード ASCIIコード 108 111 118 101 76 79 86 69 文字(小文字) 文字(大文字) 6ビット目を反転すると大文字と小文字が入れ替わる 大文字と小文字のアスキーコードの差は32
7 35 英語は大文字/小文字合わせて52種類 日本語は? 数字記号含めても1バイトで表現可能 (JIS X 0208の規定) ひらがな:83文字 カタカナ:86文字
漢字(JIS第一/第二水準):6355文字 文字をマルチバイトで表現
8 35 シフトJIS MS-DOSやWindowsのデフォルトの文字コード 日本語を2バイトで表現 EUC-JP UNIX系OSで広く使われている文字コード 日本語を2もしくは3バイトで表現 最上位ビットが必ず1 JISコード
電子メールに広く使われてた文字コード 文字種を切り替える 最上位ビットが必ず0 UTFは後述
9 35 Windowsマシンで ウェブページを作成 Webサーバにアップロード シフトJIS EUC-JP ウェブ閲覧者 文字化け 不適切な文字コードでデコードすると表示がおかしくなる(文字化け)
Windowsマシンで メールを送信 シフトJIS JISコード メールソフトは JISに変換 メール受信者 文字化け
10 35 「表1」という文字列を…… シフトJISで表す EUC-JPで表す JISコードで表す 1b:00011011 24:00100100 42:01000010 49:01001001
3d:00111101 1b:00011011 28:00101000 42:01000010 31:00110001 95:10010101 5c:01011100 31:00110001 c9:11001001 bd:10111101 31:00110001 2バイト目にASCIIが 表れる 最上位ビットが必ず0 漢字スタート ASCIIスタート 表 1 表 表 1 1 5c:01011100 ¥ 最上位ビットが必ず1 5cは特別な文字(エスケープ/パスの区切り)であるため、不具合を起こしやすい
11 35 1110.... 10...... 10...... 最初に「何バイト続くか」をビットで表現 2バイト目以降は「10」からスタート 1バイト目 2バイト目 3バイト目
全部で3バイト UTF-8の2バイト目以降 ※ 必ず最上位ビットが1になる
12 35 1110AAAA 10BBBBCC 10CCDDDD 連続する1がバイト数を表現 2バイト目以降の予約ビット データ部分 「あ」 U+3042
11100011 10000001 10000010 E3 81 82 0011 0000 0100 0010 3 0 4 2 「あ」 U+3042のビット表現
13 35 日本語を扱うのはややこしい (国際化はややこしい) 字体 (文字の共通概念) 文字コード (文字番号) エンコード(バイト表現) 字形(文字をどう表示するか)
抽象的 具体的
14 35 キーと値を結びつけるデータ構造 {キー1: 値1, キー2: 値2, キー3: 値3} 中括弧で囲む
キーと値をコロンでつなぐ キーと値の組をカンマで区切る ※ 他の言語では「ハッシュ」「連想配列」とも呼ばれる
15 35 リストは、数字と要素を結びつける a = ["Apple", "Banana", "Orange"] a[0] a[1]
a[2] 0 1 2 "Apple" "Banana" "Orange" インデックス 要素(文字列)
16 35 辞書は、キーと要素を結びつける d = {"Apple": 158, "Banana" : 198,
"Orange" : 100} d["Apple"] d["Banana"] d["Orange"] 158 198 100 158 198 100 キー(文字列) 要素(整数)
17 35 d = {} 空の辞書を宣言する d["Apple"] = 198 キーと値を結びつける
キーから値を参照する print(d["Apple"]) 198
18 35 d[1] = "One" キーや要素はどんなものでも指定できる ※ キーはイミュータブルでなければならない 同じ辞書に異なる種類のキーや要素が共存できる d["Two"]
= 2 存在しないキーを参照するとエラー d["Key"] KeyError: 'Key'
19 35 for k in d: print(k) d = {"Apple":
158, "Banana": 198, "Orange": 100} 辞書にfor文を適用するとキーを取得できる Apple Banana Orange itemsを使うと、キーと値を同時に取得できる for k, v in d.items(): print(k, v) Apple 158 Banana 198 Orange 100
20 35 辞書は存在しないキーを参照するとエラー d["Key"] KeyError: 'Key' from collections import defaultdict
d = defaultdict(int) defaultdictを使うと、デフォルト値を指定できる d["Key"] 0
21 35 文字や単語の出現頻度のカウント from collections import defaultdict d = defaultdict(int)
s = "すもももももももものうち" for c in list(s): d[c] += 1 for k, v in d.items(): print(k, v) す 1 も 8 の 1 う 1 ち 1 知っているとたまに便利
22 35 隴西《ろうさい》の李徴《りちょう》は博学|才穎《さいえ い》、天宝の末年、若くして名を虎榜《こぼう》に連ね、つ いで江南尉《こうなんい》に補せられたが、性、狷介《けん かい》、自《みずか》ら恃《たの》むところ頗《すこぶ》る 厚く、賤吏《せんり》に甘んずるを潔《いさぎよ》しとしな かった。 「山月記」中島敦 ー
青空文庫より 漢字の読み仮名が《と》に囲まれたテキストがある この《と》に囲まれた部分を削除したい どうすればよいか?
23 35 ・文字を一文字ずつ処理 ・ 《と》に囲まれた状態か判定 ・囲まれた状態ならスキップ ・囲まれていなければ表示 in_bracket = False
for s in list(text): if in_bracket: if s == '》': in_bracket = False continue if s == '《': in_bracket = True continue print(s, end="") print()
24 35 import re print(re.sub(r'《.*?》', '', text)) import一行、コマンド一発 隴西の李徴は博学|才穎、天宝の末年、若くして名を虎榜に連ね、ついで江南 尉に補せられたが、性、狷介、自ら恃むところ頗る厚く、賤吏に甘んずるを潔
しとしなかった。 隴西《ろうさい》の李徴《りちょう》は博学|才穎《さいえい》、天宝の末年、 若くして名を虎榜《こぼう》に連ね、ついで江南尉《こうなんい》に補せられた が、性、狷介《けんかい》、自《みずか》ら恃《たの》むところ頗《すこぶ》る 厚く、賤吏《せんり》に甘んずるを潔《いさぎよ》しとしなかった。 《.*?》 この呪文のような文字列が正規表現
25 35 文字列の集合を一つの文字列で表現する方法 正規表現 正規表現が表すパターンを持つ文字列集合 a.e aae マッチする abe academic
ace ade aee 文字列の一部に、正規表現が表す文字列集合の要素を発見
26 35 正規表現内で特別な働きをする文字をメタ文字と呼ぶ . 任意の一文字にマッチ * 直前のパターンが0回以上繰り返す ? 直前のパターンが0回か1回出現 +
直前のパターンが1回以上繰り返す 代表的なメタ文字
27 35 . 任意の一文字にマッチ * 直前のパターンが0回以上繰り返す ? 直前のパターンが0回か1回出現 + 直前のパターンが1回以上繰り返す
.*bc bc xxxbc xxxbcyyy .?bc .+bc bc xxxbc xxxbcyyy bc xxxbc xxxbcyyy
28 35 re.sub(r'《.*?》', '', text) 先程のコマンドの意味は? re.sub(r'正規表現', '置き換える文字列', 元の文字列) 《.*?》
《で始まり 何か文字が 0文字以上あるような文字列で 最短マッチで 》で終わる
29 35 メタ文字を使ってパターンを表現し、 パターンにマッチする文字列集合を表現する 正規表現の利用例 より複雑な文字列検索 より複雑な文字列置換 「2020年→令和2年」みたいに西暦を和暦に変換したい 「TODO:コメント」のコメントだけ抽出したい 人生に必須ではないが、知っていると便利
30 35 形態素解析とは、与えられた文章を 意味を持つ言葉の最小単位(形態素)に 分解すること (品詞分解) My name is Taro.
所有限定詞 一般名詞 be動詞 三人称単数 固有名詞 英語の場合、単語の分解はしなくてよい
31 35 私の名前は太郎です 私 の 名前 は 太郎 です 代名詞
助詞 一般名詞 助詞 固有名詞 助動詞 日本語は単語の切れ目から探す必要がある
32 35 形態素解析ライブラリ「MeCab」をインストールし、形態素解析を行う すもももももももものうち
33 35 1. 青空文庫からURLを指定してZIPファイルをダウンロード 2. ZIPを展開し、不要な情報(ルビ等)を削除 3. 形態素解析により、出現頻度トップ10を表示
34 35 青空文庫から取得したデータでワードクラウドを作成する ワードクラウドの例(本講義ノート)
35 35