[[CHJBootCamp2018/DAY1]]

#author("2023-05-29T07:59:48+00:00;2018-08-31T09:24:33+00:00","default:ogiwiki","ogiwiki")
[[CHJBootCamp2018]]

*CHJ Boot camp DAY 1
*SQL(2) グループ化、表の結合[#sql2]

*関係データベースとSQL(1)
**グループ化と集計 [#nc10d522]
***グループ化: GROUP BY 句 [#q606ffa5]
- SELECT 列名,列名2... FROM テーブル GROUP BY 列名
--短単位表から品詞が接続詞であるものを同じ語彙素,語彙素読みのものごとにまとめて語彙素,語彙素読みの列を出力
 SELECT 語彙素,語彙素読み FROM 短単位 WHERE 品詞='接続詞' GROUP BY 語彙素,語彙素読み

-当面、既存のデータベースを使うことだけを説明します
***ORDER BY 句 (復習) [#q85c68fe]
- SELECT 列名,列名2... FROM テーブル GROUP BY 列名 ORDER BY 列名
--短単位表から品詞が接続詞であるものを同じ語彙素,語彙素読みのものごとにまとめて語彙素,語彙素読みの列を 語彙素読み,語彙素順に出力
 SELECT 語彙素,語彙素読み FROM 短単位 WHERE 品詞='接続詞' GROUP BY 語彙素,語彙素読み ORDR BY 語彙素読み,語彙素

**関係データベース(リレーショナルデータベース:RDB)
-あらゆるデータを表の組み合わせで表現する
-データを取り出すのが速い、データが壊れない、同時に処理できる
***COUNT():集計関数 [#j289ef99]
-集計した数を返す
--短単位表から品詞が接続詞であるものを同じ語彙素,語彙素読みのものごとにまとめて語彙素,語彙素読みの列と集計した語数を出力
 SELECT 語彙素,語彙素読み,count(語彙素) FROM 短単位 WHERE 品詞='接続詞' GROUP BY 語彙素,語彙素読み
--短単位表から品詞が接続詞であるものを同じ語彙素,語彙素読みのものごとにまとめて語彙素,語彙素読みの列と集計した語数を語彙素読み(アイウエオ)順で出力
 SELECT 語彙素,語彙素読み,count(語彙素) FROM 短単位 WHERE 品詞='接続詞' GROUP BY 語彙素,語彙素読み ORDER BY 語彙素読み
--短単位表から品詞が接続詞であるものを同じ語彙素,語彙素読みのものごとにまとめて語彙素,語彙素読みの列と集計した語数を語数の多い順で出力
 SELECT 語彙素,語彙素読み,count(語彙素) FROM 短単位 WHERE 品詞='接続詞' GROUP BY 語彙素,語彙素読み ORDER BY count(語彙素) DESC

-(参考)[[データベース基礎中の基礎>https://thinkit.co.jp/series/4725]]
--リレーショナルデータベースの基本 https://thinkit.co.jp/article/1042/1

***準備
-Microsoft SQL Server Management Studio(SSMS)のインストール
--https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017
--データベース(SQL Server)を利用する統合環境
**表の結合 [#g8edfd31]
-内部結合 INNER JOIN
--結合条件に一致するレコードだけを表示
-外部結合 LEFT (OUTER) JOIN
--軸にする左のテーブルのレコード全てと、結合条件に一致する右テーブルのレコードを表示。一致するものがない場合、右側はNULL(値なし)となる。

-データベースアカウント(配付資料)
--参照権限のみ

***書誌情報テーブルと結合 [#f22202ce]
-短単位・長単位テーブルとはサンプルIDで結合する
--必ずコーパスに対応する書誌情報がある(結合できないことはない)
 select top 100 *
 from 短単位 as S inner join 書誌情報 as B on S.サンプルID=B.サンプルID

***用語
-[[データベース管理システム(DBMS)>https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0]]
--[[''SQL Server''>https://ja.wikipedia.org/wiki/Microsoft_SQL_Server]], MySQL, PostgreSQL, Oracle, etc.
-データベースサーバー
-データベースインスタンス
***短単位・長単位テーブルを結合(外部結合) [#r5c82e07]
-短単位と長単位の結合にはサンプルIDと文字開始位置を使う(連番は短単位と長単位で異なる)
--対応する長単位がない場合(長単位の途中にある短単位)、NULLになる。
 select top 100 *
 from 短単位 as S left join 長単位 as L on S.サンプルID=L.サンプルID and S._文字開始位置=L._文字開始位置


-表(テーブル)
--列(カラム)
--レコード(行)
***応用:構成要素として助動詞を含む長単位名詞 [#u6f640f5]
 select s.サンプルID,s.連番,s.語彙素,l.キー,l.語彙素 from 長単位 as l
 inner join 短単位 as s
  on s.サンプルID=l.サンプルID
   and s._文字開始位置>=l._文字開始位置
   and s._文字開始位置<l._文字終了位置
 where s.サブコーパス名='平安'
 and s.品詞 like '助動詞%' and l.品詞 like '名詞%'

|>|>|>|CENTER:テーブル|h
||列名1|列名2|列名3|
|レコード1||||
|レコード2||||
***【補足】 [#yebdfb1f]
- select ''*'' from でテーブルの全ての列をもってくる
- select count(*) ''as 名前'' from テーブル ''as X'' のように列やテーブルに名前(エイリアス)を付けられる
--長いテーブル名や、集計結果などの名無しの列で使う
-[[データベースのNULLは、非常に特殊な値>https://ja.wikipedia.org/wiki/Null#SQL%E3%81%AENULL]]
--普通には比較できないので、[[is null>https://docs.microsoft.com/ja-jp/sql/t-sql/queries/is-null-transact-sql?view=sql-server-2017]]や[[ISNULL関数>https://msdn.microsoft.com/ja-jp/library/ms184325(v=sql.120).aspx]]等を使う

**表の結合と集計 [#j93d6a62]
-書誌情報テーブルと結合して作品別の語数を集計
 select 作品名, count(*) as 総語数
 from 短単位 as S inner join 書誌情報 as B on S.サンプルID=B.サンプルID
 where S.サブコーパス名 like '平安'
 group by 作品名

-クエリ(問い合わせ):データベースに対するさまざまな処理コマンド
-ビュー:(複数の)表の列を組み合わせて作る仮想的な表

-[[授業資料/表の正規化]]

*SQL(3) コーパスデータの扱い[#sql3]

**[[SQL>https://ja.wikipedia.org/wiki/SQL]]
データベース[[問い合わせ言語>https://ja.wikipedia.org/wiki/%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E8%A8%80%E8%AA%9E]]
--SQLの基本 https://thinkit.co.jp/article/1046/1
**関数のいろいろ [#k835159d]
***組み込み関数 [#c4d5a492]
-https://msdn.microsoft.com/ja-jp/library/ms174318(v=sql.120).aspx

**SELECT文
とりあえずこれだけ!覚える
-データベースからデータを選択して出力するコマンド
***[[文字列関数>https://msdn.microsoft.com/ja-jp/library/ms181984(v=sql.120).aspx]] [#fa494173]
-Excelで使ったのと同じようなものが使えるが名前が違うものも
--ExcelのSEARCH = charindex,patindex
--ExcelのMID = substring など

--SELECT 列名,列名2... FROM テーブル
---短単位表から語彙素,語彙素読みの列を(全部)出力
 SELECT 語彙素,語彙素読み FROM 短単位
---短単位表から語彙素,語彙素読みの列を最初の100行出力
 SELECT TOP 100 語彙素,語彙素読み FROM 短単位
***KWIC生成関数(ユーザー定義関数) [#f196e6e7]
-KWIC生成
--fn前文脈(サンプルID,出現書字形開始位置,長さ)
--fn後文脈(サンプルID,出現書字形開始位置,長さ)

 select top 100 dbo.fn前文脈(サンプルID,出現書字形開始位置,20),キー,dbo.fn後文脈(サンプルID,出現書字形開始位置,20) from 短単位

-WHERE条件句
-- SELECT 列名,列名2... FROM テーブル WHERE 列名='hoge'
---短単位表から品詞が接続詞であるものの語彙素,語彙素読みの列を出力
 SELECT 語彙素,語彙素読み FROM 短単位 WHERE 品詞='接続詞'
 select top 100 サンプルID,dbo.fn前文脈(サンプルID,出現書字形開始位置,20),キー,dbo.fn後文脈(サンプルID,出現書字形開始位置,20),語彙素,語彙素読み,品詞 from 短単位
 where 語彙素 like '鰻'

-LIKE 演算子とワイルドカード
--"LIKE"は"="のようなものだが、ワイルドカードを含む完全一致でない場合に使う
--- %:任意の文字列(文字なしでも可)
--- _:任意の一文字

---短単位表から品詞が形容詞ではじまるものの語彙素,語彙素読みの列を出力
 SELECT 語彙素,語彙素読み FROM 短単位 WHERE 品詞 LIKE '形容詞%'
---短単位表から品詞が接続詞で語彙素読みがカ行で始まるものの語彙素,語彙素読みの列を出力
 SELECT 語彙素,語彙素読み FROM 短単位 WHERE 品詞 LIKE '形容詞%' AND 語彙素読み LIKE '[カ-コ]%'
**BCCWJデータを使うには [#u083c19b]
 use chunagon_bccwj
-CHJとほとんど同じデータ構造。サイズが大きいことに注意
-サブコーパス名でなくBCCWJは「レジスター」((BCCWJにおけるサブコーパスは、出版/図書館/特定目的の別。))

------

-ORDER BY 句(並べ替え)
--ORDER BY 列名 (DESC)
---短単位表から品詞が接続詞であるものの語彙素,語彙素読みの列を語彙素読み順に出力
 SELECT 語彙素,語彙素読み FROM 短単位 WHERE 品詞='接続詞' ORDER BY 語彙素読み
**CASE式をつかった集計 [#c0b6f9c5]
-CASE WHEN ● THEN ○○ WHEN ■ THEN □□ ELSE △ END

*CHJ Boot camp DAY 2
  select 作品名, count(*) as 総語数,sum(CASE WHEN 本文種別='歌' THEN 1 ELSE 0 END) as 歌語数
  from 短単位 as S inner join 書誌情報 as B on S.サンプルID=B.サンプルID
  where S.サブコーパス名 like '平安'
  group by 作品名

--※本文種別でグループ化して出力した表をExcelのピボットテーブルで集計した方が早くて間違えにくい場合も。

***集計
-グループ化 GROUP BY 
-- SELECT 列名,列名2... FROM テーブル GROUP BY 列名
---短単位表から品詞が接続詞であるもののを同じ語彙素,語彙素読みのものを一行にまとめて語彙素,語彙素読みの列を出力
 SELECT 語彙素,語彙素読み FROM 短単位 WHERE 品詞='接続詞' GROUP BY 語彙素,語彙素読み
**連続する語の取り出し [#i5601bb3]
-同一の表を一語ずつずらしながら結合する。コーパスデータの扱いで頻出するテクニック。
--(前方後方共起による検索条件指定ができる)
 select top 100 s1.語彙素,s1.語彙素読み,s1.品詞,dbo.fn前文脈(s1.サンプルID,s1.出現書字形開始位置,20),s1.キー,dbo.fn後文脈(s1.サンプルID,s1.出現書字形開始位置,20)
 from 短単位 as s1 inner join 短単位 as s2 on s1.サンプルID=s2.サンプルID and s1.連番 + 10 = s2.連番
 where s2.語彙素 like '鰻'

-count 集計関数
--集計した数を返す
---短単位表から品詞が接続詞であるもののを同じ語彙素,語彙素読みのものを一行にまとめて語彙素,語彙素読みの列と集計した語数を出力
 SELECT 語彙素,語彙素読み,count(語彙素) FROM 短単位 WHERE 品詞='接続詞' GROUP BY 語彙素,語彙素読み
---短単位表から品詞が接続詞であるもののを同じ語彙素,語彙素読みのものを一行にまとめて語彙素,語彙素読みの列と集計した語数を語彙素読み(アイウエオ)順で出力
 SELECT 語彙素,語彙素読み,count(語彙素) FROM 短単位 WHERE 品詞='接続詞' GROUP BY 語彙素,語彙素読み ORDER BY 語彙素読み
---短単位表から品詞が接続詞であるもののを同じ語彙素,語彙素読みのものを一行にまとめて語彙素,語彙素読みの列と集計した語数を語数の多い順で出力
 SELECT 語彙素,語彙素読み,count(語彙素) FROM 短単位 WHERE 品詞='接続詞' GROUP BY 語彙素,語彙素読み ORDER BY count(語彙素) DESC
-【追補】「心」の一つ前に来る形容詞連体形の用例
 select s1.サンプルID,s1.出現書字形開始位置,
 dbo.fn前文脈(s1.サンプルID,s1.出現書字形開始位置,20),s1.キー,dbo.fn後文脈(s1.サンプルID,s1.出現書字形開始位置,20),s1.語彙素,s1.語彙素読み,s1.原文文字列
 from 短単位 as s1
 inner join 短単位 as s2 on s1.サンプルID=s2.サンプルID and s1.連番+10 = s2.連番
 where s1.品詞 like '形容詞%' and s1.活用形 like '連体形%' and s2.語彙素 = '心' 


***SQLの書式など(SQL Server)
-コマンドと記号は全て半角
-コマンドは大文字小文字の区別は(原則として)ない
-コマンドの切れ目のスペースやタブは余計に入っていて、改行を入れてもいい
-文字列を値として指定するときは'値'のようにシングルクオーテーションで囲む
--値として'を入れたいときは''としてエスケープ
- --でコメントアウト(実行対象外になる)。行の途中からでも可
--/* ~ */  で複数行コメントアウト
***N-gram [#p3650688]
-語彙素6グラム
 select top 100
 s1.キー+s2.キー+s3.キー+s4.キー+s5.キー+s6.キー,
 s1.語彙素+'/'+s2.語彙素+'/'+s3.語彙素+'/'+s4.語彙素+'/'+s5.語彙素+'/'+s6.語彙素
 from 短単位 as s1
  inner join 短単位 as s2 on s1.サンプルID=s2.サンプルID and s1.連番 + 10 = s2.連番
  inner join 短単位 as s3 on s2.サンプルID=s3.サンプルID and s2.連番 + 10 = s3.連番
  inner join 短単位 as s4 on s3.サンプルID=s4.サンプルID and s3.連番 + 10 = s4.連番
  inner join 短単位 as s5 on s4.サンプルID=s5.サンプルID and s4.連番 + 10 = s5.連番
  inner join 短単位 as s6 on s5.サンプルID=s6.サンプルID and s5.連番 + 10 = s6.連番
 where s1.サブコーパス名='平安' 
 order by s1.サンプルID, s1.連番

**表の結合
-(参考)SQL素人でも分かるテーブル結合(inner joinとouter join) https://qiita.com/naoki_mochizuki/items/3fda1ad6594c11d7b43c

-内部結合 INNER JOIN
-外部結合 LEFT (OUTER) JOIN
-【追補】語彙素6グラムの集計(多いもの順、記号等を含まない)
 select top 100
 s1.語彙素+'/'+s2.語彙素+'/'+s3.語彙素+'/'+s4.語彙素+'/'+s5.語彙素+'/'+s6.語彙素 , count(*)
 from 短単位 as s1
  inner join 短単位 as s2 on s1.サンプルID=s2.サンプルID and s1.連番 + 10 = s2.連番
  inner join 短単位 as s3 on s2.サンプルID=s3.サンプルID and s2.連番 + 10 = s3.連番
  inner join 短単位 as s4 on s3.サンプルID=s4.サンプルID and s3.連番 + 10 = s4.連番
  inner join 短単位 as s5 on s4.サンプルID=s5.サンプルID and s4.連番 + 10 = s5.連番
  inner join 短単位 as s6 on s5.サンプルID=s6.サンプルID and s5.連番 + 10 = s6.連番
 where s1.サブコーパス名='明治・大正' 
 and s1.品詞+s2.品詞+s3.品詞+s4.品詞+s5.品詞+s6.品詞 not like '%記号%'
 and s1.品詞+s2.品詞+s3.品詞+s4.品詞+s5.品詞+s6.品詞 not like '%空白%'
 group by s1.語彙素+'/'+s2.語彙素+'/'+s3.語彙素+'/'+s4.語彙素+'/'+s5.語彙素+'/'+s6.語彙素
 order by count(*) desc


***【追補】N語以内の指定 [#ic333ad6]
-「食う」の前方5語以内に来る 名詞+を
 select s1.サンプルID,s1.出現書字形開始位置,
 dbo.fn前文脈(s1.サンプルID,s1.出現書字形開始位置,20),s1.キー,dbo.fn後文脈(s1.サンプルID,s1.出現書字形開始位置,20)
 from 短単位 as s1
  inner join 短単位 as s2 on s1.サンプルID=s2.サンプルID and s1.連番+10 = s2.連番
  inner join 短単位 as s3 on s2.サンプルID=s3.サンプルID and s2.連番+50 >= s3.連番  and s2.連番 < s3.連番
 where s1.品詞 like '名詞%' and s2.語彙素 = 'を' and s3.語彙素 ='食う'

*関係データベースとSQL(2)

**文数・文節数・語数 [#jaac463d]
 select 作品名--,S.本文種別
 ,sum(case when S.文境界 = 'B' then 1 else 0 end) as 文数
 ,sum(case when 文節='B' then 1 else 0 end) as 文節数
 ,count(L.語彙素) as 長単位数
 ,count(S.語彙素) as 短単位数
 from 短単位 as S inner join 書誌情報 as B on S.サンプルID = B.サンプルID
 left join 長単位 as L on S.サンプルID = L.サンプルID and S._文字開始位置 = L._文字開始位置
 where B.サブコーパス名 like '平安'
 group by B.作品名--,S.本文種別

**BCCWJデータ
 use chunagon_bccwj

**関数のいろいろ
***組み込み関数
-https://msdn.microsoft.com/ja-jp/library/ms174318(v=sql.120).aspx
**サブクエリ [#pb6ec402]

***ユーザー定義関数
-KWIC生成
--fn前文脈(サンプルID,出現書字形開始位置,長さ)
--fn後文脈(サンプルID,出現書字形開始位置,長さ)
括弧でくくったSELECT文に名前を付けて、あたかもテーブルであるかのように扱える

 select top 100 dbo.fn前文脈(サンプルID,出現書字形開始位置,20),キー,dbo.fn後文脈(サンプルID,出現書字形開始位置,20) from 短単位
-異なり語数
 select x.サブコーパス名, count(*) from
  (select サブコーパス名, count(*) as 語数 from 短単位 where 品詞 not like '記号%'
   group by 語彙素ID,サブコーパス名) as x
 group by x.サブコーパス名

 select top 100 サンプルID,dbo.fn前文脈(サンプルID,出現書字形開始位置,20),キー,dbo.fn後文脈(サンプルID,出現書字形開始位置,20),語彙素,語彙素読み,品詞 from 短単位
 where 語彙素 like '鰻'
-TTR(Type Token Ratio)
 select x.サブコーパス名, count(*) as 異なり語数, sum(語数) as 延べ語数, 
 CONVERT(float,count(*))/sum(語数) as TTR from
  (select サブコーパス名, count(*) as 語数 from 短単位 where 品詞 not like '%記号%'
   group by 語彙素ID,サブコーパス名) as x
 group by x.サブコーパス名

**コーパスデータを使った実習

***補足
- select ''*'' from でテーブルの全ての列をもってくる
- select count(*) ''as 名前'' from のように名前を付けられる
**辞書データベース(unidicSQL) [#g04114d3]

***(復習)表の結合
***辞書の階層化された見出し表を扱う [#j51a5c9d]

  select 作品名, count(*) as 総語数
  from 短単位 as S inner join 書誌情報 as B on S.サンプルID=B.サンプルID
  where S.サブコーパス名 like '平安'
  group by 作品名

***CASE式
-CASE WHEN ● THEN ○○ WHEN ■ THEN □□ ELSE △ END

  select 作品名, count(*) as 総語数,sum(CASE WHEN 本文種別='歌' THEN 1 ELSE 0 END) as 歌語数
  from 短単位 as S inner join 書誌情報 as B on S.サンプルID=B.サンプルID
  where S.サブコーパス名 like '平安'
  group by 作品名


***辞書の階層化された見出し表を扱う

 use unidicSQL

-語彙素
--語形
---書字形

---語彙素を出力
--語彙素を出力
 select * from 短単位語彙素 where 語彙素 like '夏%' and 語彙素読み like 'ナツ%'

---語彙素の全ての語形,入力活用型を出力
--語彙素の全ての語形,入力活用型を出力
 SELECT 語形,入力活用型 from 短単位語形 as F inner join 短単位語彙素 as L on L.語彙素ID=F.語彙素ID 
 where 語彙素 like '見る' and 語彙素読み like 'ミル'

---語彙素の全ての書字形を出力
--語彙素の全ての書字形を出力
 SELECT 語形,書字形 from 短単位書字形 as O inner join 短単位語形 as F on F.語形ID=O.語形ID inner join 短単位語彙素 as L on L.語彙素ID=F.語彙素ID 
 where 語彙素 like '見る' and 語彙素読み like 'ミル'


***コーパスと辞書を繋ぐ
***コーパスと辞書を繋ぐ [#xe64f654]

-語彙素ID, 語形ID, 書字形ID

 use chunagon_bccwj
 select L.語彙素,SUW.レジスター,count(SUW.キー) from 短単位語彙素 as L inner join chunagon_bccwj.dbo.短単位 as SUW on L.語彙素ID=SUW.語彙素ID
 where L.語彙素 like '夏%' and L.語彙素読み like 'ナツ%'
 group by L.語彙素, SUW.レジスター

***表の結合(復習)
-内部結合 INNER JOIN
-外部結合 LEFT (OUTER) JOIN

--上と同じものを外部結合
-上と同じものを外部結合
 use chunagon_bccwj
 select L.語彙素,SUW.レジスター,count(SUW.キー) from 短単位語彙素 as L left join chunagon_bccwj.dbo.短単位 as SUW on L.語彙素ID=SUW.語彙素ID
 where L.語彙素 like '夏%' and L.語彙素読み like 'ナツ%'
 group by L.語彙素, SUW.レジスター


***連続する語の取り出し
-同一の表を一語ずつずらしながら結合する(前方後方共起による検索条件指定ができる)
 select top 100 s1.語彙素,s1.語彙素読み,s1.品詞,dbo.fn前文脈(s1.サンプルID,s1.出現書字形開始位置,20),s1.キー,dbo.fn後文脈(s1.サンプルID,s1.出現書字形開始位置,20)
 from 短単位 as s1 inner join 短単位 as s2 on s1.サンプルID=s2.サンプルID and s1.連番 + 10 = s2.連番
 where s2.語彙素 like '鰻'

-N-gram
 select top 100
 s1.キー+s2.キー+s3.キー+s4.キー+s5.キー+s6.キー,
 s1.語彙素+'/'+s2.語彙素+'/'+s3.語彙素+'/'+s4.語彙素+'/'+s5.語彙素+'/'+s6.語彙素
 from 短単位 as s1
  inner join 短単位 as s2 on s1.サンプルID=s2.サンプルID and s1.連番 + 10 = s2.連番
  inner join 短単位 as s3 on s2.サンプルID=s3.サンプルID and s2.連番 + 10 = s3.連番
  inner join 短単位 as s4 on s3.サンプルID=s4.サンプルID and s3.連番 + 10 = s4.連番
  inner join 短単位 as s5 on s4.サンプルID=s5.サンプルID and s4.連番 + 10 = s5.連番
  inner join 短単位 as s6 on s5.サンプルID=s6.サンプルID and s5.連番 + 10 = s6.連番
 where s1.サブコーパス名='平安' 
 order by s1.サンプルID, s1.連番
**一時テーブルの作成 [#t97d9186]
-#で始まるテーブル名は、DB切断後削除される一時テーブルとなる。現在の権限でも一時テーブルは作成できる。
-複雑なサブクエリを書くより、一時テーブルに書き出した方が処理が早いことが多い

**サブクエリ
--SELECT カラム INTO 新しい書き込み先のテーブル FROM テーブル WHERE条件句
---権限がないのでエラー
 select * into 鰻テーブル from 短単位 where 語彙素='鰻'
---OK
 select * into #鰻テーブル from 短単位 where 語彙素='鰻'
 
 select * from #鰻テーブル

括弧でくくったSELECT文に名前を付けて、あたかもテーブルであるかのように扱える
--drop table:テーブルの削除(一時テーブル以外は権限上削除できない)
 drop table #鰻テーブル

-異なり語数
 select x.サブコーパス名, count(*) from
  (select サブコーパス名, count(*) as 語数 from 短単位 where 品詞 not like '記号%'
   group by 語彙素ID,サブコーパス名) as x
 group by x.サブコーパス名

-TTR(Type Token Ratio)
 use chunagon
 select x.サブコーパス名, count(*) as 異なり語数, sum(語数) as 延べ語数, 
 CONVERT(float,count(*))/sum(語数) as TTR from
  (select サブコーパス名, count(*) as 語数 from 短単位 where 品詞 not like '記号%'
   group by 語彙素ID,サブコーパス名) as x
 group by x.サブコーパス名
***【追補】応用例:記号を含まない短単位テーブルを作る [#dff3c47e]
 select ROW_NUMBER() OVER (PARTITION BY サンプルID ORDER BY サンプルID,連番) *10 as 新連番, *
 into #記号なし短単位
 from 短単位 where サブコーパス名='平安'
 and 品詞 not like '%記号%' and 品詞 != '空白'

***一時テーブルの作成
#で始まるテーブル名は、DB切断後削除される一時テーブルとなる。現在の権限でも一時テーブルは作成できる。
 select * from #記号なし短単位 ORDER BY サンプルID,新連番

--SELECT カラム INTO 新しい書き込み先のテーブル FROM テーブル WHERE条件句
***【追補2018/08/31】文番号の利用 [#w98fc07d]

 select * into 鰻テーブル from 短単位 where 語彙素='鰻'
-文番号の列 _文番号 が増えました。
-これを使うことで同一文中の共起語などを簡単に見つけることができます。

--CREATE TABLE テーブル名 ( 列名 データ型 , 列名2 データ型 )
 select s1.サンプルID,s1.出現書字形開始位置,
 dbo.fn前文脈(s1.サンプルID,s1.出現書字形開始位置,30),s1.キー,dbo.fn後文脈(s1.サンプルID,s1.出現書字形開始位置,30),s1.語彙素,s1.語彙素読み,s1.原文文字列
 from 短単位 as s1
 inner join 短単位 as s2 on s1.サンプルID=s2.サンプルID and s1._文番号 = s2._文番号
 where s1.語彙素 like '秋'  and s2.語彙素 like '夕%' 
 order by s1.サンプルID,s1.出現書字形開始位置

 create table #ogiso_tmp ( ID int ,調査語彙素 varchar(10) ,調査語彙素読み varchar(10) )

//***応用例:文番号入りの短単位テーブルを作る
//-SELECT文で頑張る
//-同一文中の共起語などを容易に取得できるように
//
// drop table  #短単位文番号
// 
// --文頭(文境界=B)の表(仮テーブル#文番号tmp)を連番入りで作る
// select ROW_NUMBER() over(order by サンプルID,連番) as 文番号,* into #文番号tmp from 短単位
// where サブコーパス名='奈良' and 文境界='B'
// 
// --上のテーブルを一つずらして結合して、文の開始連番と次の文の開始連番の入った表(#短単位文番号)を作る
// select a.サンプルID,a.文番号,a.連番 as 文開始連番,b.連番 as 次文開始連番 into #短単位文番号
//  from #文番号tmp as a inner join #文番号tmp as b on a.文番号+1=b.文番号
//  order by a.サンプルID,a.連番
// 
// --最初の仮テーブルを消す
// drop table  #文番号tmp
// 
// --#短単位文番号テーブルに最後の一文の情報を追加(次文開始連番は最後の語の連番)
// insert into #短単位文番号 (サンプルID,文番号,文開始連番,次文開始連番) values ('10-万葉0759_00020',4809,45380,45520) 
// 
// --短単位テーブルを#短単位文番号テーブルと結合
// select 文番号,s.* from 短単位 as s
// inner join #短単位文番号 as x on s.サンプルID =x.サンプルID and s.連番>=x.文開始連番 and s.連番<x.次文開始連番
// order by s.サンプルID,s.連番

**受講者アンケート

*質疑・相談会 [#ef5de054]


**受講者アンケート [#t1f487f5]
-https://docs.google.com/forms/d/1Xe3Jk_lvUWZ06FTNP85tJdBZLNcjF8howa7NjoBEnUE/


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS