Showing preview only (1,912K chars total). Download the full file or copy to clipboard to get everything.
Repository: Estheryu991/SwissGerman_Dictionary
Branch: main
Commit: 2aaed151241d
Files: 125
Total size: 1.8 MB
Directory structure:
gitextract_ywkx76s7/
├── .eslintrc
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ └── intro.yml
├── .gitignore
├── .prettier
├── Cloud/
│ └── Speech-to-text/
│ └── README.md
├── Datensätze/
│ └── Bern/
│ └── Sandkeusch.py
├── Docs/
│ ├── Sound/
│ │ ├── sound.ogg
│ │ └── untterregle.ogg
│ └── images/
│ └── untterregle.ogg
├── Geschichte/
│ ├── EIDGENOSSENSCHAFT.md
│ └── geschichte.md
├── Gewaltenteilung/
│ └── Gewaltenteilung_Im_Rechtsstaat.md
├── Install
├── LICENSE
├── Lied/
│ ├── .gitignore
│ ├── Geburi.md
│ ├── Patent Ochsner/
│ │ └── Für immer uf di.md
│ ├── cake.less
│ └── loading.css
├── NLP/
│ └── Examples/
│ └── one/
│ ├── assignment.md
│ ├── cl.md
│ ├── example.py
│ └── number.py
├── Notebook/
│ ├── Intro.ipynb
│ ├── K_mean_clustering.ipynb
│ └── text_data.ipynb
├── README.md
├── SwissGermanBot/
│ └── login.txt
├── datasets/
│ ├── Buendnertuetsch/
│ │ └── buendnertuetsch.txt
│ ├── Jugendsprache/
│ │ └── jugendsprache.txt
│ ├── bern/
│ │ ├── W Nuss Vo Buempliz.py
│ │ └── bern.txt
│ ├── dictionary.py
│ ├── english/
│ │ └── festivalLove-eng.ipynb
│ ├── french/
│ │ └── french.txt
│ ├── img/
│ │ └── map.txt
│ ├── korean/
│ │ ├── festivalLovekr.ipynb
│ │ ├── high-kr.py
│ │ └── malLuege.py
│ ├── luzern/
│ │ └── luzern.txt
│ ├── zuerich/
│ │ ├── BlueBike.txt
│ │ ├── FestivalLove.ipynb
│ │ ├── JohnJuno.ipynb
│ │ ├── Sie het en traum gha.txt
│ │ ├── Teil_Vo_Dir.ipynb
│ │ ├── fremdi_fürenand.ipynb
│ │ ├── high.py
│ │ ├── i_ha's_immer_gwüsst.ipynb
│ │ ├── lena.ipynb
│ │ ├── malleuge.txt
│ │ ├── panama.txt
│ │ ├── teleskop.py
│ │ ├── valencia.ipynb
│ │ ├── zuerich.txt
│ │ ├── zuerichII.txt
│ │ └── zuerichbs.txt
│ └── zug/
│ └── zug.txt
├── dist/
│ ├── siriwave.esm.js
│ ├── siriwave.umd.js
│ └── typ/
│ ├── curve.d.ts
│ ├── index.d.ts
│ └── ios.d.ts
├── facts/
│ ├── ASR/
│ │ ├── DeepSpeech.md
│ │ ├── data/
│ │ │ └── alphabet.txt
│ │ └── pre-processing/
│ │ ├── audio.py
│ │ ├── ch_De_prep.py
│ │ ├── corpus_cleaning.py
│ │ ├── finden_files.py
│ │ ├── folien.py
│ │ ├── prep_vocab.py
│ │ ├── prepare_data.py
│ │ ├── shuffle_split.py
│ │ └── utf_8.sh
│ ├── GAN.md
│ ├── chrütertee.java
│ ├── semantiks.md
│ └── word2vec.md
├── src/
│ ├── context.ts
│ ├── ios9_curve.ts
│ ├── klassich.ts
│ ├── pramp/
│ │ └── algodaten/
│ │ ├── DecodeVariations/
│ │ │ ├── answer.java
│ │ │ ├── answer.txt
│ │ │ ├── answerII.py
│ │ │ ├── hints.txt
│ │ │ └── question.txt
│ │ ├── Diff Between Two Strings/
│ │ │ ├── answer.py
│ │ │ └── question.txt
│ │ ├── Island Count/
│ │ │ ├── answer.c
│ │ │ ├── hints.txt
│ │ │ └── question.txt
│ │ ├── Number of Paths/
│ │ │ ├── ans.py
│ │ │ ├── answer.txt
│ │ │ ├── hints.txt
│ │ │ └── question.txt
│ │ ├── Number_Of_Paths/
│ │ │ ├── answer.txt
│ │ │ ├── hints.txt
│ │ │ └── question.txt
│ │ ├── Root of Number/
│ │ │ ├── ans.c
│ │ │ ├── ans.java
│ │ │ ├── answer.txt
│ │ │ ├── hints.txt
│ │ │ └── question.txt
│ │ ├── Root_of_Number/
│ │ │ ├── hints.txt
│ │ │ ├── problem.txt
│ │ │ └── pseudocode.py
│ │ └── pairs_with_specific_difference/
│ │ └── answer.py
│ ├── read-Swiss-German.py
│ └── srf/
│ ├── comedy/
│ │ └── renatoKaiser.txt
│ └── dok/
│ ├── Kampf gegen die Suchttxt
│ └── KampfSucht.txt
├── swissDeutschBot/
│ ├── .gitignore
│ ├── .idee/
│ │ └── Inspektion/
│ │ ├── .gitignore
│ │ ├── GPT3api.iml
│ │ ├── miscellanious.xml
│ │ ├── modules.xml
│ │ ├── profil_einstellungen.xml
│ │ ├── projeckt_vorgaben.xml
│ │ ├── requirements.md
│ │ └── vcs.xml
│ ├── Dockerfile
│ ├── mini.py
│ └── openAI.py
└── trials/
├── bünzli.md
└── quiz.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .eslintrc
================================================
{
"parser": "@typescript-eslint/parser",
"extends": [
"plugin:@typescript-eslint/recommended", // Uses the recommended rules from the @typescript-eslint/eslint-plugin
"prettier/@typescript-eslint", // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier
"plugin:prettier/recommended" // Enables eslint-plugin-prettier and eslint-config-prettier. This will display prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array.],
],
"parserOptions": {
"ecmaVersion": 2018,
"sourceType": "module"
},
"plugins": ["prettier"],
"env": {
"browser": true
}
}
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
Wir danken Ihnen für Ihre Hilfe.
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
================================================
FILE: .github/workflows/intro.yml
================================================
# Dieser Workflow führt Tests mit node aus und veröffentlicht dann ein Paket in GitHub Packages, wenn eine Version erstellt wird
# luege https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
name: Node.js Package
on:
release:
types: [created]
jobs:
publish-npm:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: 12
registry-url: https://registry.npmjs.org/
- run: yarn install
- run: yarn build
- run: yarn publish
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
publish-gpr:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: 12
registry-url: https://npm.pkg.github.com/
- run: yarn install
- run: yarn build
- run: yarn publish
env:
NODE_AUTH_TOKEN: ${{secrets.GH_PKG_TOKEN}}
================================================
FILE: .gitignore
================================================
node_modules/
yarn-error.log
================================================
FILE: .prettier
================================================
{
"semi": true,
"trailingComma": "all",
"singleQuote": false,
"printWidth": 120,
"tabWidth": 2
}
================================================
FILE: Cloud/Speech-to-text/README.md
================================================
# Step 1: Choose [Awesome-Swiss-German Project](https://cloud.google.com/speech-to-text)
# Step 2: Enable the Speech-to-Text API
You'll be using the Speech-to-Text API in this project. Enable it by clicking Enable APIs:
Unable to enable required APIs
speech.googleapis.com
When you see a green checkmark next to all of the APIs listed above, click Next.
# Step 3:Open Cloud Shell
Cloud Shell is a built-in command-line tool for the console. In this tutorial, you use Cloud Shell to deploy your app.
Open Cloud Shell by clicking
Activate Cloud Shell.
# Step 4: Create an application
To create a new Python application, run the following command:
` mkdir speech-to-text-python && \
touch \
speech-to-text-python/app.py
`
To set the speech-to-text-python directory as your Cloud Shell workspace and open the Cloud Shell Editor, run the following command:
cd speech-to-text-python
cloudshell open-workspace .
To set your project ID in the Cloud Shell terminal, run the following command:
export PROJECT_ID=<PROJECT-ID>
To learn how to authenticate requests to this API, click Next.
# Step 5 :
Set up authentication
To call the Speech-to-Text API, your application needs to authenticate its identity to the Speech-to-Text service and obtain authorization to perform tasks.
Create a service account to authenticate your API requests:
gcloud iam service-accounts create \
speech-to-text-quickstart \
--project <PROJECT-ID>
Grant your service account the Speech-to-Text API User role:
gcloud projects \
add-iam-policy-binding \
<PROJECT-ID> --member \
serviceAccount:speech-to-text-quickstart@<PROJECT-ID>.iam.gserviceaccount.com \
--role roles/speech.serviceAgent
Create a service account key:
gcloud iam service-accounts keys \
create speech-to-text-key.json \
--iam-account \
speech-to-text-quickstart@<PROJECT-ID>.iam.gserviceaccount.com
Set the key as your default credentials:
export \
GOOGLE_APPLICATION_CREDENTIALS=speech-to-text-key.json
To learn how to call the Speech-to-Text API, click Next.
Call the Speech-to-Text API
Open `app.py` in the [Cloud Shell Editor](https://cloud.google.com/shell/docs/editor-overview?hl=en-GB)
in the Cloud Shell Editor by running the following command in your terminal:
` cloudshell open app.py`
Install the Speech-to-Text client library:
` pip3 install --upgrade \
google-cloud-speech`
In `app.py`, import the Speech-to-Text client library at the beginning of the file:
from google.cloud import speech
Create a Speech-to-Text API client and add a variable that points to the path of the example audio file provided:
` # Instantiates a client
client = speech.SpeechClient()
# The name of the audio file to transcribe
gcs_uri = "gs://cloud-samples-data/speech/brooklyn_bridge.raw" `
Add the following code, which transcribes your audio file using the specified configuration, then prints the transcription:
` def transcribe_speech():
audio = speech.RecognitionAudio(uri=gcs_uri)
config = speech.RecognitionConfig(
encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
sample_rate_hertz=16000,
language_code="en-US",
)
# Detects speech in the audio file
response = client.recognize(config=config, audio=audio)
for result in response.results:
print("Transcript: {}".format(result.alternatives[0].transcript)) `
At the end of your app.py file, call transcribeSpeech():
` transcribe_speech() `
From your terminal, run your application.
` python3 app.py `
You should now see the transcribed message in your terminal:
` Transcript: Wie alt isch die ETH Zurich. `
To avoid incurring charges to your account and learn about next steps, click Next.
# Step 7: Clean up
Delete the file containing your service account key.
` rm speech-to-text-key.json `
If you created a project specifically for this tutorial, you can delete it on the Google Cloud console Projects page.
================================================
FILE: Datensätze/Bern/Sandkeusch.py
================================================
Damals bin ich jede Tag ist Studio Gange,
Gfange i dem Bunker Homie immer wenn ich schriibe
Chömet die Erinnerige zrugg
Ich weiss no ganz genau die ganzi Nacht, han immer welle blibe
Am nächsten Tag go schaffe han immer verschlafe de Chef mich am hasse mer hend emmer müesse striite
Doch han d Lehr bestande wärs nach mim Lehrer gange wär ich scho eher gange doch ich han grisse
Trotzdem ben ich denn weg gange
Min Weg gange
Im Weg gstande send alli
Doch han sie denn weggschlage
Wie Ali, bechunnsch Herzrase vo Panik
If ich em Benz fahr dur de Abig
Nenn mich Xen Abi, mini Erfahrige zeigt
Du machsch ja gern Party und du lengsch alli in scheiss
Met dem wo t' hengsch amigs
Zu dem wirsch Schlicht Homie
Well du Wiis ziehsch Homie
Besch de lieblings Homie du weisch
Ich vermisse das Sandchaste-Lebe
Sorgefrei da mit de Kids vom Nachbar am Henge
Alles schiint guet doch es cha sich schlagartig wende
Wien Schlag idie Fressi
Mit 6i echo ahfange merke
13i ganz Tag am schwänze
Sie Herr Lehrernei es esch ned anstrengend zlerne
Doch ich han ahfange Rappe
D Jugend lebt nachem Yolo Motto bis sie met 18i sterbe
Hoff dass sie nur vo mim Sound abhängig werdend
Mal unabhängig werdet
Anstatt nur unahständig umehenget
Ständig einheitlich
Ich ha das lebe so satt
Nassdoch no chli lebe be lang nonig satt
Ich muess ja fast glaube was am mäntig und ziistig bis am friitig i de ziitig so staht, drum fick uf de Staat!
================================================
FILE: Docs/Sound/sound.ogg
================================================
================================================
FILE: Geschichte/EIDGENOSSENSCHAFT.md
================================================
Im Mittelalter schufen sich die verschiedenen Territorien, die oft auch zusammen arbeiteten, langsam, aber stetig mehr Freiraum von den imperialen Herrschern, deren Untertanen sie nominell lange waren.
Die Geschichte der Schweiz wurde stark geprägt von der Reformation und den darauf folgenden Kämpfen und Kriegen zwischen Katholiken und Protestanten.
Gegen Ende des 18. Jahrhunderts besetzte das revolutionäre Frankreich die Schweiz und errichtete die Helvetische Republik, einen zentralistischen Staat nach französischem Vorbild. Bald brachen innere Kämpfe aus, französische Truppen kamen erneut in die Schweiz.
================================================
FILE: Geschichte/geschichte.md
================================================
Vorläufer der modernen Schweiz waren die seit dem Ende des 13. Jahrhunderts als lockerer Bund organisierte Alte Eidgenossenschaft, die von 1798 bis 1803 bestehende zentralistisch aufgebaute Helvetische Republik sowie die 1803 gegründete und 1815 neu organisierte «Schweizerische Eidgenossenschaft».
================================================
FILE: Gewaltenteilung/Gewaltenteilung_Im_Rechtsstaat.md
================================================
Der Staat ist in drei Bereiche aufgeteilt: Parlament, Regierung und Gericht. Für jeden
Bereich gibt es auf den Ebenen Bund, Kantone und Gemeinden voneinander getrennte
Institutionen (Staatsorgane). Gerichte gibt es zusätzlich auf der Ebene Bezirk.
# Das Parlament (Legislative)
Gesetze erlassen (- Seite
13), Regierung und
Verwaltung kontrollieren
# Die Regierung (Exekutive)
Gesetze ausführen, re-
gieren, verwalten, den
Staat in der Innen- und
Aussenpolitik vertreten
# Das Gericht (Judikative, Justiz)
Urteilen, richten, strafen, schützen
Die Gewaltenteilung auf den Ebenen Bund, Kantone, Gemeinden
# Der Bund
# Die Schweiz
Bundesversammlung
Bundesrat
Nationalrat: 200 Mitglieder
7 Mitglieder
Ständerat: 46 Mitglieder
(Wahl durch die Vereinigte
(Wahl durch Stimmberechtigte) Bundesversammlung)
Bundesgericht
41 Mitglieder (Anzahl variierend)
(Wahl durch die Vereinigte
Bundesversammlung)
# Der Kanton
Der Stand
Kantonsrat, Grosser Rat
oder Landrat
(von den Stimmberechtigten
des Kantons gewählt)
Regierungsrat oder
Staatsrat
(von den Stimmberechtigten
des Kantons gewählt)
Kantonsgericht oder
Obergericht
(vom Kantonsrat, Grossen Rat,
Landrat gewählt)
# Die Gemeinde\ Die Stadt
Gemeinde- oder
Gemeinderat oder
Stadtparlament
Stadtrat
(Wahl durch Stimmberechtigte
Wahl durch Stimmberechtigte
der Gemeinde/Stadt)
der Gemeinde/Stadt)
Gemeinde- oder
Bürgerversammlung
(Stimmberechtigte der Gemeinde)
Kantonsgericht oder Obergericht
(vom Kantonsrat, Grossen Rat,
Landrat gewählt)
# Bezirk: Amtsgericht,
Bezirksgericht, Kreisgericht
(Wahl durch Stimmberechtigte
des Bezirks/Kreises)
Gemeinde: Vermittler/in,
Friedensrichter/in
(Wahl durch Stimmberechtigte
der Gemeinde/Stadt)
================================================
FILE: Install
================================================
conda create -n nlp_lss python=3.8
conda activate nlp_lss
pip install spacy==3.2.2
pip install pandas==1.4.1
pip install tqdm==4.62.3
pip install gensim==4.1.2
pip install beautifulsoup4==4.10.0
pip install googletrans==3.0.0
pip install matplotlib==3.5.1
pip install spacytextblob
pip install lxml==4.8.0
pip install transformers[torch]
pip install unidecode==2.8
pip install seaborn==0.11.2
pip install sklearn==0.24.1
pip install wordcloud==1.8.1
pip install fightin-words==1.0.5
pip install eli5==0.11.0
pip install flair==0.7.0
pip install tensorflow==2.4.1
pip install keras==2.4.3
pip install sentencepiece==0.1.91
pip install scikit-learn-extra==0.1.0b2
pip install pyldavis==3.2.2
pip install hdbscan==0.8.27
pip install pydot
# spacy
python -m spacy download en_core_web_sm
# nltk
pip install nltk
python -c "import nltk; nltk.download('wordnet')"
python -c "import nltk; nltk.download('stopwords')"
python -c "import nltk; nltk.download('vader_lexicon')"
# install jupyter notebook
conda install -c conda-forge jupyterlab
sudo apt install graphviz
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2022 Esther Hoeun Yu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: Lied/.gitignore
================================================
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
#DynamoDB Local files
.dynamodb/
================================================
FILE: Lied/Geburi.md
================================================
Happy Birthday
A Happy Birthday animation design in CSS3, HTML5.
URL: http://estheryu991.github.io/geburi/
Technology Used: HTML5 CSS3 jQuery GNU/Linux Digital Ocean as VPS GIMP
# Setup
## If you have python installed:
```
cd Geburi
```
&&
```
python -m SimpleHTTPServer --port 8081
```
visit http://localhost:8081 in your browser.
## If you have nodejs installed
```
npm install
```
&&
```
npm run server-node
```
visit http://localhost:8081 in your browser.
================================================
FILE: Lied/Patent Ochsner/Für immer uf di.md
================================================
Schweizer Lied findet [hier](https://www.youtube.com/watch?v=-U_awHiE2e0)
# Lyrics:
>>> "uf mueters seel wo hüt furt isch vo dr ärde
uf au die schöne ching, wo hüt z nacht gebore wärde
uf au die zyt wo isch vergange, uf au die zyt wo mir no blybt
uf au die grüene triebe, uf die zuckersüesse frücht i de böim
uf au die grosse plän & uf all die grosse tröim
uf au die wo fyre & wo singe, uf au die wo sueche
& wo villech sogar finge
es glas uf d liebi & eis uf ds voue läbe
& eis uf au das, wo mir nid chöi häbe
es tor geit uuf & nes angers geit zue
blybsch i mym härz - sogar no denn - we's afat weh tue
uf au die wo chöi vergässe, uf au die wo chöi vergäh
uf au die wones grosses härz hei & wo sech das nid lö la näh
uf ne gränzelose himu, uf nes uferloses meer
& für immer uf di
es glas uf d liebi & eis uf ds voue läbe
& eis uf au das, wo mir nid chöi häbe
es tor geit uuf & nes angers geit zue
blybsch i mym härz - sogar no denn - we's afat weh tue
uf mueters seel wo hüt furt isch vo dr ärde
uf au die schöne ching, wo hüt z nacht gebore wärde
uf au die zyt wo isch vergange, uf au die zyt wo mir no blybt"
Contributor: May
================================================
FILE: Lied/cake.less
================================================
//////////////////////////////////////////// var
@D:300px; // Control diameter
///////////////////////////////////////////
/* ============================================== POSITION
*/
.cake{
position:absolute;
display:none;
// top:30%;
left:50%;
margin-left:-(@D/2);
width:@D; height:@D;
}
/* ============================================== BASE
*/
.cake:after{
background:rgba(255,255,255,1);
border-radius:@D;
content:"";
position:absolute;
bottom:0; left:0;
width:@D; height:@D/50;
}
.cake:before{
}
/* ============================================== Candle
*/
.velas{
background:rgba(255,255,255,1);
border-radius:100%;
position:absolute;
top:50%; left:50%;
margin-left:-(@D/2)/20;
margin-top:-(@D/2)/6;
width:@D/20; height:@D/6;
}
.velas:after,
.velas:before{
background:rgba(255,0,0,0.4);
content:"";
position:absolute;
width:100%; height:@D/45;
}
.velas:after{
top:25%; left:0;
}
.velas:before{
top:45%; left:0;
}
/* ============================================== Fire
*/
.fuego{
display:none;
border-radius:100%;
box-shadow:0 0 40px 10px rgba(248,233,209,0.2);
position:absolute;
top:-12px; left:50%;
margin-left:-(@D/2)/15;
//margin-top:-(@D/2)/10;
width:@D/15; height:@D/8;
}
.fuego:nth-child(1){
-webkit-animation:fuego 2s infinite;
-moz-animation:fuego 2s infinite;
-o-animation:fuego 2s infinite;
-ms-animation:fuego 2s infinite;
animation:fuego 2s infinite;
}
.fuego:nth-child(2){
-webkit-animation:fuego 1.5s infinite;
-moz-animation:fuego 1.5s infinite;
-o-animation:fuego 1.5s infinite;
-ms-animation:fuego 1.5s infinite;
animation:fuego 1.5s infinite;
}
.fuego:nth-child(3){
-webkit-animation:fuego 1s infinite;
-moz-animation:fuego 1s infinite;
-o-animation:fuego 1s infinite;
-ms-animation:fuego 1s infinite;
animation:fuego 1s infinite;
}
.fuego:nth-child(4){
-webkit-animation:fuego 0.5s infinite;
-moz-animation:fuego 0.5s infinite;
-o-animation:fuego 0.5s infinite;
-ms-animation:fuego 0.5s infinite;
animation:fuego 0.5s infinite;
}
.fuego:nth-child(5){
-webkit-animation:fuego 0.2s infinite;
-moz-animation:fuego 0.2s infinite;
-o-animation:fuego 0.2s infinite;
-ms-animation:fuego 0.2s infinite;
animation:fuego 0.2s infinite;
}
/* ============================================== Animation Fire
*/
@-webkit-keyframes fuego{
0%{
background:rgba(254,248,97,0.5);
-webkit-transform:translateY(0) scale(1);
}
50%{
background:rgba(255,50,0,0.1);
-webkit-transform:translateY(-(@D/5)) scale(0);
}
100%{
background:rgba(254,248,97,0.5);
-webkit-transform:translateY(0) scale(1);
}
}
@-moz-keyframes fuego{
0%{
background:rgba(254,248,97,0.5);
-moz-transform:translateY(0) scale(1);
}
50%{
background:rgba(255,50,0,0.1);
-moz-transform:translateY(-(@D/5)) scale(0);
}
100%{
background:rgba(254,248,97,0.5);
-moz-transform:translateY(0) scale(1);
}
}
@-o-keyframes fuego{
0%{
background:rgba(254,248,97,0.5);
-o-transform:translateY(0) scale(1);
}
50%{
background:rgba(255,50,0,0.1);
-o-transform:translateY(-(@D/5)) scale(0);
}
100%{
background:rgba(254,248,97,0.5);
-o-transform:translateY(0) scale(1);
}
}
@-ms-keyframes fuego{
0%{
background:rgba(254,248,97,0.5);
-ms-transform:translateY(0) scale(1);
}
50%{
background:rgba(255,50,0,0.1);
-ms-transform:translateY(-(@D/5)) scale(0);
}
100%{
background:rgba(254,248,97,0.5);
-ms-transform:translateY(0) scale(1);
}
}
@keyframes fuego{
0%{
background:rgba(254,248,97,0.5);
transform:translateY(0) scale(1);
}
50%{
background:rgba(255,50,0,0.1);
transform:translateY(-(@D/5)) scale(0);
}
100%{
background:rgba(254,248,97,0.5);
transform:translateY(0) scale(1);
}
}
/* ============================================== Frosting
*/
.cobertura{
background:rgba(236,231,227,1);
border-radius:@D/2;
position:absolute;
top:60%; left:50%;
margin-left:-(@D/2)/1.8;
margin-top:-(@D/2)/10;
width:@D/1.8; height:@D/8;
z-index:10;
}
.cobertura:after,
.cobertura:before{
background:rgba(236,231,227,1);
border-radius:@D;
content:"";
position:absolute;
width:@D/20; height:@D/10;
}
.cobertura:after{
top:@D/15; right:@D/7;
}
.cobertura:before{
top:@D/10; right:@D/11;
}
/* ============================================== BIZCOCHO
*/
.bizcocho{
background:rgba(109,56,38,1);
position:absolute;
bottom:0; left:50%;
margin-left:-(@D/2)/2;
width:@D/2; height:@D/3;
}
.bizcocho:after,
.bizcocho:before{
background:rgba(236,231,227,0.6);
content:"";
position:absolute;
width:100%; height:@D/20;
}
.bizcocho:after{
top:30%; left:0;
}
.bizcocho:before{
top:60%; left:0;
}
/* ============================================== TEXT
*/
h1,
p{
font-family: 'Lato', sans-serif;
font-weight: 300;
font-style:italic;
text-align:center;
width:100%;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
================================================
FILE: Lied/loading.css
================================================
/* Absolute Center CSS Spinner */
.loading {
position: fixed;
z-index: 99999;
height: 2em;
width: 2em;
overflow: show;
margin: auto;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
/* Transparent Overlay */
.loading:before {
content: '';
display: block;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.3);
}
/* :not(:required) hides these rules from IE9 and below */
.loading:not(:required) {
/* hide "loading..." text */
font: 0/0 a;
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
.loading:not(:required):after {
content: '';
display: block;
font-size: 10px;
width: 1em;
height: 1em;
margin-top: -0.5em;
-webkit-animation: spinner 1500ms infinite linear;
-moz-animation: spinner 1500ms infinite linear;
-ms-animation: spinner 1500ms infinite linear;
-o-animation: spinner 1500ms infinite linear;
animation: spinner 1500ms infinite linear;
border-radius: 0.5em;
-webkit-box-shadow: #FFF 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, #FFF -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.5) -1.5em 0 0 0, rgba(0, 0, 0, 0.5) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;
box-shadow: #FFF 1.5em 0 0 0, rgba(0, 0, 0, 0.75) 1.1em 1.1em 0 0, rgba(0, 0, 0, 0.75) 0 1.5em 0 0, #FFF -1.1em 1.1em 0 0, rgba(0, 0, 0, 0.5) -1.5em 0 0 0, rgba(0, 0, 0, 0.5) -1.1em -1.1em 0 0, rgba(0, 0, 0, 0.75) 0 -1.5em 0 0, rgba(0, 0, 0, 0.75) 1.1em -1.1em 0 0;
}
/* Animation */
@-webkit-keyframes spinner {
0% {
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-ms-transform: rotate(360deg);
-o-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@-moz-keyframes spinner {
0% {
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-ms-transform: rotate(360deg);
-o-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@-o-keyframes spinner {
0% {
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-ms-transform: rotate(360deg);
-o-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes spinner {
0% {
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-ms-transform: rotate(360deg);
-o-transform: rotate(360deg);
transform: rotate(360deg);
}
}
================================================
FILE: NLP/Examples/one/assignment.md
================================================
Natural Language Processing
Fall 2022
Prof. Ryan Cotterell
Assignment 1: Backpropagation
29/09/2022 - 16:21h
The first half of the assignment is a series of theoretical questions about the material. When you have answered the questions to your satisfaction, you should upload a pdf file with your solutions (preferably written in LATEX) to Moodle. The second question is a coding task that is to be solved in the released Google Colab notebook. You have to copy the notebook to your own drive in order to edit it. When submitting your solution, please execute all cells in your copied notebook, then save it and include a link to your notebook in your PDF file submission. We will run software on your submission to test for plagiarism.
Important: Please ensure, that all cells in the notebook are already executed and that the notebook is accessible via the shared link in Editor mode! The notebook must also be executable from top to bottom without throwing errors.
1 Theory
Question 1: Efficiently Computing the Hessian (50 pts)
Backpropagation on a computation graph can be used to efficiently obtain the derivatives of a function with respect to the input. In this problem, we consider a differentiable map f : Rn → R. This question makes heavy use of the operator ∇ (pronounced nabla). We write ∇f(x) to denote the Jacobian of f evaluated at point x. Importantly, in the special case that the co-domain of f is simply R, we refer to the Jacobian of f as the gradient of f. When ∇f gives us a gradient, we will take it to be a column vector. Furthermore, we write ∇∇f(x) or ∇2f(x) to indicate the Hessian of f. Recall from Lecture 2 that f(x)’s Hessian is the matrix of second derivatives at point x. This notation is intuitive because the Hessian of f is simply the Jacobian of the gradient of f. You can assume that f is twice differentiable. You will now derive an algorithm to compute the Hessian ∇2f(x) using repeated calls to backpropagation.
a) (10 pts) Show that the following identity holds true:
∇2f(x) =
(∇(e⊤1 ∇f(x)))⊤
...
(∇(e⊤n ∇f(x)))⊤
(1)
where {e1, . . . , en} are the standard basis vectors of Rn, which are taken to be column vectors. In words, you are asked to demonstrate that (∇(e⊤i ∇f(x)))⊤ computes the ith row of the Hessian ∇2f(x).
Then, give an expression to compute the ith column of the Hessian that is similar to one for the ith row derived above.
1
b) (15 pts) Suppose f can be computed in O(m) time. Use the identity in equation 1, to briefly describe an efficient algorithm, based on backpropogation, for computing ∇2f(x). Discuss the runtime of your algorithm. Explain why this constitutes a faster algorithm than the more na¨ıve way of computing the Hessian entry by entry and also give the runtime of this more na¨ıve algorithm.
c) (15 pts) Now, briefly describe an algorithm to compute the tensor of 3rd-order deriva tives and discuss its runtime in terms of m. Then, explain how to produce the tensor of kth-order derivatives and discuss its runtime in terms of m. The answer for the kth-order derivative can be qualitative as it is tricky to come up with good notation.
d) (10 pts) Describe an O(m) algorithm for computing the diagonal of ∇2f(x). Hint: This is a tricky problem unless you look at it the right way. The general idea is to develop an analogue of the multivariate chain rule for elements of the Hessian’s diagonal. Then, you can develop a dynamic program very similar to backpropagation itself that has the correct runtime. Recall that the multivariate chain rule says
∂xj=X
∂zk
∂xj
and our goal is to compute ∂2yi
∂yi
M
k=1
∂yj ∂zk
Hessian.
∂xj∂xj, another notation for the diagonal elements of the 2
2 Practice
Question 2: Coding Backpropagation (50 pts)
In this question, we ask you to code backpropagation in Python in a Google Colab notebook:
https://colab.research.google.com/drive/1lSgujLn0ETFUMssy ClRAb3PlbhtUoQU?usp= sharing
There are a several cells, marked with “[do not change]”, that you are not allowed to modify! In other other cells, you may of course add more (class) functions. However, do not change the signatures of existing functions, such as class initializations. Also, you are not allowed to import any libraries other than the ones that are being automatically imported in the cell “Library Imports”.
The notebook allows you to select one of four math problems in a drop-down menu. Each math problem is represented as dict and consists of 4 key-value pairs: problem: math equation as string, in vars: dict of input variables, output: true output solution of the math problem as float and derivative: dict of the input variables’ partial derivatives.
The provided Parser class is converting the math problem into infix notation that we can perform subsequent operations on. In particular, it is taking a math problem as a string input (problem), as well as optional initialization values in vars of the problem’s input variables and returning a list infix. As a simplification, you can expect operations to be grouped, e.g. x + y + z will be (x + y) + z, so that the parser always returns lists (and sublists) of length 3 at most and individual operations (such as +) will expect 2 variables at most, as discussed in item (ii). See for instance:
exp(x) - (y * 2) −→ [[’exp’, ’x’], ’-’, [’y’, ’*’, 2]] (2) There are three cells for three classes with open ToDos for you to implement:
(i) Building: the Builder class is taking the infix notation math problem as input and instantiates the class variable self.graph with a computation graph. Class initializa tion accepts the input variables as an additional, optional argument to avoid naming conflicts with the intermediate and output variables which may be arbitrarily chosen from the set of unicode chars. You are free in choosing your own data structure for representing the computation graph. As a simplification, we do not require optimized parallelization — the order of operations should be correct and free of conflicts per taining variable-sharing. However, operations that can be executed in parallel may also be consecutively executed.
g = Builder(infix: list, in_vars: dict)
print(g.graph)
(ii) Operations: the Operator class defines functions that are used by the Executor class (item (iii)), which is defined next. You are asked to implement several child classes that all inherit from the abstract Operator class and that define the following functions:
self.fn_map = {"log": Log(), "exp": Exp(), "+": Add(),\
"-": Sub(), "ˆ": Pow(), "sin": Sin(), "*": Mult(), "/": Div()} 3
where log is the natural logarithm. In particular, each class inheriting from Operator must have a function method self.f() and a first-order partial derivative method self.df(). Both take one or two variables as an input for unary or binary operations respectively. While self.f() always returns a single float, self.df() returns a single element list of floats for unary and a two-element list of floats, i.e. a Jacobian vector, for binary operations.
(iii) Executing: the Executor class takes two dictionaries as input: the computation graph and the initialized input variables. The class should implement the functions forward and backward, which use the input variables to run a forward and backward pass on the computation graph respectively. After executing both, two class variables of the Executor class should be initialized: self.output should hold the output of the forward pass as a float value; self.derivative should hold the dictionary of first-order partial derivatives of all input variables. Given the input variables in - vars = {’x’: 2.0, ’y’: -2.0} and the computation graph b.graph as constructed in the Builder class (item (i)), the outputs should be:
e = executing.Executor(graph: dict = b.graph, in_vars: dict = in_vars) e.forward()
e.backward()
print(e.output) ## 11.39
print(e.derivative) ## {'x': 7.39, 'y': -2.0}
For grading your submission, we will run all cells in your notebook from top to bottom. In particular, we will consider the cell “Test Function for Grading”. This loads a set of math problems and executes the full pipeline of parsing, building and executing. In particular, we compare if the Executor class variables self.derivative and self.output match the true solution. Therefore, we round all floats to two decimal places.
Note: Please ensure that you share your copied notebook via a link in Editor mode. The notebook must be fully executable and all cells should be executed already!
4
================================================
FILE: NLP/Examples/one/cl.md
================================================
zb.
**Computerlinguistik und Sprachtechnologie**
Was ist Computerlinguistik und Sprachtechnologie?
Das Studienprogramm Computerlinguistik und Sprachtechnologie bietet Veranstaltungen an in den Bereichen Computerlinguistik, Sprachtechnologie, Phonetik und Sprachsignalverarbeitung, sowie kognitiver Linguistik. Das heisst, es werden allgemeine Kenntnisse in Linguistik und Informatik mit spezifischen Kenntnissen und Fähigkeiten in Computerlinguistik verknüpft. Die Grundlagenkurse in maschinellem Lernen und automatischer Sprachverarbeitung bauen auf dem Maturawissen des Bereichs Mathematik auf.
**Wann sind Sie bei uns richtig?**
Vertrautheit im Umgang mit Computern, aber keine spezifischen Vorkenntnisse
Programmieren: Keine Vorkenntnisse erforderlich, aber Interesse! Python wird obligatorisch gelehrt, später können weitere Programmiersprachen gewählt werden
Fremdsprachen: Bereitschaft, englischsprachige Fachtexte zu lesen (Kein Lateinobligatorium)
Ausgeprägte Freude am Gebrauch und der Analyse von Sprachen
Interesse an der automatischen Verarbeitung der menschlichen Sprache
Spass am Basteln von sprachtechnologischen Anwendungen und Umsetzen eigener Ideen zur Sprachverarbeitung
Interesse an Fragen der modernen Informationsgesellschaft
Mitwirken an der Flexibilisierung der Mensch-Maschine-Kommunikation
Spass am Computer als mächtiges Modellierungsinstrument
Das sagen unsere Studierenden
«Computerlinguistik: Wo Sprachen geliebt, Professor:innen geduzt und Grafikkarten ins Schwitzen gebracht werden.»
**«Die Computerlinguistik fasziniert mich, da sie Sprache und Technologie auf eine interessante Weise verbindet und es immer wieder neue Themenfelder zu entdecken gibt.»**
«Die Computerlinguistik verbindet die beiden Bereiche, die mich schon immer interessiert haben: Sprache und Informatik, eine äusserst aktuelle Studienrichtung. Wir lernen die Sachen und Technologien kennen, die frisch auf den Markt gekommen sind. Die digitale Sprachverarbeitung wird immer allgegenwärtiger, von Alexa über DeepL bis hin zu Smart Homes. Mit dem Computerlinguistik-Studium stehen einem alle Türen offen. Ob lieber Richtung Forschung, Softwareentwicklung oder Webdesign – es ist alles dabei.»
«Am CL-Studium begeistert mich, dass ich nach jeder Vorlesung mehr weiss und kann als davor. Man muss nicht einfach büffeln und auswendig lernen, sondern eignet sich Fertigkeiten an, bei denen man immer weiss, warum sie einem später etwas nützen werden. Und dass man am Puls der Zeit ist – die Forschung entwickelt sich unglaublich schnell weiter und man ist mittendrin. Man denke nur, wie Google Translate noch vor 10 Jahren übersetzte und im Gegensatz dazu, was er heute kann!»
«Ich habe das CL-Studium gewählt, weil die Berufsperspektiven gut und vielfältig sind. Man wird sich immer weiterentwickeln und neuen Herausforderungen stellen können (und auch müssen).»
================================================
FILE: NLP/Examples/one/example.py
================================================
example
n is always more than n
Lowerbound
how you define an automic automation
every node to be an dependent
N and the calculation of the output
================================================
FILE: NLP/Examples/one/number.py
================================================
import sys
import re
from pyparsing import *
import random
ROUND = 2 ## we round results to two decimal places for checking
MATH_PROBLEMS = [{'problem': 'x/y', 'in_vars': {'x': 1.0, 'y': 1.0}, 'output': 1.0, 'derivative': {'x': 1.0, 'y': -1.0}},
{'problem': 'exp(x) - (y * 2)', 'in_vars': {'x': 2.0, 'y': -2.0},'output': 11.39, 'derivative': {'x': 7.39, 'y': -2.0}},
{'problem': '(x^2 - 1) * (y+2)', 'in_vars': {'x': 3.0, 'y': 2.0}, 'output': 32.0, 'derivative': {'x': 24.0, 'y': 8.0}},
{'problem': 'z + sin(x^(2) + (y * exp(z)))', 'in_vars': {'x': 2.0, 'y': -1.0, 'z': 0.0}, 'output': 0.14, 'derivative': {'x': -3.96, 'y': -0.99, 'z': 1.99}}]
class Parser():
def __init__(self, print_res: bool = False):
self.print_res = print_res
self.expr = self.infix_notation_parser()
def parse(self, math_string: str, in_vars: dict = {}):
"""
math_string: str describing math equation, e.g. 'z + sin(x^(2) + y * exp(z))'
in_vars: optional dict of mapping between input variables and numbers
RETURN: list of infix parsed string, returns dict of input used_vars
"""
if self.print_res:
print(f"\nproblem: {math_string} with input {in_vars}")
in_vars = self.get_input_variables(math_string, in_vars)
infix_list = self.expr.parseString(math_string).asList()[0]
return infix_list, in_vars
def infix_notation_parser(self, ):
"""
RETURN: expr py_parse object
"""
ppc = pyparsing_common
ParserElement.enablePackrat()
sys.setrecursionlimit(3000)
integer = ppc.integer
variable = Word(alphas, exact=1)
operand = integer | variable
expop = Literal("^")
factop = Literal("!")
ident = Word(alphas, alphanums + "_$")
signop = oneOf("+ -")
multop = oneOf("* /")
plusop = oneOf("+ -")
#e = CaselessKeyword("E")
#pi = CaselessKeyword("PI")
expr = infixNotation(
operand,
[
(ident, 1, opAssoc.RIGHT),
(factop, 1, opAssoc.LEFT),
(expop, 2, opAssoc.RIGHT),
(signop, 1, opAssoc.RIGHT),
(multop, 2, opAssoc.LEFT),
(plusop, 2, opAssoc.LEFT),
],
)
return expr
def get_input_variables(self, math_string: str, in_vars: dict = {}):
"""
math_string: str describing math equation, e.g. 'z + sin(x^(2) + y * exp(z))'
in_vars: optional dict of mapping between input variables and numbers
RETURN: returns dict of input used_vars
"""
in_var_list = list(set(re.findall(r'(?i)(?<![a-z])[a-z](?![a-z])', math_string)))
random_in_vars = {}
filtered_in_vars = {}
for in_var in in_var_list:
if in_var not in in_vars.keys():
random_in_vars[in_var] = float(random.randint(1, 3)) ## random input
else:
filtered_in_vars[in_var] = in_vars[in_var]
if self.print_res:
print(f"generated random input {random_in_vars} and kept {filtered_in_vars}")
return {**filtered_in_vars, **random_in_vars}
def test_backprop(Builder, Executor, math_problems = None):
if math_problems == None:
math_problems = MATH_PROBLEMS
elif isinstance(math_problems, dict):
math_problems = [math_problems]
elif isinstance(math_problems, list):
pass
else:
assert "math_problems must be None, dict or list"
## set up parser
parser = Parser()
## iterate through math problems
for i, math_problem in enumerate(math_problems):
## Step 1 ________________
## the math problem is parsed into infix notation
infix_str, in_vars = parser.parse(math_problem["problem"], in_vars = math_problem["in_vars"])
## Step 2 ________________
## take infix_str and in_vars and build a computation graph
## it is not required that parallel executions are parallelized
b = Builder(infix = infix_str, in_vars = in_vars)
## Step 3 ________________
## execute the edges
## your method should set float output: x and dict derivative: {'y': -1.0, 'x': 1.0}
e = Executor(graph = b.graph, in_vars=in_vars)
e.forward()
e.backward()
## Step 4 ________________
## we are testing our solution
## output --> float comparison
print(f"\n{str(i)}: problem: {math_problem['problem']}, in_vars: {math_problem['in_vars']}")
if round(e.output,2) == round(math_problem["output"], ROUND):
print(f"SUCCESS output: {round(e.output, ROUND)}")
else:
print(f"FAILURE output: {round(e.output, ROUND)} != {math_problem['output']}")
## first derivative --> dict comparison
true_deriv = {k: round(v, ROUND) for k, v in math_problem["derivative"].items()}
e.derivative = {k: round(v,ROUND) for k,v in e.derivative.items()}
if e.derivative == true_deriv:
print(f"SUCCESS derivative: {e.derivative}")
else:
print(f"FAILURE derivative: {e.derivative} != {math_problem['derivative']}")
if __name__ == '__main__':
pass
================================================
FILE: Notebook/Intro.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"toc": true
},
"source": [
"<h1>Week 01. Text Data Essentials<span class=\"tocSkip\"></span></h1>\n",
"<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Week-01.-Introduction-to-Text-Data\" data-toc-modified-id=\"Week-01.-Introduction-to-Text-Data-1\"><span class=\"toc-item-num\">1 </span>Week 01. Introduction to Text Data</a></span></li><li><span><a href=\"#Loading-and-Inspecting-Data-with-Pandas\" data-toc-modified-id=\"Loading-and-Inspecting-Data-with-Pandas-2\"><span class=\"toc-item-num\">2 </span>Loading and Inspecting Data with Pandas</a></span><ul class=\"toc-item\"><li><span><a href=\"#Iterating-over-documents-in-a-dataframe\" data-toc-modified-id=\"Iterating-over-documents-in-a-dataframe-2.1\"><span class=\"toc-item-num\">2.1 </span>Iterating over documents in a dataframe</a></span></li><li><span><a href=\"#Saving-data\" data-toc-modified-id=\"Saving-data-2.2\"><span class=\"toc-item-num\">2.2 </span>Saving data</a></span></li></ul></li><li><span><a href=\"#Web-Scraping\" data-toc-modified-id=\"Web-Scraping-3\"><span class=\"toc-item-num\">3 </span>Web Scraping</a></span><ul class=\"toc-item\"><li><span><a href=\"#Downloading-URL's\" data-toc-modified-id=\"Downloading-URL's-3.1\"><span class=\"toc-item-num\">3.1 </span>Downloading URL's</a></span></li><li><span><a href=\"#Parsing-HTML\" data-toc-modified-id=\"Parsing-HTML-3.2\"><span class=\"toc-item-num\">3.2 </span>Parsing HTML</a></span></li><li><span><a href=\"#Removing-unicode-characters\" data-toc-modified-id=\"Removing-unicode-characters-3.3\"><span class=\"toc-item-num\">3.3 </span>Removing unicode characters</a></span></li></ul></li><li><span><a href=\"#Quantity-of-Text\" data-toc-modified-id=\"Quantity-of-Text-4\"><span class=\"toc-item-num\">4 </span>Quantity of Text</a></span></li><li><span><a href=\"#Dictionary-/-Matching-Methods\" data-toc-modified-id=\"Dictionary-/-Matching-Methods-5\"><span class=\"toc-item-num\">5 </span>Dictionary / Matching Methods</a></span><ul class=\"toc-item\"><li><span><a href=\"#Sentiment-Analysis\" data-toc-modified-id=\"Sentiment-Analysis-5.1\"><span class=\"toc-item-num\">5.1 </span>Sentiment Analysis</a></span></li><li><span><a href=\"#Sentiment-Analysis-with-Huggingface\" data-toc-modified-id=\"Sentiment-Analysis-with-Huggingface-5.2\"><span class=\"toc-item-num\">5.2 </span>Sentiment Analysis with Huggingface</a></span></li><li><span><a href=\"#StopWords\" data-toc-modified-id=\"StopWords-5.3\"><span class=\"toc-item-num\">5.3 </span>StopWords</a></span></li><li><span><a href=\"#RegEx\" data-toc-modified-id=\"RegEx-5.4\"><span class=\"toc-item-num\">5.4 </span>RegEx</a></span></li><li><span><a href=\"#WordNet\" data-toc-modified-id=\"WordNet-5.5\"><span class=\"toc-item-num\">5.5 </span>WordNet</a></span></li></ul></li></ul></div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Week 01. Introduction to Text Data\n",
"\n",
"Natural Language Processing for Law and Social Science<br>\n",
"Elliott Ash, ETH Zurich"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:19.066847Z",
"start_time": "2022-03-03T18:54:18.994527Z"
}
},
"outputs": [],
"source": [
"# set random seed\n",
"import numpy as np\n",
"np.random.seed(4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Loading and Inspecting Data with Pandas"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:19.954764Z",
"start_time": "2022-03-03T18:54:19.506368Z"
}
},
"outputs": [],
"source": [
"#import warnings; warnings.simplefilter('ignore')\n",
"# !pip install pandas\n",
"import pandas as pd\n",
"df = pd.read_csv('sc_cases.zip',compression='gzip')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:19.961024Z",
"start_time": "2022-03-03T18:54:19.955791Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 820 entries, 0 to 819\n",
"Data columns (total 10 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 case_name 786 non-null object \n",
" 1 opinion_type 820 non-null object \n",
" 2 date_standard 820 non-null object \n",
" 3 authorship 820 non-null object \n",
" 4 x_republican 803 non-null float64\n",
" 5 maj_judges 786 non-null object \n",
" 6 dissent_judges 786 non-null object \n",
" 7 topic_id 786 non-null float64\n",
" 8 cite_count 812 non-null float64\n",
" 9 opinion_text 820 non-null object \n",
"dtypes: float64(3), object(7)\n",
"memory usage: 64.2+ KB\n"
]
}
],
"source": [
"df.info() "
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:19.970882Z",
"start_time": "2022-03-03T18:54:19.961700Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>case_name</th>\n",
" <th>opinion_type</th>\n",
" <th>date_standard</th>\n",
" <th>authorship</th>\n",
" <th>x_republican</th>\n",
" <th>maj_judges</th>\n",
" <th>dissent_judges</th>\n",
" <th>topic_id</th>\n",
" <th>cite_count</th>\n",
" <th>opinion_text</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>ERICK CORNELL CLAY v. UNITED STATES</td>\n",
" <td>majority</td>\n",
" <td>2003-03-04</td>\n",
" <td>GINSBURG</td>\n",
" <td>0.0</td>\n",
" <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\n",
" <td>[]</td>\n",
" <td>1.0</td>\n",
" <td>2926.0</td>\n",
" <td>JUSTICE GINSBURG delivered the opinion of the ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>HILLSIDE DAIRY INC., A&A DAIRY, L&S DAIRY, AND...</td>\n",
" <td>majority</td>\n",
" <td>2003-06-09</td>\n",
" <td>STEVENS</td>\n",
" <td>1.0</td>\n",
" <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\n",
" <td>['THOMAS, CLARENCE']</td>\n",
" <td>8.0</td>\n",
" <td>117.0</td>\n",
" <td>Justice Stevens delivered the opinion of the C...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>CHARLES RUSSELL RHINES v. DOUGLAS WEBER, WARDEN</td>\n",
" <td>majority</td>\n",
" <td>2005-03-30</td>\n",
" <td>O'CONNOR</td>\n",
" <td>1.0</td>\n",
" <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\n",
" <td>[]</td>\n",
" <td>1.0</td>\n",
" <td>23364.0</td>\n",
" <td>Justice O'Connor delivered the opinion of the ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>NaN</td>\n",
" <td>majority</td>\n",
" <td>2005-04-15</td>\n",
" <td>KENNEDY</td>\n",
" <td>1.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>6.0</td>\n",
" <td>Justice Kennedy, Circuit Justice. \\n\\n This is...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>STATE OF ALASKA v. UNITED STATES OF AMERICA</td>\n",
" <td>majority</td>\n",
" <td>2005-06-06</td>\n",
" <td>KENNEDY</td>\n",
" <td>1.0</td>\n",
" <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\n",
" <td>['REHNQUIST, WILLIAM', 'SCALIA, ANTONIN', 'THO...</td>\n",
" <td>10.0</td>\n",
" <td>84.0</td>\n",
" <td>Justice Kennedy delivered the opinion of the C...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" case_name opinion_type \\\n",
"0 ERICK CORNELL CLAY v. UNITED STATES majority \n",
"1 HILLSIDE DAIRY INC., A&A DAIRY, L&S DAIRY, AND... majority \n",
"2 CHARLES RUSSELL RHINES v. DOUGLAS WEBER, WARDEN majority \n",
"3 NaN majority \n",
"4 STATE OF ALASKA v. UNITED STATES OF AMERICA majority \n",
"\n",
" date_standard authorship x_republican \\\n",
"0 2003-03-04 GINSBURG 0.0 \n",
"1 2003-06-09 STEVENS 1.0 \n",
"2 2005-03-30 O'CONNOR 1.0 \n",
"3 2005-04-15 KENNEDY 1.0 \n",
"4 2005-06-06 KENNEDY 1.0 \n",
"\n",
" maj_judges \\\n",
"0 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"1 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"2 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"3 NaN \n",
"4 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"\n",
" dissent_judges topic_id cite_count \\\n",
"0 [] 1.0 2926.0 \n",
"1 ['THOMAS, CLARENCE'] 8.0 117.0 \n",
"2 [] 1.0 23364.0 \n",
"3 NaN NaN 6.0 \n",
"4 ['REHNQUIST, WILLIAM', 'SCALIA, ANTONIN', 'THO... 10.0 84.0 \n",
"\n",
" opinion_text \n",
"0 JUSTICE GINSBURG delivered the opinion of the ... \n",
"1 Justice Stevens delivered the opinion of the C... \n",
"2 Justice O'Connor delivered the opinion of the ... \n",
"3 Justice Kennedy, Circuit Justice. \\n\\n This is... \n",
"4 Justice Kennedy delivered the opinion of the C... "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:19.979689Z",
"start_time": "2022-03-03T18:54:19.972244Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>case_name</th>\n",
" <th>opinion_type</th>\n",
" <th>date_standard</th>\n",
" <th>authorship</th>\n",
" <th>x_republican</th>\n",
" <th>maj_judges</th>\n",
" <th>dissent_judges</th>\n",
" <th>topic_id</th>\n",
" <th>cite_count</th>\n",
" <th>opinion_text</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>ERICK CORNELL CLAY v. UNITED STATES</td>\n",
" <td>majority</td>\n",
" <td>2003-03-04</td>\n",
" <td>GINSBURG</td>\n",
" <td>0.0</td>\n",
" <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\n",
" <td>[]</td>\n",
" <td>1.0</td>\n",
" <td>2926.0</td>\n",
" <td>JUSTICE GINSBURG delivered the opinion of the ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>HILLSIDE DAIRY INC., A&A DAIRY, L&S DAIRY, AND...</td>\n",
" <td>majority</td>\n",
" <td>2003-06-09</td>\n",
" <td>STEVENS</td>\n",
" <td>1.0</td>\n",
" <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\n",
" <td>['THOMAS, CLARENCE']</td>\n",
" <td>8.0</td>\n",
" <td>117.0</td>\n",
" <td>Justice Stevens delivered the opinion of the C...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>CHARLES RUSSELL RHINES v. DOUGLAS WEBER, WARDEN</td>\n",
" <td>majority</td>\n",
" <td>2005-03-30</td>\n",
" <td>O'CONNOR</td>\n",
" <td>1.0</td>\n",
" <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\n",
" <td>[]</td>\n",
" <td>1.0</td>\n",
" <td>23364.0</td>\n",
" <td>Justice O'Connor delivered the opinion of the ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>STATE OF ALASKA v. UNITED STATES OF AMERICA</td>\n",
" <td>majority</td>\n",
" <td>2005-06-06</td>\n",
" <td>KENNEDY</td>\n",
" <td>1.0</td>\n",
" <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\n",
" <td>['REHNQUIST, WILLIAM', 'SCALIA, ANTONIN', 'THO...</td>\n",
" <td>10.0</td>\n",
" <td>84.0</td>\n",
" <td>Justice Kennedy delivered the opinion of the C...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>REGINALD A. WILKINSON, DIRECTOR, OHIO DEPARTME...</td>\n",
" <td>majority</td>\n",
" <td>2005-06-13</td>\n",
" <td>KENNEDY</td>\n",
" <td>1.0</td>\n",
" <td>['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY...</td>\n",
" <td>[]</td>\n",
" <td>4.0</td>\n",
" <td>4230.0</td>\n",
" <td>Justice Kennedy delivered the opinion of the C...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" case_name opinion_type \\\n",
"0 ERICK CORNELL CLAY v. UNITED STATES majority \n",
"1 HILLSIDE DAIRY INC., A&A DAIRY, L&S DAIRY, AND... majority \n",
"2 CHARLES RUSSELL RHINES v. DOUGLAS WEBER, WARDEN majority \n",
"4 STATE OF ALASKA v. UNITED STATES OF AMERICA majority \n",
"5 REGINALD A. WILKINSON, DIRECTOR, OHIO DEPARTME... majority \n",
"\n",
" date_standard authorship x_republican \\\n",
"0 2003-03-04 GINSBURG 0.0 \n",
"1 2003-06-09 STEVENS 1.0 \n",
"2 2005-03-30 O'CONNOR 1.0 \n",
"4 2005-06-06 KENNEDY 1.0 \n",
"5 2005-06-13 KENNEDY 1.0 \n",
"\n",
" maj_judges \\\n",
"0 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"1 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"2 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"4 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"5 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"\n",
" dissent_judges topic_id cite_count \\\n",
"0 [] 1.0 2926.0 \n",
"1 ['THOMAS, CLARENCE'] 8.0 117.0 \n",
"2 [] 1.0 23364.0 \n",
"4 ['REHNQUIST, WILLIAM', 'SCALIA, ANTONIN', 'THO... 10.0 84.0 \n",
"5 [] 4.0 4230.0 \n",
"\n",
" opinion_text \n",
"0 JUSTICE GINSBURG delivered the opinion of the ... \n",
"1 Justice Stevens delivered the opinion of the C... \n",
"2 Justice O'Connor delivered the opinion of the ... \n",
"4 Justice Kennedy delivered the opinion of the C... \n",
"5 Justice Kennedy delivered the opinion of the C... "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# drop missing\n",
"df = df.dropna()\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:20.078271Z",
"start_time": "2022-03-03T18:54:20.075074Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"count 781\n",
"unique 27\n",
"top SCALIA\n",
"freq 86\n",
"Name: authorship, dtype: object"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Number of label categories (e.g. judges)\n",
"df['authorship'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:20.238731Z",
"start_time": "2022-03-03T18:54:20.227653Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"SCALIA 86\n",
"GINSBURG 81\n",
"THOMAS 79\n",
"KENNEDY 79\n",
"BREYER 73\n",
"SOUTER 72\n",
"STEVENS 72\n",
"O'CONNOR 52\n",
"REHNQUIST 49\n",
"ROBERTS 28\n",
"ALITO 23\n",
"Breyer 12\n",
"Roberts 10\n",
"Alito 9\n",
"Scalia 8\n",
"Thomas 8\n",
"Ginsburg 8\n",
"Stevens 7\n",
"Kennedy 7\n",
"SOTOMAYOR 6\n",
"Souter 5\n",
"STEVENS AND O'CONNOR ; REHNQUIST ; BREYER 2\n",
"STEVENS (IN PART), BREYER (IN PART) 1\n",
"JUSTICE ALITO 1\n",
"BREYER ; 1\n",
"ROBERTS , SCALIA , THOMAS , ALITO 1\n",
"Sotomayor 1\n",
"Name: authorship, dtype: int64"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# tabulations of label categories \n",
"df['authorship'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:20.382374Z",
"start_time": "2022-03-03T18:54:20.377383Z"
}
},
"outputs": [],
"source": [
"df['authorship'] = df['authorship'].str.upper()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:20.524682Z",
"start_time": "2022-03-03T18:54:20.515558Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"SCALIA 94\n",
"GINSBURG 89\n",
"THOMAS 87\n",
"KENNEDY 86\n",
"BREYER 85\n",
"STEVENS 79\n",
"SOUTER 77\n",
"O'CONNOR 52\n",
"REHNQUIST 49\n",
"ROBERTS 38\n",
"ALITO 32\n",
"SOTOMAYOR 7\n",
"STEVENS AND O'CONNOR ; REHNQUIST ; BREYER 2\n",
"STEVENS (IN PART), BREYER (IN PART) 1\n",
"JUSTICE ALITO 1\n",
"BREYER ; 1\n",
"ROBERTS , SCALIA , THOMAS , ALITO 1\n",
"Name: authorship, dtype: int64"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['authorship'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:20.658055Z",
"start_time": "2022-03-03T18:54:20.648459Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['SCALIA', 'GINSBURG', 'THOMAS', 'KENNEDY', 'BREYER', 'STEVENS',\n",
" 'SOUTER', 'O'CONNOR', 'REHNQUIST', 'ROBERTS', 'ALITO'],\n",
" dtype='object')\n"
]
}
],
"source": [
"# keep all judges through ALITO\n",
"keep_judges = df['authorship'].value_counts().index[:11]\n",
"print(keep_judges)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:20.811481Z",
"start_time": "2022-03-03T18:54:20.796104Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"SCALIA 94\n",
"GINSBURG 89\n",
"THOMAS 87\n",
"KENNEDY 86\n",
"BREYER 85\n",
"STEVENS 79\n",
"SOUTER 77\n",
"O'CONNOR 52\n",
"REHNQUIST 49\n",
"ROBERTS 38\n",
"ALITO 32\n",
"Name: authorship, dtype: int64"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = df[df['authorship'].isin(keep_judges)]\n",
"df['authorship'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:20.955563Z",
"start_time": "2022-03-03T18:54:20.943541Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 2003-03-04\n",
"1 2003-06-09\n",
"2 2005-03-30\n",
"4 2005-06-06\n",
"5 2005-06-13\n",
" ... \n",
"815 2001-04-18\n",
"816 2001-04-24\n",
"817 2001-04-24\n",
"818 2001-05-14\n",
"819 2001-05-14\n",
"Name: date_standard, Length: 768, dtype: object"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.date_standard"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:21.096221Z",
"start_time": "2022-03-03T18:54:21.080282Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0 2003-03-04\n",
"1 2003-06-09\n",
"2 2005-03-30\n",
"4 2005-06-06\n",
"5 2005-06-13\n",
" ... \n",
"815 2001-04-18\n",
"816 2001-04-24\n",
"817 2001-04-24\n",
"818 2001-05-14\n",
"819 2001-05-14\n",
"Name: date_standard, Length: 768, dtype: datetime64[ns]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['date_standard'] = pd.to_datetime(df['date_standard'])\n",
"df['date_standard']"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:21.243003Z",
"start_time": "2022-03-03T18:54:21.229193Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2001 77\n",
"2000 76\n",
"2009 74\n",
"2002 74\n",
"2004 73\n",
"2003 70\n",
"2005 70\n",
"2007 65\n",
"2010 64\n",
"2006 63\n",
"2008 62\n",
"Name: year, dtype: int64"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['year'] = df['date_standard'].dt.year\n",
"df['year'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:21.830847Z",
"start_time": "2022-03-03T18:54:21.364628Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD4CAYAAAAXUaZHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAUuElEQVR4nO3df4zc9X3n8ef7cCA5Nuc1kK4s2zoT1UqEQkPNijhKVO0GJQekivmDIiKrONSVT1daJUpOh2mlO1U66ZyTaC7QE83qiM5UbjaUFtlyaFN3YVXxByR2QjA/QlmoudhyvQoYpxvo3dF73x/zWTLZ7u7Mzs7Mej/7fEij+X4/3893Pp/35pvXfPnM7DoyE0lSXf7FSk9AktR9hrskVchwl6QKGe6SVCHDXZIqtG6lJwBwxRVX5NatWzs696c//SmXXnppdyd0gVortVpnfdZKrf2u8/jx4z/OzPfNd+yCCPetW7dy7Nixjs6dnJxkZGSkuxO6QK2VWq2zPmul1n7XGRGvLnTMZRlJqpDhLkkVMtwlqUKGuyRVyHCXpAoZ7pJUIcNdkipkuEtShQx3SarQBfEbqstx4vR5PrfvWysy9sn9n16RcSWpFe/cJalChrskVchwl6QKGe6SVCHDXZIqZLhLUoUMd0mqkOEuSRUy3CWpQoa7JFXIcJekCrUM94j4QEQ83fT4SUR8ISIui4ijEfFSed5Q+kdE3BsRUxHxTERs730ZkqRmLcM9M1/MzGsy8xrgWuBN4BFgHzCRmduAibIPcCOwrTz2Avf3YN6SpEUsdVnmeuDlzHwV2AkcKO0HgJvL9k7gwWx4EhiMiI3dmKwkqT2Rme13jvg68L3M/MOIeCMzB0t7AOcyczAijgD7M/OJcmwCuCszj815rb007uwZGhq6dnx8vKMCpl8/z9m3Ojp12a7etL6v483MzDAwMNDXMVeCddZnrdTa7zpHR0ePZ+bwfMfa/nvuEXEx8Bng7rnHMjMjov13icY5Y8AYwPDwcI6MjCzl9Hfcd/AQ95xYmT9Lf3LXSF/Hm5ycpNOf02pinfVZK7VeSHUuZVnmRhp37WfL/tnZ5ZbyPF3aTwNbms7bXNokSX2ylHD/LPCNpv3DwO6yvRs41NR+e/nWzA7gfGaeWfZMJUlta2s9IyIuBT4J/Num5v3AQxGxB3gVuLW0PwrcBEzR+GbNHV2brSSpLW2Fe2b+FLh8TttrNL49M7dvAnd2ZXaSpI74G6qSVCHDXZIqZLhLUoUMd0mqkOEuSRUy3CWpQoa7JFXIcJekChnuklQhw12SKmS4S1KFDHdJqpDhLkkVMtwlqUKGuyRVyHCXpAoZ7pJUIcNdkirUVrhHxGBEPBwRP4yIFyLioxFxWUQcjYiXyvOG0jci4t6ImIqIZyJie29LkCTN1e6d+1eBv8zMDwIfBl4A9gETmbkNmCj7ADcC28pjL3B/V2csSWqpZbhHxHrgV4AHADLz/2TmG8BO4EDpdgC4uWzvBB7MhieBwYjY2OV5S5IWEZm5eIeIa4Ax4Hkad+3Hgc8DpzNzsPQJ4FxmDkbEEWB/Zj5Rjk0Ad2XmsTmvu5fGnT1DQ0PXjo+Pd1TA9OvnOftWR6cu29Wb1vd1vJmZGQYGBvo65kqwzvqslVr7Xefo6OjxzBye79i6Ns5fB2wHficzn4qIr/KzJRgAMjMjYvF3iTkyc4zGmwbDw8M5MjKylNPfcd/BQ9xzop0yuu/krpG+jjc5OUmnP6fVxDrrs1ZqvZDqbGfN/RRwKjOfKvsP0wj7s7PLLeV5uhw/DWxpOn9zaZMk9UnLcM/Mvwd+FBEfKE3X01iiOQzsLm27gUNl+zBwe/nWzA7gfGae6e60JUmLaXc943eAgxFxMfAKcAeNN4aHImIP8Cpwa+n7KHATMAW8WfpKkvqorXDPzKeB+Rbtr5+nbwJ3Lm9akqTl8DdUJalChrskVchwl6QKGe6SVCHDXZIqZLhLUoUMd0mqkOEuSRUy3CWpQoa7JFXIcJekChnuklQhw12SKmS4S1KFDHdJqpDhLkkVMtwlqUKGuyRVyHCXpAq1Fe4RcTIiTkTE0xFxrLRdFhFHI+Kl8ryhtEdE3BsRUxHxTERs72UBkqR/bil37qOZeU1mzv5D2fuAiczcBkyUfYAbgW3lsRe4v1uTlSS1ZznLMjuBA2X7AHBzU/uD2fAkMBgRG5cxjiRpiSIzW3eK+DvgHJDA1zJzLCLeyMzBcjyAc5k5GBFHgP2Z+UQ5NgHclZnH5rzmXhp39gwNDV07Pj7eUQHTr5/n7FsdnbpsV29a39fxZmZmGBgY6OuYK8E667NWau13naOjo8ebVlN+zro2X+PjmXk6In4BOBoRP2w+mJkZEa3fJX7+nDFgDGB4eDhHRkaWcvo77jt4iHtOtFtGd53cNdLX8SYnJ+n057SaWGd91kqtF1KdbS3LZObp8jwNPAJcB5ydXW4pz9Ol+2lgS9Ppm0ubJKlPWoZ7RFwaEe+d3QY+BTwLHAZ2l267gUNl+zBwe/nWzA7gfGae6frMJUkLamc9Ywh4pLGszjrgTzLzLyPiu8BDEbEHeBW4tfR/FLgJmALeBO7o+qwlSYtqGe6Z+Qrw4XnaXwOun6c9gTu7MjtJUkf8DVVJqpDhLkkVMtwlqUKGuyRVyHCXpAoZ7pJUIcNdkipkuEtShQx3SaqQ4S5JFTLcJalChrskVchwl6QKGe6SVCHDXZIqZLhLUoUMd0mqkOEuSRVqO9wj4qKI+H5EHCn7V0bEUxExFRHfjIiLS/slZX+qHN/ao7lLkhawlDv3zwMvNO1/GfhKZv4icA7YU9r3AOdK+1dKP0lSH7UV7hGxGfg08D/KfgCfAB4uXQ4AN5ftnWWfcvz60l+S1CeRma07RTwM/BfgvcC/Bz4HPFnuzomILcBfZOaHIuJZ4IbMPFWOvQx8JDN/POc19wJ7AYaGhq4dHx/vqIDp189z9q2OTl22qzet7+t4MzMzDAwM9HXMlWCd9Vkrtfa7ztHR0eOZOTzfsXWtTo6IXwWmM/N4RIx0a1KZOQaMAQwPD+fISGcvfd/BQ9xzomUZPXFy10hfx5ucnKTTn9NqYp31WSu1Xkh1tpOKHwM+ExE3Ae8G/hXwVWAwItZl5tvAZuB06X8a2AKcioh1wHrgta7PXJK0oJZr7pl5d2ZuzsytwG3AY5m5C3gcuKV02w0cKtuHyz7l+GPZztqPJKlrlvM997uAL0bEFHA58EBpfwC4vLR/Edi3vClKkpZqSYvVmTkJTJbtV4Dr5unzj8CvdWFukqQO+RuqklQhw12SKmS4S1KFDHdJqpDhLkkVMtwlqUKGuyRVyHCXpAoZ7pJUIcNdkipkuEtShQx3SaqQ4S5JFTLcJalChrskVchwl6QKGe6SVCHDXZIq1DLcI+LdEfGdiPhBRDwXEb9f2q+MiKciYioivhkRF5f2S8r+VDm+tcc1SJLmaOfO/X8Dn8jMDwPXADdExA7gy8BXMvMXgXPAntJ/D3CutH+l9JMk9VHLcM+GmbL7rvJI4BPAw6X9AHBz2d5Z9inHr4+I6NaEJUmttbXmHhEXRcTTwDRwFHgZeCMz3y5dTgGbyvYm4EcA5fh54PIuzlmS1MK6djpl5j8B10TEIPAI8MHlDhwRe4G9AENDQ0xOTnb0OkPvgS9d/Xbrjj3Q6Zw7NTMz0/cxV4J11met1Hoh1dlWuM/KzDci4nHgo8BgRKwrd+ebgdOl22lgC3AqItYB64HX5nmtMWAMYHh4OEdGRjoq4L6Dh7jnxJLK6JqTu0b6Ot7k5CSd/pxWE+usz1qp9UKqs51vy7yv3LETEe8BPgm8ADwO3FK67QYOle3DZZ9y/LHMzC7OWZLUQju3vBuBAxFxEY03g4cy80hEPA+MR8R/Br4PPFD6PwD8cURMAa8Dt/Vg3pKkRbQM98x8BvjledpfAa6bp/0fgV/ryuwkSR3xN1QlqUKGuyRVyHCXpAoZ7pJUIcNdkipkuEtShQx3SaqQ4S5JFTLcJalChrskVchwl6QKGe6SVCHDXZIqZLhLUoUMd0mqkOEuSRUy3CWpQoa7JFXIcJekCrUM94jYEhGPR8TzEfFcRHy+tF8WEUcj4qXyvKG0R0TcGxFTEfFMRGzvdRGSpJ/Xzp3728CXMvMqYAdwZ0RcBewDJjJzGzBR9gFuBLaVx17g/q7PWpK0qJbhnplnMvN7ZfsfgBeATcBO4EDpdgC4uWzvBB7MhieBwYjY2O2JS5IWFpnZfueIrcDfAB8C/ldmDpb2AM5l5mBEHAH2Z+YT5dgEcFdmHpvzWntp3NkzNDR07fj4eEcFTL9+nrNvdXTqsl29aX1fx5uZmWFgYKCvY64E66zPWqm133WOjo4ez8zh+Y6ta/dFImIA+DPgC5n5k0aeN2RmRkT77xKNc8aAMYDh4eEcGRlZyunvuO/gIe450XYZXXVy10hfx5ucnKTTn9NqYp31WSu1Xkh1tvVtmYh4F41gP5iZf16az84ut5Tn6dJ+GtjSdPrm0iZJ6pN2vi0TwAPAC5n5B02HDgO7y/Zu4FBT++3lWzM7gPOZeaaLc5YktdDOesbHgF8HTkTE06Xtd4H9wEMRsQd4Fbi1HHsUuAmYAt4E7ujmhCVJrbUM9/LBaCxw+Pp5+idw5zLnJUlaBn9DVZIqZLhLUoUMd0mqkOEuSRUy3CWpQoa7JFXIcJekChnuklQhw12SKmS4S1KFDHdJqpDhLkkVMtwlqUKGuyRVyHCXpAoZ7pJUIcNdkipkuEtShdr5B7K/HhHTEfFsU9tlEXE0Il4qzxtKe0TEvRExFRHPRMT2Xk5ekjS/du7c/ydww5y2fcBEZm4DJso+wI3AtvLYC9zfnWlKkpaiZbhn5t8Ar89p3gkcKNsHgJub2h/MhieBwYjY2KW5SpLaFJnZulPEVuBIZn6o7L+RmYNlO4BzmTkYEUeA/Zn5RDk2AdyVmcfmec29NO7uGRoaunZ8fLyjAqZfP8/Ztzo6ddmu3rS+r+PNzMwwMDDQ1zFXgnXWZ63U2u86R0dHj2fm8HzH1i33xTMzI6L1O8Q/P28MGAMYHh7OkZGRjsa/7+Ah7jmx7DI6cnLXSF/Hm5ycpNOf02pinfVZK7VeSHV2+m2Zs7PLLeV5urSfBrY09dtc2iRJfdRpuB8Gdpft3cChpvbby7dmdgDnM/PMMucoSVqilusZEfENYAS4IiJOAf8J2A88FBF7gFeBW0v3R4GbgCngTeCOHsxZktRCy3DPzM8ucOj6efomcOdyJyVJWh5/Q1WSKmS4S1KFDHdJqpDhLkkVMtwlqUKGuyRVyHCXpAoZ7pJUIcNdkipkuEtShQx3SaqQ4S5JFTLcJalChrskVchwl6QKGe6SVCHDXZIqZLhLUoUMd0mqUE/CPSJuiIgXI2IqIvb1YgxJ0sJa/gPZSxURFwH/HfgkcAr4bkQczsznuz3WStu671t9He9LV7/N5/Z9i5P7P93XcSWtPl0Pd+A6YCozXwGIiHFgJ1BduK+Ufr+p9Nvsm1gz39DUS936/9R8124rvbq2IzO7+4IRtwA3ZOZvlv1fBz6Smb89p99eYG/Z/QDwYodDXgH8uMNzV5u1Uqt11met1NrvOv91Zr5vvgO9uHNvS2aOAWPLfZ2IOJaZw12Y0gVvrdRqnfVZK7VeSHX24gPV08CWpv3NpU2S1Ce9CPfvAtsi4sqIuBi4DTjcg3EkSQvo+rJMZr4dEb8NfBu4CPh6Zj7X7XGaLHtpZxVZK7VaZ33WSq0XTJ1d/0BVkrTy/A1VSaqQ4S5JFVrV4b5a/sxBRHw9IqYj4tmmtssi4mhEvFSeN5T2iIh7S03PRMT2pnN2l/4vRcTupvZrI+JEOefeiIjFxuhhnVsi4vGIeD4inouIz9dYa0S8OyK+ExE/KHX+fmm/MiKeKnP7ZvlCARFxSdmfKse3Nr3W3aX9xYj4N03t817bC43RaxFxUUR8PyKO1FprRJws19bTEXGstK3eazczV+WDxoe1LwPvBy4GfgBctdLzWmCuvwJsB55tavuvwL6yvQ/4ctm+CfgLIIAdwFOl/TLglfK8oWxvKMe+U/pGOffGxcboYZ0bge1l+73A3wJX1VZrGXugbL8LeKrM6SHgttL+R8C/K9u/BfxR2b4N+GbZvqpct5cAV5br+aLFru2FxujDNfxF4E+AI4vNYzXXCpwErpjTtmqv3Z5fFD38H+KjwLeb9u8G7l7peS0y3638fLi/CGws2xuBF8v214DPzu0HfBb4WlP710rbRuCHTe3v9FtojD7WfIjG3xiqtlbgXwLfAz5C4zcT1829Pml8c+yjZXtd6Rdzr9nZfgtd2+WcecfocY2bgQngE8CRxeaxmmtl/nBftdfual6W2QT8qGn/VGlbLYYy80zZ/ntgqGwvVNdi7afmaV9sjJ4r/zn+yzTuaqurtSxTPA1MA0dp3H2+kZlvzzO3d+opx88Dl7P0+i9fZIxe+m/AfwD+X9lfbB6rudYE/ioijkfjz6PAKr52V+zPD+hnMjMjoqffSe3HGLMiYgD4M+ALmfmTsrTYt3n0aYx/Aq6JiEHgEeCDvRxvpUTErwLTmXk8IkZWeDq99vHMPB0RvwAcjYgfNh9cbdfuar5zX+1/5uBsRGwEKM/TpX2huhZr3zxP+2Jj9ExEvItGsB/MzD9vMY9VXStAZr4BPE5j2WAwImZvmJrn9k495fh64DWWXv9ri4zRKx8DPhMRJ4FxGkszX11kHqu21sw8XZ6nabxhX8cqvnZXc7iv9j9zcBiY/SR9N4316dn228un8TuA8+U/2b4NfCoiNpRP0z9FYw3yDPCTiNhRPn2/fc5rzTdGT5TxHwBeyMw/aDpUVa0R8b5yx05EvIfG5wov0Aj5Wxaoc3ZutwCPZWOB9TBwW/mGyZXANhofus17bZdzFhqjJzLz7szcnJlbyzwey8xdi8xjVdYaEZdGxHtnt2lcc8+ymq/dXn5A0esHjU+s/5bGeufvrfR8FpnnN4AzwP+lsda2h8aa4gTwEvDXwGWlb9D4x05eBk4Aw02v8xvAVHnc0dQ+TONCfBn4Q372m8fzjtHDOj9OY93yGeDp8riptlqBXwK+X+p8FviPpf39NAJrCvhT4JLS/u6yP1WOv7/ptX6v1PIi5dsTi13bC43Rp+t4hJ99W6aqWstYPyiP52bnsZqvXf/8gCRVaDUvy0iSFmC4S1KFDHdJqpDhLkkVMtwlqUKGuyRVyHCXpAr9f06u23fLO4nWAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df['cite_count'].hist()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:21.882734Z",
"start_time": "2022-03-03T18:54:21.831876Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"df['log_cite_count'] = np.log(df['cite_count'])\n",
"df['log_cite_count'].hist()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Save what we have done so far."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:23.031287Z",
"start_time": "2022-03-03T18:54:21.883786Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" case_name opinion_type \\\n",
"0 ERICK CORNELL CLAY v. UNITED STATES majority \n",
"1 HILLSIDE DAIRY INC., A&A DAIRY, L&S DAIRY, AND... majority \n",
"2 CHARLES RUSSELL RHINES v. DOUGLAS WEBER, WARDEN majority \n",
"4 STATE OF ALASKA v. UNITED STATES OF AMERICA majority \n",
"5 REGINALD A. WILKINSON, DIRECTOR, OHIO DEPARTME... majority \n",
".. ... ... \n",
"815 MICHAEL F. EASLEY, * GOVERNOR OF NORTH CAROLIN... majority \n",
"816 GAIL ATWATER, et al. v. CITY OF LAGO VISTA et al. majority \n",
"817 JAMES ALEXANDER, DIRECTOR, ALABAMA DEPARTMENT ... majority \n",
"818 UNITED STATES v. OAKLAND CANNABIS BUYERS' COOP... majority \n",
"819 WILBERT K. ROGERS v. TENNESSEE majority \n",
"\n",
" date_standard authorship x_republican \\\n",
"0 2003-03-04 GINSBURG 0.0 \n",
"1 2003-06-09 STEVENS 1.0 \n",
"2 2005-03-30 O'CONNOR 1.0 \n",
"4 2005-06-06 KENNEDY 1.0 \n",
"5 2005-06-13 KENNEDY 1.0 \n",
".. ... ... ... \n",
"815 2001-04-18 BREYER 0.0 \n",
"816 2001-04-24 SOUTER 1.0 \n",
"817 2001-04-24 SCALIA 1.0 \n",
"818 2001-05-14 THOMAS 1.0 \n",
"819 2001-05-14 O'CONNOR 1.0 \n",
"\n",
" maj_judges \\\n",
"0 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"1 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"2 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"4 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"5 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
".. ... \n",
"815 ['BREYER, STEPHEN', 'GINSBURG, RUTH', \"O'CONNO... \n",
"816 ['KENNEDY, ANTHONY', 'REHNQUIST, WILLIAM', 'SC... \n",
"817 ['KENNEDY, ANTHONY', \"O'CONNOR, SANDRA\", 'REHN... \n",
"818 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'KENNEDY... \n",
"819 ['GINSBURG, RUTH', 'KENNEDY, ANTHONY', \"O'CONN... \n",
"\n",
" dissent_judges topic_id cite_count \\\n",
"0 [] 1.0 2926.0 \n",
"1 ['THOMAS, CLARENCE'] 8.0 117.0 \n",
"2 [] 1.0 23364.0 \n",
"4 ['REHNQUIST, WILLIAM', 'SCALIA, ANTONIN', 'THO... 10.0 84.0 \n",
"5 [] 4.0 4230.0 \n",
".. ... ... ... \n",
"815 ['KENNEDY, ANTHONY', 'REHNQUIST, WILLIAM', 'SC... 2.0 1236.0 \n",
"816 ['BREYER, STEPHEN', 'GINSBURG, RUTH', \"O'CONNO... 1.0 3120.0 \n",
"817 ['BREYER, STEPHEN', 'GINSBURG, RUTH', 'SOUTER,... 9.0 4986.0 \n",
"818 [] 1.0 736.0 \n",
"819 ['BREYER, STEPHEN', 'SCALIA, ANTONIN', 'STEVEN... 4.0 2100.0 \n",
"\n",
" opinion_text year log_cite_count \n",
"0 JUSTICE GINSBURG delivered the opinion of the ... 2003 7.981392 \n",
"1 Justice Stevens delivered the opinion of the C... 2003 4.762174 \n",
"2 Justice O'Connor delivered the opinion of the ... 2005 10.058952 \n",
"4 Justice Kennedy delivered the opinion of the C... 2005 4.430817 \n",
"5 Justice Kennedy delivered the opinion of the C... 2005 8.349957 \n",
".. ... ... ... \n",
"815 JUSTICE BREYER delivered the opinion of the Co... 2001 7.119636 \n",
"816 JUSTICE SOUTER delivered the opinion of the Co... 2001 8.045588 \n",
"817 JUSTICE SCALIA delivered the opinion of the Co... 2001 8.514389 \n",
"818 JUSTICE THOMAS delivered the opinion of the Co... 2001 6.601230 \n",
"819 JUSTICE O'CONNOR delivered the opinion of the ... 2001 7.649693 \n",
"\n",
"[768 rows x 12 columns]\n"
]
}
],
"source": [
"df.to_pickle('sc_cases_cleaned.pkl',compression='gzip')\n",
"print(df)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Iterating over documents in a dataframe"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the following, we show how to iterate over a dataframe and three different ways of how to tokenize documents."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:24.535487Z",
"start_time": "2022-03-03T18:54:23.692986Z"
}
},
"outputs": [],
"source": [
"import spacy\n",
"# more infos at https://spacy.io/\n",
"nlp = spacy.load('en_core_web_sm')"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:34.516885Z",
"start_time": "2022-03-03T18:54:24.536688Z"
}
},
"outputs": [],
"source": [
"processed = {} # empty python dictionary for processed data\n",
"# iterate over rows\n",
"for i, row in df.iterrows():\n",
" if i >= 10:\n",
" break\n",
" docid = i # make document identifier\n",
" text = row['opinion_text'] # get text snippet\n",
" document = nlp(text) # get sentences/tokens\n",
" processed[docid] = document # add to dictionary "
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:34.519332Z",
"start_time": "2022-03-03T18:54:34.517544Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"opinion 1: JUSTICE GINSBURG delivered the opinion of the Court.\n",
"\n",
" A motion by a federal prisoner for postconviction relief under 28 U.S.C. § 2255 is subject to a one-year time limitation that generally runs from \"the date on which the judgment of conviction becomes final.\" \n",
"\n",
" opinion 2: Justice Stevens delivered the opinion of the Court. \n",
"\n",
"In most of the United States, not including California, the minimum price paid to dairy farmers producing raw milk is regulated pursuant to federal marketing orders. Those orders guarantee a uniform price for the producers,\n"
]
}
],
"source": [
"# first and second opinions\n",
"print (\"opinion 1:\", processed[0][:50], \"\\n\\n\", \"opinion 2:\", processed[1][:50])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's see in more detail what information we can extract from documents procesesd using spaCy: "
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:34.525070Z",
"start_time": "2022-03-03T18:54:34.521139Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"JUSTICE PROPN compound\n",
"GINSBURG PROPN nsubj\n",
"delivered VERB ROOT\n",
"the DET det\n",
"opinion NOUN dobj\n",
"of ADP prep\n",
"the DET det\n",
"Court PROPN pobj\n",
". PUNCT punct\n",
"\n",
"\n",
" SPACE dep\n",
"A DET det\n",
"motion NOUN nsubj\n",
"by ADP prep\n",
"a DET det\n",
"federal ADJ amod\n",
"prisoner NOUN pobj\n",
"for ADP prep\n",
"postconviction NOUN compound\n",
"relief NOUN pobj\n",
"under ADP prep\n",
"28 NUM nummod\n",
"U.S.C. PROPN compound\n",
"§ PROPN pobj\n",
"2255 NUM nummod\n",
"is AUX ROOT\n",
"subject ADJ acomp\n",
"to ADP prep\n",
"a DET det\n",
"one NUM nummod\n",
"- PUNCT punct\n",
"year NOUN compound\n",
"time NOUN compound\n",
"limitation NOUN pobj\n",
"that PRON nsubj\n",
"generally ADV advmod\n",
"runs VERB relcl\n",
"from ADP prep\n",
"\" PUNCT punct\n",
"the DET det\n",
"date NOUN pobj\n",
"on ADP prep\n",
"which PRON pobj\n",
"the DET det\n",
"judgment NOUN nsubj\n",
"of ADP prep\n",
"conviction NOUN pobj\n",
"becomes VERB relcl\n",
"final ADJ acomp\n",
". PUNCT punct\n",
"\" PUNCT punct\n"
]
}
],
"source": [
"for token in processed[0][:50]:\n",
" print(token.text, token.pos_, token.dep_)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"alternatively, we can preprocess with gensim"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:35.152483Z",
"start_time": "2022-03-03T18:54:34.525947Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"opinion 1: ['justice', 'ginsburg', 'delivered', 'the', 'opinion', 'of', 'the', 'court', 'motion', 'by', 'federal', 'prisoner', 'for', 'postconviction', 'relief', 'under', 'is', 'subject', 'to', 'one', 'year', 'time', 'limitation', 'that', 'generally', 'runs', 'from', 'the', 'date', 'on', 'which', 'the', 'judgment', 'of', 'conviction', 'becomes', 'final', 'this', 'case', 'concerns', 'the', 'starting', 'date', 'for', 'the', 'one', 'year', 'limitation', 'it', 'presents'] \n",
"\n",
" opinion 2: ['justice', 'stevens', 'delivered', 'the', 'opinion', 'of', 'the', 'court', 'in', 'most', 'of', 'the', 'united', 'states', 'not', 'including', 'california', 'the', 'minimum', 'price', 'paid', 'to', 'dairy', 'farmers', 'producing', 'raw', 'milk', 'is', 'regulated', 'pursuant', 'to', 'federal', 'marketing', 'orders', 'those', 'orders', 'guarantee', 'uniform', 'price', 'for', 'the', 'producers', 'but', 'through', 'pooling', 'mechanisms', 'require', 'the', 'processors', 'of']\n"
]
}
],
"source": [
"from gensim.utils import simple_preprocess\n",
"\n",
"processed = {} # empty python dictionary for processed data\n",
"# iterate over rows\n",
"for i, row in df.iterrows():\n",
" docid = i # make document identifier\n",
" text = row['opinion_text'] # get text snippet\n",
" document = simple_preprocess(text) # get sentences/tokens\n",
" processed[docid] = document # add to dictionary \n",
" if i > 100:\n",
" break\n",
"# first and second opinions\n",
"print (\"opinion 1:\", processed[0][:50], \"\\n\\n\", \"opinion 2:\", processed[1][:50]) # note how simple preprocess drops punctuation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"or with nltk"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:37.494062Z",
"start_time": "2022-03-03T18:54:35.153364Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"opinion 1: ['justice', 'ginsburg', 'delivered', 'the', 'opinion', 'of', 'the', 'court', '.', 'a', 'motion', 'by', 'a', 'federal', 'prisoner', 'for', 'postconviction', 'relief', 'under', '28', 'u.s.c', '.', '§', '2255', 'is', 'subject', 'to', 'a', 'one-year', 'time', 'limitation', 'that', 'generally', 'runs', 'from', '``', 'the', 'date', 'on', 'which', 'the', 'judgment', 'of', 'conviction', 'becomes', 'final', '.', \"''\", '§', '2255'] \n",
"\n",
" opinion 2: ['justice', 'stevens', 'delivered', 'the', 'opinion', 'of', 'the', 'court', '.', 'in', 'most', 'of', 'the', 'united', 'states', ',', 'not', 'including', 'california', ',', 'the', 'minimum', 'price', 'paid', 'to', 'dairy', 'farmers', 'producing', 'raw', 'milk', 'is', 'regulated', 'pursuant', 'to', 'federal', 'marketing', 'orders', '.', 'those', 'orders', 'guarantee', 'a', 'uniform', 'price', 'for', 'the', 'producers', ',', 'but', 'through']\n"
]
}
],
"source": [
"from nltk.tokenize import word_tokenize\n",
"processed = {} # empty python dictionary for processed data\n",
"# iterate over rows\n",
"for i, row in df.iterrows():\n",
" docid = i # make document identifier\n",
" text = row['opinion_text'] # get text snippet\n",
" document = word_tokenize(text.lower()) # get sentences/tokens\n",
" processed[docid] = document # add to dictionary \n",
" if i > 100:\n",
" break\n",
"# first and second opinions\n",
"print (\"opinion 1:\", processed[0][:50], \"\\n\\n\", \"opinion 2:\", processed[1][:50]) # note that we just tokenize and keep all tokens\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Saving data"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:37.554721Z",
"start_time": "2022-03-03T18:54:37.494841Z"
}
},
"outputs": [],
"source": [
"# save as python pickle\n",
"pd.to_pickle(processed, 'processed_corpus.pkl')\n",
"# delete it\n",
"import os \n",
"os.remove('processed_corpus.pkl')"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:37.557086Z",
"start_time": "2022-03-03T18:54:37.555589Z"
}
},
"outputs": [],
"source": [
"# Merging Data-frames Example\n",
"# Perform a left join:\n",
"# df_merged = pd.merge(df1,df2,on='id', how='left', validation='m:1')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Web Scraping"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Downloading URL's"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"ExecuteTime": {
"end_time": "2022-03-03T18:54:39.084595Z",
"start_time": "2022-03-03T18:54:37.557840Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"b'\\n<!DOCTYPE html>\\n<html lang=\"en\">\\n<head>\\n <meta charset=\"utf-8\"/>\\n <meta http-equiv=\"Content-Language\" content=\"en\"/>\\n <meta name=\"language\" content=\"en_us\"/>\\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"/>\\n\\n \\n <meta name=\"description\" content=\"Opinion for People v. Germany, 674 P.2d 345 \\xe2\\x80\\x94 Brought to you by Free Law Project, a non-profit dedicated to creating high qua'\n",
"\n",
"b' s = d.getElementsByTagName(\\'script\\')[0];\\n g.type = \\'text/javascript\\';\\n g.async = true;\\n g.defer = true;\\n g.src = u + \\'matomo.js\\';\\n s.parentNode.insertBefore(g, s);\\n })();\\n </script>\\n <noscript><p><img src=\"//matomo.courtlistener.com//piwik.php?idsite=1&rec=1\"\\n style=\"border:0;\" alt=\"\"/></p></noscript>\\n <!-- End Matomo Code -->\\n\\n</body>\\n</html>\\n'\n",
"\n",
"78512 characters in string.\n"
]
}
],
"source": [
"import urllib.request as urllib # Python's module for accessing web pages\n",
"url = 'https://goo.gl/VRF8Xs' # shortened URL for court case\n",
"page = urllib.urlopen(url) # open the web page\n",
"\n",
"html = page.read() # read web page contents as a string\n",
"print(html[:400]) # print first 400 characters\n",
"print()\n",
"print(html[-400:]) # print last 400 characters\n",
"print()\n",
"print(len(html),'characters in string.') # print length of string"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Parsing HTML"
]
},
{
"cell_type": "code",
"execution_count": 291,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T09:32:09.647832Z",
"start_time": "2022-02-25T09:32:09.602699Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<title>People v. Germany, 674 P.2d 345 – CourtListener.com</title>\n"
]
}
],
"source": [
"# Parse raw HTML\n",
"# !pip install beautifulsoup4\n",
"from bs4 import BeautifulSoup # package for parsing HTML\n",
"soup = BeautifulSoup(html, 'lxml') # parse html of web page\n",
"print(soup.title) # example usage: print title item"
]
},
{
"cell_type": "code",
"execution_count": 292,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T09:32:18.769526Z",
"start_time": "2022-02-25T09:32:18.758006Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"519\n"
]
}
],
"source": [
"# extract text\n",
"text = soup.get_text() # get text (remove HTML markup)\n",
"lines = text.splitlines() # split string into separate lines\n",
"print(len(lines)) # print number of lines"
]
},
{
"cell_type": "code",
"execution_count": 293,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T09:32:26.434807Z",
"start_time": "2022-02-25T09:32:26.422384Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"187\n"
]
}
],
"source": [
"lines = [line for line in lines if line != ''] # drop empty lines\n",
"print(len(lines)) # print number of lines"
]
},
{
"cell_type": "code",
"execution_count": 294,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T09:32:30.847356Z",
"start_time": "2022-02-25T09:32:30.839684Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['People v. Germany, 674 P.2d 345 – CourtListener.com', 'Toggle navigation', 'About', 'FAQ', 'Donate', 'Sign in / Register', 'From Free Law Project, a 501(c)(3) non-profit.', 'Opinions\\xa0', 'Advanced Search', 'Citation Look Up', 'Citation Visualizations', 'RECAP Archive', 'Oral Arguments', 'Judges', 'Financial Disclosures', '\\xa0Donate', 'Your Notes', ' (edit)', ' ', ' (none)']\n"
]
}
],
"source": [
"print(lines[:20]) # print first 20 lines"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Removing unicode characters"
]
},
{
"cell_type": "code",
"execution_count": 295,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T09:32:53.962331Z",
"start_time": "2022-02-25T09:32:53.952376Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['Visualizations\\xa0'] ['Visualizations ']\n"
]
}
],
"source": [
"# !pip install unidecode\n",
"from unidecode import unidecode # package for removing unicode\n",
"uncode_str = 'Visualizations\\xa0'\n",
"fixed = unidecode(uncode_str) # example usage\n",
"print([uncode_str],[fixed]) # print cleaned string (replaced with a space)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Quantity of Text"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Count words per document."
]
},
{
"cell_type": "code",
"execution_count": 301,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T09:35:39.259306Z",
"start_time": "2022-02-25T09:35:39.016620Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot:>"
]
},
"execution_count": 301,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def get_words_per_doc(txt):\n",
" # split text into words and count them.\n",
" return len(txt.split()) \n",
"\n",
"# apply to our dataframe\n",
"df['num_words'] = df['opinion_text'].apply(get_words_per_doc)\n",
"df['num_words'].hist()"
]
},
{
"cell_type": "code",
"execution_count": 302,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T09:35:42.316770Z",
"start_time": "2022-02-25T09:35:42.234336Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# plot length by year\n",
"ax = df.groupby('year')['num_words'].mean().plot()\n",
"ax.set_ylabel('Average Opinion Length')\n",
"import matplotlib.pyplot as plt\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 303,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T09:35:44.161062Z",
"start_time": "2022-02-25T09:35:43.959415Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<seaborn.axisgrid.JointGrid at 0x32c9c65b0>"
]
},
"execution_count": 303,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x432 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df['log_words'] = np.log(df['num_words'])\n",
"import seaborn as sns\n",
"sns.jointplot(data=df,x='year', y='log_words',kind='hex')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Build a frequency distribution over words with `Counter`."
]
},
{
"cell_type": "code",
"execution_count": 304,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T09:37:22.448696Z",
"start_time": "2022-02-25T09:37:22.317909Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[('the', 32485),\n",
" ('of', 16429),\n",
" ('to', 12675),\n",
" ('a', 9144),\n",
" ('that', 8737),\n",
" ('in', 8484),\n",
" ('and', 7815),\n",
" ('at', 5172),\n",
" ('for', 4569),\n",
" ('is', 4115),\n",
" ('not', 3658),\n",
" ('l.', 3297),\n",
" ('ed.', 3273),\n",
" ('as', 3108),\n",
" ('or', 2956),\n",
" ('s.', 2904),\n",
" ('ct.', 2805),\n",
" ('§', 2752),\n",
" ('court', 2667),\n",
" ('on', 2666)]"
]
},
"execution_count": 304,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from collections import Counter\n",
"freqs = Counter()\n",
"for i, row in df.iterrows():\n",
" freqs.update(row['opinion_text'].lower().split())\n",
" if i > 100:\n",
" break\n",
"freqs.most_common()[:20] # can use most frequent words as style/function words"
]
},
{
"cell_type": "markdown",
"metadata": {
"toc-hr-collapsed": false
},
"source": [
"# Dictionary / Matching Methods"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Sentiment Analysis"
]
},
{
"cell_type": "code",
"execution_count": 261,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T08:49:07.616803Z",
"start_time": "2022-02-25T08:49:07.610484Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.2.2\n"
]
}
],
"source": [
"import spacy\n",
"from spacytextblob.spacytextblob import SpacyTextBlob\n",
"print (spacy.__version__)"
]
},
{
"cell_type": "code",
"execution_count": 262,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T08:49:09.741266Z",
"start_time": "2022-02-25T08:49:08.751772Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"polarity 0.05404135338345859\n",
"subjectivity 0.5065358709273183\n"
]
}
],
"source": [
"# Dictionary-Based Sentiment Analysis\n",
"# nltk.download('vader_lexicon')\n",
"\n",
"# textblob sentiment analysis: https://github.com/sloria/TextBlob\n",
"# pip install spacytextblob\n",
"\n",
"import spacy\n",
"from spacytextblob.spacytextblob import SpacyTextBlob\n",
"\n",
"\n",
"nlp = spacy.load('en_core_web_sm')\n",
"# spacy_text_blob = SpacyTextBlob()\n",
"nlp.add_pipe('spacytextblob')\n",
"doc = nlp(df.iloc[0][\"opinion_text\"])\n",
"#from nltk.sentiment.vader import SentimentIntensityAnalyzer\n",
"#sid = SentimentIntensityAnalyzer()\n",
"#polarity = sid.polarity_scores(text)\n",
"print(\"polarity\", doc._.polarity) # sentimentintensityanalayzer nltk: {'neg': 0.134, 'neu': 0.785, 'pos': 0.081, 'compound': -0.9999}\n",
"print (\"subjectivity\", doc._.subjectivity)"
]
},
{
"cell_type": "code",
"execution_count": 263,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T08:50:48.585836Z",
"start_time": "2022-02-25T08:49:12.565542Z"
}
},
"outputs": [],
"source": [
"# sample 10% of the dataset\n",
"dfs = df.sample(frac=.1) \n",
"# apply compound sentiment score to data-frame\n",
"def get_sentiment(snippet):\n",
" #return sid.polarity_scores(snippet)['compound']\n",
" return nlp(snippet)._.polarity\n",
"dfs['sentiment'] = dfs['opinion_text'].apply(get_sentiment)"
]
},
{
"cell_type": "code",
"execution_count": 264,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T08:50:48.590377Z",
"start_time": "2022-02-25T08:50:48.586905Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[' \\n\\n This case presents the question whether uses of patented inventions in preclinical research, the',\n",
" 't. \\n\\n This case requires us to decide whether the use of race as a factor in student admissions by t',\n",
" ' \\n\\n The State of Washington prohibits labor unions from using the agency-shop fees of a nonmember f',\n",
" ' \\n\\n The question is whether the provision of the Fair Labor Standards Act of 1938 (FLSA or Act), tha',\n",
" \"t. \\n\\n We granted certiorari to resolve whether the Nevada Supreme Court's refusal to extend full fai\"]"
]
},
"execution_count": 264,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfs.sort_values('sentiment',inplace=True)\n",
"# print beginning of most positive documents\n",
"[x[50:150] for x in dfs[-5:]['opinion_text']]"
]
},
{
"cell_type": "code",
"execution_count": 265,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T08:50:48.593796Z",
"start_time": "2022-02-25T08:50:48.591101Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"['\\n\\nThe False Claims Act (FCA) imposes civil liability on any person who knowingly uses a \"false recor',\n",
" ' \\n\\nWhen an alien is found ineligible to remain in the United States, the process for selecting the c',\n",
" 'he Court. \\n\\n Petitioner Josue Leocal, a Haitian citizen who is a lawful permanent resident of the Un',\n",
" \" \\n\\n Respondent Arturo Recuenco was convicted of assault in the second degree based on the jury's fin\",\n",
" 'he Court. \\n\\n InTotten v. United States,92 U.S. 105, 23 L. Ed. 605 (1876), we held that public policy']"
]
},
"execution_count": 265,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# print beginning of most negative documents\n",
"[x[50:150] for x in dfs[:5]['opinion_text']]"
]
},
{
"cell_type": "code",
"execution_count": 266,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T08:51:03.211610Z",
"start_time": "2022-02-25T08:50:58.841088Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[' Court. \\n\\n Under the Internal Revenue Code, individuals may subtract from their adjusted gross inco',\n",
" 't and delivered an opinion, in which Justice Souter, Justice Ginsburg, and Justice Breyer join. \\n\\n T',\n",
" '.\\n\\nA citizen of Hawaii comes before us claiming that an explicit, race-based voting qualification ha',\n",
" 't and delivered the opinion of the Court with respect to Parts I, II, III, and VI, an opinion with r',\n",
" 't. \\n\\n For private actions brought under 42 U.S.C. § 1983 and other specified measures designed to s']"
]
},
"execution_count": 266,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from nltk.sentiment.vader import SentimentIntensityAnalyzer\n",
"sid = SentimentIntensityAnalyzer()\n",
"# sample 20% of the dataset\n",
"dfs = df.sample(frac=.1) \n",
"\n",
"# apply compound sentiment score to data-frame\n",
"def get_sentiment(snippet):\n",
" return sid.polarity_scores(snippet)['compound']\n",
"dfs['sentiment_vader'] = dfs['opinion_text'].apply(get_sentiment)\n",
"dfs.sort_values('sentiment_vader',inplace=True)\n",
"# print beginning of most positive documents\n",
"[x[50:150] for x in dfs[-5:]['opinion_text']]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Sentiment Analysis with Huggingface "
]
},
{
"cell_type": "code",
"execution_count": 206,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T08:06:44.820739Z",
"start_time": "2022-02-25T08:06:33.006201Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"No model was supplied, defaulted to distilbert-base-uncased-finetuned-sst-2-english (https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english)\n"
]
}
],
"source": [
"from transformers import pipeline, AutoModelForTokenClassification, AutoTokenizer\n",
"pipe = pipeline(\"sentiment-analysis\")"
]
},
{
"cell_type": "code",
"execution_count": 225,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T08:12:48.077724Z",
"start_time": "2022-02-25T08:12:33.578170Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4a535366d00343c9b7130ea1443f84d1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/768 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from torch.utils.data import Dataset\n",
"from tqdm.auto import tqdm\n",
"\n",
"class OpinionDataset(Dataset):\n",
" def __init__(self, df):\n",
" super().__init__()\n",
" self.df = df\n",
" def __len__(self):\n",
" return len(df)\n",
"\n",
" def __getitem__(self, i):\n",
" return df.iloc[i][\"opinion_text\"][:512] # BERT max seq length\n",
"\n",
"\n",
"dataset = OpinionDataset(df)\n",
"sentiments = []\n",
"\n",
"for out in tqdm(pipe(dataset, batch_size=16), total=len(dataset)):\n",
" if out['label'] == \"NEGATIVE\":\n",
" sentiments.append(-1*out['score'])\n",
" else:\n",
" sentiments.append(out['score'])"
]
},
{
"cell_type": "code",
"execution_count": 213,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T08:08:31.770176Z",
"start_time": "2022-02-25T08:08:31.762865Z"
}
},
"outputs": [],
"source": [
"df['sentiments'] = sentiments"
]
},
{
"cell_type": "code",
"execution_count": 214,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T08:08:32.130342Z",
"start_time": "2022-02-25T08:08:32.122275Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"['. \\n\\nLiberty protects the person from unwarranted government intrusions into a dwelling or other priv',\n",
" '. \\n\\nPetitioner Edward Jerome Harbison was sentenced to death by a Tennessee court in 1983. In 1997,',\n",
" '\\n\\nThis case concerns the timeliness of a complaint filed in a private securities fraud action. The ',\n",
" \"\\n\\n When a debtor files a Chapter 7 bankruptcy petition, all of the debtor's assets become property o\",\n",
" '. \\n\\n The question before us is whether the Controlled Substances Act allows the United States Attorn']"
]
},
"execution_count": 214,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.sort_values('sentiments',inplace=True)\n",
"# print beginning of most positive documents\n",
"[x[50:150] for x in df[-5:]['opinion_text']]"
]
},
{
"cell_type": "code",
"execution_count": 215,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-25T08:08:40.938052Z",
"start_time": "2022-02-25T08:08:40.924251Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[\" \\n\\n Officers executing a warrant to search for cocaine in respondent Banks's apartment knocked and a\",\n",
" ' and delivered the opinion of the Court with respect to Parts I, II, and III-A, and an opinion with ',\n",
" 't.\\n\\nThe question presented in this case is whether an anonymous tip that a person is carrying a gun ',\n",
" 't.\\n\\nPetitioner, a nonnamed member of a class certified under Federal Rule of Civil Procedure 23(b)(1',\n",
" 'The issue is whether the Burma law of the Commonwealth of Massachusetts, restricting the authority o']"
]
},
"execution_count": 215,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# print beginning of most negative documents\n",
"[x[50:150] for x in df[:5]['opinion_text']]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## StopWords"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-21T10:19:55.651335Z",
"start_time": "2022-02-21T10:19:55.649820Z"
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'quite', 'herself', 'below', 'on', 'per', 'if', 'from', 'under', 'already', 'rather', 'seemed', 'seeming', 'nine', 'and', 'whither', 'among', 'many', 'can', '‘m', 'hence', 'yourself', 'always', 'some', 'yet', 'whom', 'within', 'sometimes', 'for', 'move', 'eight', '’ve', 'formerly', 'we', 'latterly', 'herein', 'third', 'whose', 'due', 'cannot', 'back', '‘s', 'five', 'used', 'more', 'again', \"'m\", 'or', 'unless', 'during', 'before', 'towards', 'where', 'serious', 'somehow', 'my', 'after', 'itself', 'various', 'the', 'once', 'show', 'whole', 'done', 'hundred', 'mostly', 'onto', 'this', 'yours', 'without', 'above', 'until', 'both', 'its', 'those', 'few', 'say', 'himself', 'then', 'former', 'often', 'doing', 'against', 'beyond', 'else', 'not', 'be', 'all', 'his', 'toward', 'became', 'an', 'indeed', 'who', 'will', 'she', 'would', 'yourselves', 'i', 'only', \"'re\", 'next', \"n't\", 'with', 'him', 'either', 'neither', 'made', 'latter', 'is', 'moreover', 'front', 'none', 'give', 'four', 'top', 'over', 'whereby', 'beside', 'empty', 'might', 'others', 'may', 'therein', 'beforehand', 'hereupon', 'whereupon', 'twenty', 'ca', 'go', 'thereupon', 'no', 'somewhere', \"'ve\", 'now', 'ten', 'six', '‘d', 'become', 'fifty', 'was', 'ours', 'meanwhile', 'anything', 'everywhere', 'whatever', 'into', 'own', 'between', 'forty', 'sometime', 'up', 'seem', 'everything', '’ll', 'been', 'such', 'myself', 'take', 'also', 'eleven', '’m', 'nobody', 'therefore', 'you', 'her', 'our', 'which', 'someone', 'anyone', 'please', 'every', 'same', 'what', 'that', 'of', 'should', 'full', \"'d\", 'alone', 'hereafter', 'three', 'because', 'never', 'something', 'while', 'whenever', 'very', 'here', 'through', 'one', 'whoever', 'why', 'least', 'anyhow', 'nothing', 'had', 'throughout', 'at', 'thereafter', 'hereby', 'me', '’d', 'in', 'although', 'thru', 'two', 'otherwise', 'out', 'regarding', 'via', 'however', 'keep', 'though', 'across', 'see', 'behind', 'thereby', 're', 'everyone', 'sixty', 'their', 'fifteen', 'how', 'perhaps', 'last', 'afterwards', 'n’t', 'other', 'first', 'ever', 'off', 'upon', 'amongst', 'whence', 'well', 'themselves', 'twelve', \"'ll\", 'am', 'thus', 'mine', '‘ve', 'even', 'he', 'whereas', 'did', 'several', '‘ll', 'than', 'really', 'there', 'nevertheless', 'as', 'less', 'besides', 'along', 'any', 'get', 'further', 'so', 'thence', 'name', 'hers', 'have', 'wherein', 'but', 'they', 'nowhere', 'being', 'these', 'most', 'much', '’re', 'about', 'another', 'make', 'do', 'down', '’s', 'seems', 'bottom', 'noone', 'your', 'when', 'elsewhere', 'enough', 'does', 'by', 'namely', 'ourselves', '‘re', 'still', 'becoming', 'each', 'them', 'are', 'around', 'a', 'it', 'us', 'to', 'amount', 'anywhere', 'whereafter', 'must', 'just', 'could', 'n‘t', 'call', 'together', 'were', 'side', 'part', 'almost', 'has', 'anyway', 'using', 'nor', 'since', 'whether', \"'s\", 'becomes', 'too', 'put', 'except', 'wherever'}\n"
]
}
],
"source": [
"#from nltk.corpus import stopwords\n",
"#stopwords = set(stopwords.words('english'))\n",
"#stopwords\n",
"from spacy.lang.en import stop_words\n",
"print (stop_words.STOP_WORDS)"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-21T10:19:55.654433Z",
"start_time": "2022-02-21T10:19:55.652082Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"191526"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#stopfreq = np.sum([freqs[x] for x in stopwords])\n",
"#stopfreq # 174132 for NLTK stopwords\n",
"stopwords = stop_words.STOP_WORDS\n",
"stopfreq = np.sum([freqs[x] for x in stopwords])\n",
"stopfreq"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-21T10:19:55.663598Z",
"start_time": "2022-02-21T10:19:55.655124Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"306516"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"otherfreq = np.sum([freqs[x] for x in freqs if x not in stopwords])\n",
"otherfreq"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## RegEx"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Please refer to [RegExOne Regular Expressions Lessons](regexone.com) and [the python documentation](https://docs.python.org/3/howto/regex.html)."
]
},
{
"cell_type": "code",
"execution_count": 140,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-24T19:55:30.599081Z",
"start_time": "2022-02-24T19:55:30.582719Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['Justice Kennedy ', 'justice that ', 'Justice Alito ']\n",
"['Justice Breyer ']\n",
"['Justice Kennedy ', 'Justice Calogero ', 'justice that ', 'Justice Brennan ', 'Justice Marshall ', 'justice is ']\n",
"['Justice Breyer ', 'Justice Alito ']\n",
"['Justice Thomas ', 'Justice Souter ', 'justice system ']\n"
]
}
],
"source": [
"import re\n",
"\n",
"docs = dfs[:5]['opinion_text']\n",
"\n",
"# Extract words after justice.\n",
"for doc in docs: \n",
" print(re.findall(r'Justice \\w+ ', # pattern to match. always put 'r' in front of string so that backslashes are treated literally.\n",
" doc, # string\n",
" re.IGNORECASE)) # ignore upper/lowercase (optional)"
]
},
{
"cell_type": "code",
"execution_count": 141,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-24T19:55:36.006992Z",
"start_time": "2022-02-24T19:55:35.971925Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['state-court', 'father-in', 'cross-examination', 'right-side', 'ex-husband', 'blood-type', 'blood-group', 'blood-type', 'O-type', 'blood-type', 'cross-examination', 'ninety-three', 'guilt-phase', 'court-appointed', 'jury-instructions', 'ineffective-assistance', 'state-law', 'six-judge', 'eight-judge', 'actual-innocence', 'real-life', 'who-done', 'state-court', 'miscarriage-of', 'actual-innocence', 'actual-innocence', 'sentencing-related', 'reasonable-doubt', 'guilt-phase', 'blood-caked', 'half-full', 'cross-examination', 'cross-examine', 'post-trial', 'self-described', 'knocked-over', 'eleventh-hour']\n",
"['state-court', 'one-third', 'ingle-digit', 'error-free', 'error-free']\n",
"['year-old', 'T-shirt', 'drive-by', 'sixty-five', 'ex-wife', 'first-degree', 'non-homicide', 'bright-line', 'IV-B', 'state-law', 'state-law', 'Thirty-seven', 'Courts-Martial', 'four-Member', 'year-old', 'year-old', 'state-court', 'year-olds', 'year-old', 'Long-Term', 'case-specific', 'Woodson-Lockett', 'first-degree', 'first-degree', 'Inter-University', 'Incident-Based', 'first-degree', 'first-time', 'common-sense', 'cold-blooded', 'III-D', 'IV-A', 'long-term', 'abuse-related', 'year-olds', 'Goodman-Brown', 'consensus-making']\n",
"['pro-life', 'anti-abortion', 'pro-choice', 'pro-choice', 'pro-life', 'pro-life', 'clinic-related', 'extortion-related', 'extortion-related', 'extortion-related', 'Allied-Bruce', 'Anti-Racketeering', 'Anti-Racketeering', 'non-property', 'Anti-Racketeering', 'bona-fide', 'bona-fide', 'bona-fide', 'bona-fide', 'Anti-Racketeering']\n",
"['month-old', 'first-degree', 'first-degree', 'third-party', 'state-court', 'death-eligible', 'death-eligible', 'death-eligible', 'death-eligible', 'Furman-type', 'well-established', 'guilt-phase', 'Bedau-Radelet', 'bright-line']\n"
]
}
],
"source": [
"# Extract hyphenated words\n",
"for doc in docs: \n",
" print(re.findall(r'[a-z]+-[a-z]+', \n",
" doc, \n",
" re.IGNORECASE)) "
]
},
{
"cell_type": "code",
"execution_count": 142,
"metadata": {
"ExecuteTime": {
"end_time": "2022-02-24T19:55:55.577176Z",
"start_time": "2022-02-24T19:55:55.538386Z"
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 (792, 804) 513 U.S. 298\n",
"0 (8282, 8290) 9 and 11\n",
"0 (8535, 8544) 7 Tr. 985\n",
"0 (10385, 10393) 30 or 10\n",
"0 (17080, 17089) 6 Tr. 864\n",
"0 (22356, 22367) 10 Tr. 1410\n",
"0 (23416, 23430) 743 S.W.2d 141\n",
"0 (24205, 24217) 498 U.S. 912\n",
"0 (24917, 24935) 111 (repealed 1995\n",
"0 (24958, 24972) 911 S.W.2d 705\n",
"0 (25032, 25045) 517 U.S. 1193\n",
"0 (25662, 25674) 505 U.S. 333\n",
"0 (26525, 26537) 311 F.3d 767\n",
"0 (26666, 26678) 506 U.S. 390\n",
"0 (27879, 27891) 539 U.S. 937\n",
"0 (28244, 28256) 386 F.3d 668\n",
"0 (28857, 28870) 545 U.S. 1151\n",
"0 (29143, 29155) 477 U.S. 478\n",
"0 (29218, 29230) 456 U.S. 107\n",
"0 (29298, 29309) 433 U.S. 72\n",
"0 (30883, 30895) 499 U.S. 467\n",
"0 (34597, 34609) 443 U.S. 307\n",
"0 (35481, 35498) 1996 (AEDPA), 110\n",
"0 (36519, 36531) 517 U.S. 314\n",
"0 (39216, 39226) 9 Tr. 1302\n",
"0 (49546, 49555) 6 Tr. 906\n",
"0 (55145, 55155) 7 Tr. 1087\n",
"0 (59905, 59913) 30 to 10\n",
"1 (1439, 1451) 517 U.S. 559\n",
"1 (1846, 1858) 538 U.S. 408\n",
"1 (1904, 1916) 540 U.S. 801\n",
"1 (4983, 4995) 509 U.S. 443\n",
"1 (5440, 5451) 340 Ore. 35\n",
"1 (5460, 5468) 127 P. 3\n",
"1 (5627, 5635) 127 P. 3\n",
"1 (6533, 6545) 418 U.S. 323\n",
"1 (6625, 6637) 453 U.S. 247\n",
"1 (6728, 6738) 499 U.S. 1\n",
"1 (7960, 7972) 512 U.S. 415\n",
"1 (8137, 8149) 532 U.S. 424\n",
"1 (9380, 9391) 405 U.S. 56\n",
"1 (14277, 14285) 127 P. 3\n",
"1 (15546, 15554) 127 P. 3\n",
"1 (15770, 15778) 127 P. 3\n",
"1 (15935, 15943) 127 P. 3\n",
"1 (16749, 16761) 515 U.S. 389\n",
"1 (17116, 17128) 334 U.S. 728\n",
"2 (314, 322) 8 and 14\n",
"2 (353, 365) 370 U.S. 660\n",
"2 (827, 840) 42 (West 1997\n",
"2 (2067, 2075) 20 and 9\n",
"2 (5948, 5956) 30 and 7\n",
"2 (6821, 6834) 42 (West 1997\n",
"2 (8024, 8032) 12 to 13\n",
"2 (8163, 8175) 4 (West 1997\n",
"2 (9094, 9103) 16 (La. 5\n",
"2 (9112, 9121) 957 So. 2\n",
"2 (9908, 9920) 2076 (La. 12\n",
"2 (9929, 9938) 685 So. 2\n",
"2 (10079, 10091) 433 U.S. 584\n",
"2 (10556, 10565) 957 So. 2\n",
"2 (10893, 10905) 543 U.S. 551\n",
"2 (10972, 10984) 536 U.S. 304\n",
"2 (11190, 11199) 957 So. 2\n",
"2 (12047, 12056) 957 So. 2\n",
"2 (12508, 12520) 433 U.S. 917\n",
"2 (12749, 12758) 957 So. 2\n",
"2 (12795, 12808) 552 U.S. 1087\n",
"2 (13654, 13666) 217 U.S. 349\n",
"2 (14092, 14103) 356 U.S. 86\n",
"2 (14423, 14435) 408 U.S. 238\n",
"2 (14913, 14925) 501 U.S. 957\n",
"2 (15855, 15867) 428 U.S. 153\n",
"2 (16562, 16574) 433 U.S. 584\n",
"2 (16887, 16899) 458 U.S. 782\n",
"2 (17196, 17208) 481 U.S. 137\n",
"2 (19540, 19553) 1930 and 1964\n",
"2 (19686, 19694) 262 to 5\n",
"2 (20627, 20639) 428 U.S. 280\n",
"2 (20808, 20820) 428 U.S. 325\n",
"2 (20941, 20955) 550 S.W.2d 643\n",
"2 (20957, 20972) 646 (Tenn. 1977\n",
"2 (21052, 21061) 403 So. 2\n",
"2 (21068, 21082) 951 (Fla. 1981\n",
"2 (21173, 21182) 548 So. 2\n",
"2 (21193, 21208) 403 (Miss. 1989\n",
"2 (22581, 22595) 30 (Supp. 2007\n",
"2 (22928, 22942) 108 Stat. 1972\n",
"2 (23365, 23376) 243 Ga. 131\n",
"2 (23387, 23401) 252 S.E.2d 625\n",
"2 (24079, 24090) 283 Ga. 206\n",
"2 (24097, 24111) 657 S.E.2d 838\n",
"2 (24676, 24685) 403 So. 2\n",
"2 (25248, 25257) 721 So. 2\n",
"2 (25425, 25434) 453 So. 2\n",
"2 (26982, 26997) 70 between 1989\n",
"2 (27134, 27147) 1995 and 2005\n",
"2 (27535, 27548) 1954 and 1982\n",
"2 (28910, 28924) 2000 ed.), 920\n",
"2 (35264, 35273) 685 So. 2\n",
"2 (35528, 35537) 350 So. 2\n",
"2 (35545, 35561) 1360 (Miss. 1977\n",
"2 (35925, 35938) 207 Ariz. 261\n",
"2 (35951, 35958) 85 P. 3\n",
"2 (35973, 35985) 8 (App. 2004\n",
"2 (36331, 36340) 30 Cal. 4\n",
"2 (36376, 36383) 69 P. 3\n",
"2 (36737, 36746) 921 So. 2\n",
"2 (36753, 36767) 526 (Fla. 2005\n",
"2 (36821, 36830) 695 So. 2\n",
"2 (36832, 36846) 691 (Fla. 1997\n",
"2 (36868, 36881) 185 Mont. 299\n",
"2 (36888, 36901) 605 P.2d 1000\n",
"2 (37002, 37014) 947 P.2d 630\n",
"2 (37016, 37030) 653 (Utah 1997\n",
"2 (37164, 37174) 212 Ill. 2\n",
"2 (37186, 37200) 816 N.E.2d 322\n",
"2 (38353, 38362) 403 So. 2\n",
"2 (38470, 38477) 69 P. 3\n",
"2 (41783, 41796) 1986 and 2001\n",
"2 (42064, 42077) 1989 and 2005\n",
"2 (42483, 42495) 492 U.S. 361\n",
"2 (42528, 42542) 306 (1989), 12\n",
"2 (42823, 42832) 16 and 18\n",
"2 (44657, 44665) 262 to 5\n",
"2 (44716, 44728) 487 U.S. 815\n",
"2 (49033, 49045) 479 U.S. 538\n",
"2 (49250, 49262) 428 U.S. 153\n",
"2 (49305, 49317) 408 U.S. 238\n",
"2 (49375, 49387) 446 U.S. 420\n",
"2 (49981, 49993) 438 U.S. 586\n",
"2 (50213, 50225) 512 U.S. 967\n",
"2 (50411, 50423) 497 U.S. 639\n",
"2 (51219, 51230) 553 U.S. 35\n",
"2 (51422, 51435) 510 U.S. 1141\n",
"2 (53625, 53637) 458 U.S. 782\n",
"2 (58238, 58250) 428 U.S. 262\n",
"2 (58509, 58521) 507 U.S. 463\n",
"2 (59651, 59663) 428 U.S. 153\n",
"2 (63414, 63426) 551 U.S. 930\n",
"2 (64865, 64877) 121 (Aug. 26\n",
"2 (66509, 66526) 1989 Through 2003\n",
"2 (67311, 67322) 480 U.S. 39\n",
"3 (2982, 2994) 968 F.2d 612\n",
"3 (3221, 3233) 510 U.S. 249\n",
"3 (3588, 3600) 267 F.3d 687\n",
"3 (3689, 3701) 537 U.S. 393\n",
"3 (9304, 9316) 513 U.S. 265\n",
"3 (9390, 9402) 471 U.S. 858\n",
"3 (9621, 9633) 529 U.S. 848\n",
"3 (10188, 10200) 48 Stat. 979\n",
"3 (10408, 10420) 48 Stat. 980\n",
"3 (11187, 11199) 60 Stat. 420\n",
"3 (11426, 11438) 435 U.S. 371\n",
"3 (12551, 12563) 60 Stat. 420\n",
"3 (14046, 14058) 342 U.S. 246\n",
"3 (14322, 14334) 508 U.S. 200\n",
"3 (14438, 14450) 353 U.S. 222\n",
"3 (15638, 15650) 410 U.S. 396\n",
"3 (16083, 16096) 184 F.3d 1071\n",
"3 (16134, 16145) 511 F.2d 25\n",
"3 (16902, 16914) 348 U.S. 528\n",
"3 (17079, 17091) 107 U.S. 147\n",
"3 (19939, 19950) 534 U.S. 84\n",
"3 (20825, 20837) 48 Stat. 979\n",
"3 (22957, 22969) 60 Stat. 420\n",
"4 (2389, 2401) 278 Kan. 520\n",
"4 (2412, 2420) 102 P. 3\n",
"4 (2796, 2804) 102 P. 3\n",
"4 (3370, 3383) 544 U.S.
gitextract_ywkx76s7/
├── .eslintrc
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ └── intro.yml
├── .gitignore
├── .prettier
├── Cloud/
│ └── Speech-to-text/
│ └── README.md
├── Datensätze/
│ └── Bern/
│ └── Sandkeusch.py
├── Docs/
│ ├── Sound/
│ │ ├── sound.ogg
│ │ └── untterregle.ogg
│ └── images/
│ └── untterregle.ogg
├── Geschichte/
│ ├── EIDGENOSSENSCHAFT.md
│ └── geschichte.md
├── Gewaltenteilung/
│ └── Gewaltenteilung_Im_Rechtsstaat.md
├── Install
├── LICENSE
├── Lied/
│ ├── .gitignore
│ ├── Geburi.md
│ ├── Patent Ochsner/
│ │ └── Für immer uf di.md
│ ├── cake.less
│ └── loading.css
├── NLP/
│ └── Examples/
│ └── one/
│ ├── assignment.md
│ ├── cl.md
│ ├── example.py
│ └── number.py
├── Notebook/
│ ├── Intro.ipynb
│ ├── K_mean_clustering.ipynb
│ └── text_data.ipynb
├── README.md
├── SwissGermanBot/
│ └── login.txt
├── datasets/
│ ├── Buendnertuetsch/
│ │ └── buendnertuetsch.txt
│ ├── Jugendsprache/
│ │ └── jugendsprache.txt
│ ├── bern/
│ │ ├── W Nuss Vo Buempliz.py
│ │ └── bern.txt
│ ├── dictionary.py
│ ├── english/
│ │ └── festivalLove-eng.ipynb
│ ├── french/
│ │ └── french.txt
│ ├── img/
│ │ └── map.txt
│ ├── korean/
│ │ ├── festivalLovekr.ipynb
│ │ ├── high-kr.py
│ │ └── malLuege.py
│ ├── luzern/
│ │ └── luzern.txt
│ ├── zuerich/
│ │ ├── BlueBike.txt
│ │ ├── FestivalLove.ipynb
│ │ ├── JohnJuno.ipynb
│ │ ├── Sie het en traum gha.txt
│ │ ├── Teil_Vo_Dir.ipynb
│ │ ├── fremdi_fürenand.ipynb
│ │ ├── high.py
│ │ ├── i_ha's_immer_gwüsst.ipynb
│ │ ├── lena.ipynb
│ │ ├── malleuge.txt
│ │ ├── panama.txt
│ │ ├── teleskop.py
│ │ ├── valencia.ipynb
│ │ ├── zuerich.txt
│ │ ├── zuerichII.txt
│ │ └── zuerichbs.txt
│ └── zug/
│ └── zug.txt
├── dist/
│ ├── siriwave.esm.js
│ ├── siriwave.umd.js
│ └── typ/
│ ├── curve.d.ts
│ ├── index.d.ts
│ └── ios.d.ts
├── facts/
│ ├── ASR/
│ │ ├── DeepSpeech.md
│ │ ├── data/
│ │ │ └── alphabet.txt
│ │ └── pre-processing/
│ │ ├── audio.py
│ │ ├── ch_De_prep.py
│ │ ├── corpus_cleaning.py
│ │ ├── finden_files.py
│ │ ├── folien.py
│ │ ├── prep_vocab.py
│ │ ├── prepare_data.py
│ │ ├── shuffle_split.py
│ │ └── utf_8.sh
│ ├── GAN.md
│ ├── chrütertee.java
│ ├── semantiks.md
│ └── word2vec.md
├── src/
│ ├── context.ts
│ ├── ios9_curve.ts
│ ├── klassich.ts
│ ├── pramp/
│ │ └── algodaten/
│ │ ├── DecodeVariations/
│ │ │ ├── answer.java
│ │ │ ├── answer.txt
│ │ │ ├── answerII.py
│ │ │ ├── hints.txt
│ │ │ └── question.txt
│ │ ├── Diff Between Two Strings/
│ │ │ ├── answer.py
│ │ │ └── question.txt
│ │ ├── Island Count/
│ │ │ ├── answer.c
│ │ │ ├── hints.txt
│ │ │ └── question.txt
│ │ ├── Number of Paths/
│ │ │ ├── ans.py
│ │ │ ├── answer.txt
│ │ │ ├── hints.txt
│ │ │ └── question.txt
│ │ ├── Number_Of_Paths/
│ │ │ ├── answer.txt
│ │ │ ├── hints.txt
│ │ │ └── question.txt
│ │ ├── Root of Number/
│ │ │ ├── ans.c
│ │ │ ├── ans.java
│ │ │ ├── answer.txt
│ │ │ ├── hints.txt
│ │ │ └── question.txt
│ │ ├── Root_of_Number/
│ │ │ ├── hints.txt
│ │ │ ├── problem.txt
│ │ │ └── pseudocode.py
│ │ └── pairs_with_specific_difference/
│ │ └── answer.py
│ ├── read-Swiss-German.py
│ └── srf/
│ ├── comedy/
│ │ └── renatoKaiser.txt
│ └── dok/
│ ├── Kampf gegen die Suchttxt
│ └── KampfSucht.txt
├── swissDeutschBot/
│ ├── .gitignore
│ ├── .idee/
│ │ └── Inspektion/
│ │ ├── .gitignore
│ │ ├── GPT3api.iml
│ │ ├── miscellanious.xml
│ │ ├── modules.xml
│ │ ├── profil_einstellungen.xml
│ │ ├── projeckt_vorgaben.xml
│ │ ├── requirements.md
│ │ └── vcs.xml
│ ├── Dockerfile
│ ├── mini.py
│ └── openAI.py
└── trials/
├── bünzli.md
└── quiz.md
SYMBOL INDEX (136 symbols across 27 files)
FILE: NLP/Examples/one/number.py
class Parser (line 14) | class Parser():
method __init__ (line 16) | def __init__(self, print_res: bool = False):
method parse (line 21) | def parse(self, math_string: str, in_vars: dict = {}):
method infix_notation_parser (line 33) | def infix_notation_parser(self, ):
method get_input_variables (line 71) | def get_input_variables(self, math_string: str, in_vars: dict = {}):
function test_backprop (line 94) | def test_backprop(Builder, Executor, math_problems = None):
FILE: dist/siriwave.esm.js
function __rest (line 16) | function __rest(s, e) {
class ClassicCurve (line 28) | class ClassicCurve {
method constructor (line 29) | constructor(ctrl, definition) {
method globalAttFn (line 36) | globalAttFn(x) {
method xPos (line 39) | xPos(i) {
method yPos (line 42) | yPos(i) {
method draw (line 49) | draw() {
method getDefinition (line 63) | static getDefinition() {
class iOS9Curve (line 94) | class iOS9Curve {
method constructor (line 95) | constructor(ctrl, definition) {
method getRandomRange (line 122) | getRandomRange(e) {
method spawnSingle (line 125) | spawnSingle(ci) {
method getEmptyArray (line 135) | getEmptyArray(count) {
method spawn (line 138) | spawn() {
method globalAttFn (line 153) | globalAttFn(x) {
method sin (line 156) | sin(x, phase) {
method yRelativePos (line 159) | yRelativePos(i) {
method yPos (line 173) | yPos(i) {
method xPos (line 180) | xPos(i) {
method drawSupportLine (line 183) | drawSupportLine() {
method draw (line 194) | draw() {
method getDefinition (line 236) | static getDefinition() {
class SiriWave (line 258) | class SiriWave {
method constructor (line 259) | constructor(_a) {
method hex2rgb (line 344) | hex2rgb(hex) {
method intLerp (line 352) | intLerp(v0, v1, t) {
method lerp (line 358) | lerp(propertyStr) {
method clear (line 371) | clear() {
method draw (line 379) | draw() {
method startDrawCycle (line 386) | startDrawCycle() {
method start (line 404) | start() {
method stop (line 418) | stop() {
method dispose (line 432) | dispose() {
method set (line 442) | set(propertyStr, value) {
method setSpeed (line 448) | setSpeed(value) {
method setAmplitude (line 454) | setAmplitude(value) {
FILE: dist/siriwave.umd.js
function __rest (line 33) | function __rest(s, e) {
function ClassicCurve (line 46) | function ClassicCurve(ctrl, definition) {
function iOS9Curve (line 113) | function iOS9Curve(ctrl, definition) {
function SiriWave (line 279) | function SiriWave(_a) {
FILE: dist/typ/curve.d.ts
class ClassicCurve (line 2) | class ClassicCurve implements ICurve {
FILE: dist/typ/index.d.ts
type CurveStyle (line 3) | type CurveStyle = "ios" | "ios9";
type Options (line 4) | type Options = {
type IiOS9CurveDefinition (line 20) | type IiOS9CurveDefinition = {
type IClassicCurveDefinition (line 24) | type IClassicCurveDefinition = {
type ICurveDefinition (line 30) | type ICurveDefinition = IiOS9CurveDefinition | IClassicCurveDefinition;
type ICurve (line 31) | interface ICurve {
class SiriWave (line 34) | class SiriWave {
FILE: dist/typ/ios.d.ts
class iOS9Curve (line 2) | class iOS9Curve implements ICurve {
FILE: facts/ASR/pre-processing/audio.py
function audiofile_to_input_vector (line 9) | def audiofile_to_input_vector(audio_filename, numcep, numcontext):
FILE: facts/ASR/pre-processing/ch_De_prep.py
function preprocess_transcript_for_corpus (line 23) | def preprocess_transcript_for_corpus(transcript):
FILE: facts/ASR/pre-processing/corpus_cleaning.py
function replace_symbols (line 77) | def replace_symbols(word):
function remove_symbols (line 87) | def remove_symbols(word):
function word_to_num (line 102) | def word_to_num(word):
function get_bad_character (line 127) | def get_bad_character(text):
function clean_word (line 138) | def clean_word(word):
function clean_sentence (line 160) | def clean_sentence(sentence):
FILE: facts/ASR/pre-processing/finden_files.py
function aftiv_length (line 7) | def aftiv_length(row):
function trans_length (line 10) | def trans_length(row):
FILE: facts/ASR/pre-processing/prep_vocab.py
function read_training_transcripts (line 21) | def read_training_transcripts(path):
FILE: facts/ASR/pre-processing/prepare_data.py
function clean_transcriptions (line 25) | def clean_transcriptions(corpus):
FILE: facts/chrütertee.java
class Main (line 21) | class Main {
method main (line 22) | public static void main(String[] args) {
FILE: src/context.ts
type CurveStyle (line 4) | type CurveStyle = "ios" | "ios9";
type Options (line 6) | type Options = {
type IiOS9CurveDefinition (line 37) | type IiOS9CurveDefinition = {
type IClassicCurveDefinition (line 42) | type IClassicCurveDefinition = {
type ICurveDefinition (line 49) | type ICurveDefinition = IiOS9CurveDefinition | IClassicCurveDefinition;
type ICurve (line 51) | interface ICurve {
class SiriWave (line 55) | class SiriWave {
method constructor (line 82) | constructor({ container, ...rest }: Options) {
method hex2rgb (line 195) | private hex2rgb(hex: string): string | null {
method intLerp (line 207) | private intLerp(v0: number, v1: number, t: number): number {
method lerp (line 214) | private lerp(propertyStr: "amplitude" | "speed"): number | null {
method clear (line 228) | private clear() {
method draw (line 237) | private draw() {
method startDrawCycle (line 245) | private startDrawCycle() {
method start (line 267) | start() {
method stop (line 284) | stop() {
method dispose (line 300) | dispose() {
method set (line 311) | set(propertyStr: "amplitude" | "speed", value: number) {
method setSpeed (line 318) | setSpeed(value: number) {
method setAmplitude (line 325) | setAmplitude(value: number) {
FILE: src/ios9_curve.ts
class iOS9Curve (line 3) | class iOS9Curve implements ICurve {
method constructor (line 35) | constructor(ctrl: SiriWave, definition: IiOS9CurveDefinition) {
method getRandomRange (line 53) | private getRandomRange(e: [number, number]): number {
method spawnSingle (line 57) | private spawnSingle(ci: number): void {
method getEmptyArray (line 69) | private getEmptyArray(count: number): number[] {
method spawn (line 73) | private spawn(): void {
method globalAttFn (line 92) | private globalAttFn(x: number): number {
method sin (line 96) | private sin(x: number, phase: number): number {
method yRelativePos (line 100) | private yRelativePos(i: number): number {
method yPos (line 119) | private yPos(i: number): number {
method xPos (line 129) | private xPos(i: number): number {
method drawSupportLine (line 133) | private drawSupportLine() {
method draw (line 147) | draw() {
method getDefinition (line 205) | static getDefinition(): IiOS9CurveDefinition[] {
FILE: src/klassich.ts
class ClassicCurve (line 2) | class ClassicCurve implements ICurve {
method constructor (line 9) | constructor(ctrl: SiriWave, definition: IClassicCurveDefinition) {
method globalAttFn (line 14) | private globalAttFn(x: number): number {
method xPos (line 18) | private xPos(i: number): number {
method yPos (line 22) | private yPos(i: number): number {
method draw (line 32) | draw(): void {
method getDefinition (line 51) | static getDefinition(): IClassicCurveDefinition[] {
FILE: src/pramp/algodaten/DecodeVariations/answer.java
class Solution (line 4) | class Solution {
method decodeVariations (line 6) | static int decodeVariations(String S) {
method main (line 29) | public static void main(String[] args) {
FILE: src/pramp/algodaten/DecodeVariations/answerII.py
function decodeVariations (line 3) | def decodeVariations(S):
class VariationsDecoder (line 57) | class VariationsDecoder:
method decode_variations (line 60) | def decode_variations(self,S):
method _dp (line 75) | def _dp(self, letter_index):
class TestVariationsDecoder (line 105) | class TestVariationsDecoder(unittest.TestCase):
method test_1 (line 107) | def test_1(self):
method test_1262 (line 119) | def test_1262(self):
FILE: src/pramp/algodaten/Diff Between Two Strings/answer.py
function diffBetweenTwoStrings (line 1) | def diffBetweenTwoStrings(source, target):
FILE: src/pramp/algodaten/Island Count/answer.c
function mark_island (line 8) | void mark_island(int mat[][c_size], int r, int c) {
function getNumberOfIslands (line 21) | int getNumberOfIslands(size_t numRows, size_t numCols, int binaryMatrix[...
function main (line 38) | int main() {
FILE: src/pramp/algodaten/Number of Paths/ans.py
function num_of_paths_to_dest_v2 (line 1) | def num_of_paths_to_dest_v2(n):
FILE: src/pramp/algodaten/Root of Number/ans.c
function root (line 4) | void root(double x, unsigned int n, double *out)
function main (line 9) | int main() {
FILE: src/pramp/algodaten/Root of Number/ans.java
class Solution (line 4) | class Solution {
method root (line 6) | static double root(double x, int n) {
method main (line 37) | public static void main(String[] args) {
FILE: src/pramp/algodaten/pairs_with_specific_difference/answer.py
function find_pairs_with_given_difference (line 1) | def find_pairs_with_given_difference(arr, k):
FILE: src/read-Swiss-German.py
function load_words (line 2) | def load_words():
FILE: swissDeutschBot/mini.py
function main (line 13) | def main():
FILE: swissDeutschBot/openAI.py
function set_prompt (line 4) | def set_prompt(prompt_type):
function ask (line 34) | def ask(question):
function correct (line 52) | def correct(sentence):
Condensed preview — 125 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,980K chars).
[
{
"path": ".eslintrc",
"chars": 704,
"preview": "{\n \"parser\": \"@typescript-eslint/parser\",\n \"extends\": [\n \"plugin:@typescript-eslint/recommended\", // Uses the recom"
},
{
"path": ".github/FUNDING.yml",
"chars": 837,
"preview": "# These are supported funding model platforms\n\nWir danken Ihnen für Ihre Hilfe.\n\ngithub: # Replace with up to 4 GitHub S"
},
{
"path": ".github/workflows/intro.yml",
"chars": 1041,
"preview": "# Dieser Workflow führt Tests mit node aus und veröffentlicht dann ein Paket in GitHub Packages, wenn eine Version erste"
},
{
"path": ".gitignore",
"chars": 29,
"preview": "node_modules/\nyarn-error.log\n"
},
{
"path": ".prettier",
"chars": 107,
"preview": "{\n \"semi\": true,\n \"trailingComma\": \"all\",\n \"singleQuote\": false,\n \"printWidth\": 120,\n \"tabWidth\": 2\n}\n"
},
{
"path": "Cloud/Speech-to-text/README.md",
"chars": 3996,
"preview": "# Step 1: Choose [Awesome-Swiss-German Project](https://cloud.google.com/speech-to-text)\n\n# Step 2: Enable the Speech-to"
},
{
"path": "Datensätze/Bern/Sandkeusch.py",
"chars": 1405,
"preview": "Damals bin ich jede Tag ist Studio Gange,\nGfange i dem Bunker Homie immer wenn ich schriibe\nChömet die Erinnerige zrugg\n"
},
{
"path": "Docs/Sound/sound.ogg",
"chars": 1,
"preview": "\n"
},
{
"path": "Geschichte/EIDGENOSSENSCHAFT.md",
"chars": 617,
"preview": "Im Mittelalter schufen sich die verschiedenen Territorien, die oft auch zusammen arbeiteten, langsam, aber stetig mehr F"
},
{
"path": "Geschichte/geschichte.md",
"chars": 299,
"preview": "Vorläufer der modernen Schweiz waren die seit dem Ende des 13. Jahrhunderts als lockerer Bund organisierte Alte Eidgenos"
},
{
"path": "Gewaltenteilung/Gewaltenteilung_Im_Rechtsstaat.md",
"chars": 1681,
"preview": "Der Staat ist in drei Bereiche aufgeteilt: Parlament, Regierung und Gericht. Für jeden\nBereich gibt es auf den Ebenen Bu"
},
{
"path": "Install",
"chars": 1065,
"preview": "conda create -n nlp_lss python=3.8\nconda activate nlp_lss\n\npip install spacy==3.2.2\npip install pandas==1.4.1\npip instal"
},
{
"path": "LICENSE",
"chars": 1073,
"preview": "MIT License\n\nCopyright (c) 2022 Esther Hoeun Yu \n\nPermission is hereby granted, free of charge, to any person obtaining "
},
{
"path": "Lied/.gitignore",
"chars": 1142,
"preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n*.pid.lock\n\n# Directo"
},
{
"path": "Lied/Geburi.md",
"chars": 473,
"preview": "Happy Birthday\n\nA Happy Birthday animation design in CSS3, HTML5.\n\nURL: http://estheryu991.github.io/geburi/\n\nTechnology"
},
{
"path": "Lied/Patent Ochsner/Für immer uf di.md",
"chars": 1138,
"preview": "Schweizer Lied findet [hier](https://www.youtube.com/watch?v=-U_awHiE2e0)\n\n# Lyrics:\n\n>>> \"uf mueters seel wo hüt furt i"
},
{
"path": "Lied/cake.less",
"chars": 5094,
"preview": "\n\n//////////////////////////////////////////// var\n\n@D:300px; // Control diameter\n\n/////////////////////////////////////"
},
{
"path": "Lied/loading.css",
"chars": 3137,
"preview": "/* Absolute Center CSS Spinner */\n.loading {\n position: fixed;\n z-index: 99999;\n height: 2em;\n width: 2em;\n overflo"
},
{
"path": "NLP/Examples/one/assignment.md",
"chars": 8526,
"preview": "Natural Language Processing \nFall 2022 \nProf. Ryan Cotterell \nAssignment 1: Backpropagation \n29/09/2022 - 16:21h \nThe fi"
},
{
"path": "NLP/Examples/one/cl.md",
"chars": 2872,
"preview": "zb. \n\n**Computerlinguistik und Sprachtechnologie**\n\nWas ist Computerlinguistik und Sprachtechnologie?\nDas Studienprogram"
},
{
"path": "NLP/Examples/one/example.py",
"chars": 154,
"preview": "example\nn is always more than n \n\nLowerbound \nhow you define an automic automation \n\nevery node to be an dependent \n\nN a"
},
{
"path": "NLP/Examples/one/number.py",
"chars": 5279,
"preview": "import sys\nimport re\nfrom pyparsing import *\nimport random\n\nROUND = 2 ## we round results to two decimal places for chec"
},
{
"path": "Notebook/Intro.ipynb",
"chars": 196773,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"toc\": true\n },\n \"source\": [\n \"<h1>Week 01. Te"
},
{
"path": "Notebook/K_mean_clustering.ipynb",
"chars": 30588,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"toc\": true\n },\n \"source\": [\n \"<h1>Table of Co"
},
{
"path": "Notebook/text_data.ipynb",
"chars": 1276968,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Week 04. Machine Learning with Te"
},
{
"path": "README.md",
"chars": 21601,
"preview": "# Hoi, wie gäähts? \n\n## Wilkommen zu [Swiss German Dictionary](https://www.apple.com/chde/)\n\nPossible Google [Speech-to-"
},
{
"path": "SwissGermanBot/login.txt",
"chars": 410,
"preview": "aiohttp==3.7.4.post0\nasync-timeout==3.0.1\nattrs==21.2.0\ncertifi==2021.10.8\nchardet==4.0.0\ncharset-normalizer==2.0.7\ndisc"
},
{
"path": "datasets/Buendnertuetsch/buendnertuetsch.txt",
"chars": 520,
"preview": "allpot - viel, oft \nBagaaschi - eine Menge Leute \nFretschni - Kälte\nGoof - Kind \ngööla - spielen (Kinder)\nGaggalaari - D"
},
{
"path": "datasets/Jugendsprache/jugendsprache.txt",
"chars": 893,
"preview": "Allround-Laie : Versager\nAugentinnitus : Das unangenehme Gefühl, von dummen Menschen umgeben zu sein \n\nbambus : cool / k"
},
{
"path": "datasets/bern/W Nuss Vo Buempliz.py",
"chars": 2104,
"preview": "D'w. nuss vo bümpliz geit dür d'strass\nLiecht und flüchtig, wie nes gas\nSo unerreichbar höch\nBockstössigi himbeerbuebe\nS"
},
{
"path": "datasets/bern/bern.txt",
"chars": 559,
"preview": "Bern<langthal>\n\nChatz: Chätzli \n\nDarf ich ein Kekse haben?: Dörfti bitte es Guetzli ha?\n\nEine frische Milch bitte: E frü"
},
{
"path": "datasets/dictionary.py",
"chars": 19528,
"preview": "# Swiss German Dictionary (alphabetically ordered)\n\n\n# AAabig (evening)aacho (to arrive)aadüte (to hint at sth) also: aa"
},
{
"path": "datasets/english/festivalLove-eng.ipynb",
"chars": 1068,
"preview": "*I dem riise menschemeer*\n*look at you as if it were deserted*\n*And while crowd freaks out around you*\n*You only relaxed"
},
{
"path": "datasets/french/french.txt",
"chars": 87,
"preview": "- Bonjour.\n- Bonjour. Je m'appelle Martin. Et vous ?\n- Je m'appelle Sarah.\n- Enchanté.\n"
},
{
"path": "datasets/img/map.txt",
"chars": 41,
"preview": "http://dialektkarten.ch/trans/index.html\n"
},
{
"path": "datasets/korean/festivalLovekr.ipynb",
"chars": 703,
"preview": "*I dem riise menschmeer*\n*버려진 널 바라봐*\n*그리고 군중이 당신 주위를 놀라게 하는 동안*\n*당신은 편안한 din daiquiri sippsch*\n\n축제, 축제의 사랑\n내가 당신에게서 떨어져 "
},
{
"path": "datasets/korean/high-kr.py",
"chars": 548,
"preview": "나 취 했어\n나 취 했어\n\n아 *땀*이 난다\n내가 *uh 금단*인 것처럼\n*자이트레의 작은 손*\n*비메네 급강하처럼*\n\n난 *그냥 코 풀고*\n잠시 *진정*\n*Chum 나에게 당신에게서 기차를 줘*\n그리고 난 다시 기"
},
{
"path": "datasets/korean/malLuege.py",
"chars": 3246,
"preview": "그것이 그녀가 의미하는 것입니다.\n가장 아름다운 바\n큰 꿀꺽 뮤트\n그리고 그녀에게 물어볼게\n\"어떻게 누가, ois 2와 함께\n진정해, 둘 다\n일치하는 것은 친절합니다\n내꺼였어?\"\n가끔 그녀는 거짓말을 해, 아마 내일"
},
{
"path": "datasets/luzern/luzern.txt",
"chars": 47,
"preview": "luzerndütsch los gahts\n\nei biuspiel\n\nLos gohts\n"
},
{
"path": "datasets/zuerich/BlueBike.txt",
"chars": 1898,
"preview": "Letschte summer hesch dis velo kauft\nHan denkt *seg* eige, so ganz in blau\nHinderem bahnhof hesch din *stammplatz* gha\nW"
},
{
"path": "datasets/zuerich/FestivalLove.ipynb",
"chars": 1061,
"preview": "*I dem riise menschemeer*\n*Gsehn nur dich als wärs menscheleer*\n*Und während crowd rund um dich usflippt*\n*Du nur relaxt"
},
{
"path": "datasets/zuerich/JohnJuno.ipynb",
"chars": 1296,
"preview": "Ich *hanen* *letschti* ja no gseh gha\nSo richtig *erchennt* het er mich aber nöd\n*Hüfig* het er vom mars *verzellt* gha\n"
},
{
"path": "datasets/zuerich/Sie het en traum gha.txt",
"chars": 1675,
"preview": "Sie het en traum gha\nUnd de traum het nöd *nah glah*\nSie het immer de wunsch gha\nDass es *allne mal glich gaht*\n\nOh sie "
},
{
"path": "datasets/zuerich/Teil_Vo_Dir.ipynb",
"chars": 884,
"preview": "*Ich wär so gern en Teil vo dir gsi*\n*Stell di ufs Podescht du bisch min Mittelpunkt*\n*Ich find bi dir nid statt ich bli"
},
{
"path": "datasets/zuerich/fremdi_fürenand.ipynb",
"chars": 1262,
"preview": "*Gäbts e ziitmaschine ich würd sie neh*\n*Mach denn d'türe uf* im 2010\n*D'hitz stauts ide altstadthüüserschlucht*\nUnd mic"
},
{
"path": "datasets/zuerich/high.py",
"chars": 1118,
"preview": "Ich bin so high\nIch bin so high\n\nIch fang ah *schwitze*\nAls wär ich *uf entzug*\n*Mini händ am ziitre*\n*Wie bimene sturzf"
},
{
"path": "datasets/zuerich/i_ha's_immer_gwüsst.ipynb",
"chars": 1283,
"preview": "*Scho woni di vo jahre zerst mau gseh ha hesch mi iritiert.*\n*Ha nid genau gwüsst wases isch wo mi a dir het fasziniert."
},
{
"path": "datasets/zuerich/lena.ipynb",
"chars": 1262,
"preview": "Lueg mal s'füürwerk, *du heschs nöd gern*\nFür dich machts, eifach *nume lärm*\nScho wieder de *gin usgleert*, s halbe gla"
},
{
"path": "datasets/zuerich/malleuge.txt",
"chars": 1264,
"preview": "Det staht sie\nDie schönst ade bar\nEn grosse schluck muet\nUnd denn frög ich sie mal\n\"Wie wers, mit ois zwei\nMal chille nu"
},
{
"path": "datasets/zuerich/panama.txt",
"chars": 1070,
"preview": "Es bitzli träume dörf mer doch immer\nDass es andersch isch, wie wers mit eme lebe ufere insle?\nMängisch hani eifach vo d"
},
{
"path": "datasets/zuerich/teleskop.py",
"chars": 1405,
"preview": "Ich lueg a *decki voller neonplastiksterne*\nS′fenster off, s einzig wo *chüehlt i dere summerwärmi*\n*S'strasseliecht vo "
},
{
"path": "datasets/zuerich/valencia.ipynb",
"chars": 1324,
"preview": "*Mir sitzed duss vorem paddys\nUnd du rauchsch und du rauchsch\nA dir isch immer no alles\nSo vertraut, so vertraut*\n\n*Aber"
},
{
"path": "datasets/zuerich/zuerich.txt",
"chars": 1639,
"preview": "das Haus -> sHuus \ndie Strasse -> dStrass\ndas Fahrad -> sVelo \ndas Auto -> sAuto \ndas Mülleimer -> der Chübel (Abfalleim"
},
{
"path": "datasets/zuerich/zuerichII.txt",
"chars": 745,
"preview": "(1) \n<CH>\nöper muess id Post ga und isch denn aber in es ichaufszentrum gange,\nund denn isch er wieder dihei gsi,\nhet si"
},
{
"path": "datasets/zuerich/zuerichbs.txt",
"chars": 204,
"preview": "Abwart = Haumeister\nEstrich = Dachboden\nFalle = Türklinke\nKabis = Weißkohl\nwischen = fegen\nfegen = wischen\nräss = würzig"
},
{
"path": "datasets/zug/zug.txt",
"chars": 460,
"preview": "«Der Zuger Dialekt ist nicht so markant und eigenständig wie zum Beispiel der Urner oder Obwaldner Dialekt», erklärt Mar"
},
{
"path": "dist/siriwave.esm.js",
"chars": 16072,
"preview": "/*! *****************************************************************************\nCopyright (c) Microsoft Corporation.\n\n"
},
{
"path": "dist/siriwave.umd.js",
"chars": 19963,
"preview": "(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factor"
},
{
"path": "dist/typ/curve.d.ts",
"chars": 466,
"preview": "import SiriWave, { IClassicCurveDefinition, ICurve } from \"./index\";\nexport declare class ClassicCurve implements ICurve"
},
{
"path": "dist/typ/index.d.ts",
"chars": 2361,
"preview": "#das funtioniert auf IOS\n\ndeclare type CurveStyle = \"ios\" | \"ios9\";\nexport declare type Options = {\n container: HTMLE"
},
{
"path": "dist/typ/ios.d.ts",
"chars": 1205,
"preview": "import SiriWave, { ICurve, IiOS9CurveDefinition } from \"./index\";\nexport declare class iOS9Curve implements ICurve {\n "
},
{
"path": "facts/ASR/DeepSpeech.md",
"chars": 9258,
"preview": "# Automatic Speech Recognition (ASR) - DeepSpeech Swiss German\n\n_This is the project for the paper [LTL-UDE at Low-Resou"
},
{
"path": "facts/ASR/data/alphabet.txt",
"chars": 354,
"preview": "# Each line in this file represents the Unicode codepoint (UTF-8 encoded)\n# associated with a numeric label.\n# A line th"
},
{
"path": "facts/ASR/pre-processing/audio.py",
"chars": 896,
"preview": "# Author: Mozilla DeepSpeech v0.4.0\n\nimport numpy as np\nimport scipy.io.wavfile as wav\n\nfrom python_speech_features impo"
},
{
"path": "facts/ASR/pre-processing/ch_De_prep.py",
"chars": 3096,
"preview": "import os\nimport re\nimport sys\nimport codecs\nimport pandas as pd\nfrom sox import Transformer\n\nfiles = []\nSAMPLE_RATE = 1"
},
{
"path": "facts/ASR/pre-processing/corpus_cleaning.py",
"chars": 3675,
"preview": "# -*- coding: utf-8 -*-\n\nimport string\nimport collections\nimport re\n\nimport num2words\n\n#\n# Number patterns\n#\nint_patte"
},
{
"path": "facts/ASR/pre-processing/finden_files.py",
"chars": 458,
"preview": "import pandas as pd\nfrom audio import audiofile_to_input_vector\nN_CONTEXT = 9\n\ndf = pd.read_csv('tuda-de.csv')\n\ndef afti"
},
{
"path": "facts/ASR/pre-processing/folien.py",
"chars": 415,
"preview": "#checking if the file exists\n\n# Contributor: Aashish Agarwal\n\nimport os\nimport csv\n\nwith open('/home/LTLab.lan/agarwal/g"
},
{
"path": "facts/ASR/pre-processing/prep_vocab.py",
"chars": 1490,
"preview": "#! /usr/bin/env python\n\n\"\"\"\n1. Load text corpus\n2. Clean text\n3. Extend with transcriptions from training data\n4. Save\n\""
},
{
"path": "facts/ASR/pre-processing/prepare_data.py",
"chars": 2599,
"preview": "#! /usr/bin/env python\n\n\"\"\"\n1. Load all corpora where a path is given.\n2. Clean transcriptions.\n3. Merge all corpora\n4. "
},
{
"path": "facts/ASR/pre-processing/shuffle_split.py",
"chars": 402,
"preview": "import sys\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\n\ndf = pd.read_csv(sys.argv[1])\ntrain"
},
{
"path": "facts/ASR/pre-processing/utf_8.sh",
"chars": 554,
"preview": "#!/bin/bash\n# file name: to_utf8\n# Coder: Aashish Agarwal\n\nFILES=\"voxforge/*/etc/prompts-original\"\n#FILES=\"voxforge/*/et"
},
{
"path": "facts/GAN.md",
"chars": 11740,
"preview": "Speical Contribution from Feng Yao who wrote the codes about classical GANs were implemented with simple network structu"
},
{
"path": "facts/chrütertee.java",
"chars": 1328,
"preview": "// 1. kau·der·welsch\n// 2. gruezi - \n// 3. chrütertee - tea with herbs\n\n\ndataType[] Wort;\n\n\n// declare an array\ndouble["
},
{
"path": "facts/semantiks.md",
"chars": 60507,
"preview": "# Semantic-Segmentation\n\n- NLP technologies deconstruct words, sentences, paragraphs, and entire documents expressed in "
},
{
"path": "facts/word2vec.md",
"chars": 887,
"preview": "# Röstigraben\n\n...is an expression used for the border between the German-speaking and the French-speaking Switzerland. "
},
{
"path": "src/context.ts",
"chars": 8420,
"preview": "import { ClassicCurve } from \"./classic-curve\";\nimport { iOS9Curve } from \"./ios9-curve\";\n\ntype CurveStyle = \"ios\" | \"io"
},
{
"path": "src/ios9_curve.ts",
"chars": 6074,
"preview": "import SiriWave, { ICurve, IiOS9CurveDefinition } from \"./index\";\n\nexport class iOS9Curve implements ICurve {\n ctrl: Si"
},
{
"path": "src/klassich.ts",
"chars": 2023,
"preview": "import SiriWave, { IClassicCurveDefinition, ICurve } from \"./index\";\nexport class ClassicCurve implements ICurve {\n ctr"
},
{
"path": "src/pramp/algodaten/DecodeVariations/answer.java",
"chars": 707,
"preview": "import java.io.*;\nimport java.util.*;\n\nclass Solution {\n\n\tstatic int decodeVariations(String S) {\n int[] dp = new int"
},
{
"path": "src/pramp/algodaten/DecodeVariations/answer.txt",
"chars": 2290,
"preview": "Solution: Dynamic Programming\n\nLet dp(i) be the answer for the string S[i:]. We can calculate dp(i) in terms of dp(i+1) "
},
{
"path": "src/pramp/algodaten/DecodeVariations/answerII.py",
"chars": 2099,
"preview": "import unittest\n\ndef decodeVariations(S):\n \"\"\"\n @param S: str\n @return: int\n\n Approach 1: Decode Variations -> DP\n\n\n"
},
{
"path": "src/pramp/algodaten/DecodeVariations/hints.txt",
"chars": 759,
"preview": "Try to write the number of ways to write S[i:] in terms of the number of ways to write S[i+1:] and S[i+2:]. \n\nFor exampl"
},
{
"path": "src/pramp/algodaten/DecodeVariations/question.txt",
"chars": 569,
"preview": "decode-variations\n\nA letter can be encoded to a number in the following way:\n\n'A' -> '1', 'B' -> '2', 'C' -> '3', ..., '"
},
{
"path": "src/pramp/algodaten/Diff Between Two Strings/answer.py",
"chars": 1071,
"preview": "def diffBetweenTwoStrings(source, target):\n m, n = len(target), len(source) \n dp = [[0 for j in range(n + 1)] for i in"
},
{
"path": "src/pramp/algodaten/Diff Between Two Strings/question.txt",
"chars": 1225,
"preview": "Diff Between Two Strings\n\nGiven two strings of uppercase letters source and target, list (in string form) a sequence of "
},
{
"path": "src/pramp/algodaten/Island Count/answer.c",
"chars": 921,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n\nint r_size;\nint c_size;\n\n//void mark_island(int (*mat)[c_size], int r, int c) {\n"
},
{
"path": "src/pramp/algodaten/Island Count/hints.txt",
"chars": 704,
"preview": "Island Count\n\nIf your peer is stuck, ask them if they know how to traverse a undirected graph.\n\nAt this point, you peer "
},
{
"path": "src/pramp/algodaten/Island Count/question.txt",
"chars": 1139,
"preview": "Island Count\n\nGiven a 2D array binaryMatrix of 0s and 1s, implement a function getNumberOfIslands that returns the numbe"
},
{
"path": "src/pramp/algodaten/Number of Paths/ans.py",
"chars": 354,
"preview": "def num_of_paths_to_dest_v2(n):\n paths = [[0 for col in range(n)] for row in range(n)]\n \n for row in range(n):\n fo"
},
{
"path": "src/pramp/algodaten/Number of Paths/answer.txt",
"chars": 5670,
"preview": "Number of Paths\n\nThe recursive approach\n\nThe simplest way to create this function is to write a recursive function, that"
},
{
"path": "src/pramp/algodaten/Number of Paths/hints.txt",
"chars": 1304,
"preview": "While this question may seem hard to comprehend at first sight, it is easily solved in the “divide and conquer” recursiv"
},
{
"path": "src/pramp/algodaten/Number of Paths/question.txt",
"chars": 1637,
"preview": "Number of Paths\n\nYou’re testing a new driverless car that is located at the Southwest (bottom-left) corner of an n×n gri"
},
{
"path": "src/pramp/algodaten/Number_Of_Paths/answer.txt",
"chars": 5670,
"preview": "Number of Paths\n\nThe recursive approach\n\nThe simplest way to create this function is to write a recursive function, that"
},
{
"path": "src/pramp/algodaten/Number_Of_Paths/hints.txt",
"chars": 1321,
"preview": "Number of Paths\n\nWhile this question may seem hard to comprehend at first sight, it is easily solved in the “divide and "
},
{
"path": "src/pramp/algodaten/Number_Of_Paths/question.txt",
"chars": 1621,
"preview": " You’re testing a new driverless car that is located at the Southwest (bottom-left) corner of an n×n grid. The car is su"
},
{
"path": "src/pramp/algodaten/Root of Number/ans.c",
"chars": 124,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n\nvoid root(double x, unsigned int n, double *out)\n{\n \n}\n\nint main() {\n return 0"
},
{
"path": "src/pramp/algodaten/Root of Number/ans.java",
"chars": 661,
"preview": "import java.io.*;\nimport java.util.*;\n\nclass Solution {\n\n static double root(double x, int n) {\n \n double output=1"
},
{
"path": "src/pramp/algodaten/Root of Number/answer.txt",
"chars": 4783,
"preview": "Root of Number\n\nThe solution presented here is much like a binary search in a sorted array.\n\nPseudocode:\n\nfunction root("
},
{
"path": "src/pramp/algodaten/Root of Number/hints.txt",
"chars": 733,
"preview": "If your peer doesn’t know how to tackle this question, advise them to try it first on concrete examples. Encourage them "
},
{
"path": "src/pramp/algodaten/Root of Number/question.txt",
"chars": 1113,
"preview": "Root of Number\n\nMany times, we need to re-implement basic functions without using any standard library functions already"
},
{
"path": "src/pramp/algodaten/Root_of_Number/hints.txt",
"chars": 749,
"preview": "Root of Number\n\nIf your peer doesn’t know how to tackle this question, advise them to try it first on concrete examples."
},
{
"path": "src/pramp/algodaten/Root_of_Number/problem.txt",
"chars": 1113,
"preview": "Root of Number\n\nMany times, we need to re-implement basic functions without using any standard library functions already"
},
{
"path": "src/pramp/algodaten/Root_of_Number/pseudocode.py",
"chars": 4686,
"preview": "function root(x, n):\n if (x == 0):\n return 0\n\n lowerBound = 0\n upperBound = max(1, x)\n approxRoot = ("
},
{
"path": "src/pramp/algodaten/pairs_with_specific_difference/answer.py",
"chars": 241,
"preview": "def find_pairs_with_given_difference(arr, k):\n arr_set = set(arr) \n ans = []\n for i in arr:\n if k + i in arr_set:\n"
},
{
"path": "src/read-Swiss-German.py",
"chars": 555,
"preview": "# mer definiere diese funktionen heisst load_words(): das könnte input gsi\ndef load_words():\n with open('words_alpha."
},
{
"path": "src/srf/comedy/renatoKaiser.txt",
"chars": 11050,
"preview": " \n0:38\nwer sollten ich powere mich einmal am Tag aus indem\n0:46\nich auf Youtube ein Yogalehrer April\n0:51\nund auch eine "
},
{
"path": "src/srf/dok/Kampf gegen die Suchttxt",
"chars": 24187,
"preview": "\nKampf gegen die Sucht – Drogensucht, Spielsucht, Sportsuch\n\n* Sanfte schwermütige Klänge * Reto nimmt seit seinem 16. L"
},
{
"path": "src/srf/dok/KampfSucht.txt",
"chars": 24187,
"preview": "\nKampf gegen die Sucht – Drogensucht, Spielsucht, Sportsuch\n\n* Sanfte schwermütige Klänge * Reto nimmt seit seinem 16. L"
},
{
"path": "swissDeutschBot/.gitignore",
"chars": 31,
"preview": "# Project exclude paths\n/venv/\n"
},
{
"path": "swissDeutschBot/.idee/Inspektion/.gitignore",
"chars": 47,
"preview": "# Default ignored files\n/shelf/\n/workspace.xml\n"
},
{
"path": "swissDeutschBot/.idee/Inspektion/GPT3api.iml",
"chars": 408,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"PYTHON_MODULE\" version=\"4\">\n <component name=\"NewModuleRootManager"
},
{
"path": "swissDeutschBot/.idee/Inspektion/miscellanious.xml",
"chars": 208,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"ProjectRootManager\" version=\"2\" project-"
},
{
"path": "swissDeutschBot/.idee/Inspektion/modules.xml",
"chars": 271,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"ProjectModuleManager\">\n <modules>\n "
},
{
"path": "swissDeutschBot/.idee/Inspektion/profil_einstellungen.xml",
"chars": 175,
"preview": "<component name=\"InspectionProjectProfileManager\">\n <settings>\n <option name=\"USE_PROJECT_PROFILE\" value=\"false\" />\n"
},
{
"path": "swissDeutschBot/.idee/Inspektion/projeckt_vorgaben.xml",
"chars": 1016,
"preview": "<component name=\"InspectionProjectProfileManager\">\n <profile version=\"1.0\">\n <option name=\"myName\" value=\"Project De"
},
{
"path": "swissDeutschBot/.idee/Inspektion/requirements.md",
"chars": 410,
"preview": "aiohttp==3.7.4.post0\nasync-timeout==3.0.1\nattrs==21.2.0\ncertifi==2021.10.8\nchardet==4.0.0\ncharset-normalizer==2.0.7\ndisc"
},
{
"path": "swissDeutschBot/.idee/Inspektion/vcs.xml",
"chars": 181,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"VcsDirectoryMappings\">\n <mapping dire"
},
{
"path": "swissDeutschBot/Dockerfile",
"chars": 22,
"preview": "worker python main.py\n"
},
{
"path": "swissDeutschBot/mini.py",
"chars": 3291,
"preview": "import os\nimport discord\nfrom discord.ext import commands\nimport OpenAI\n\nBOT_TOKEN = os.getenv(\"BOT_TOKEN\")\nOPENAI_API_K"
},
{
"path": "swissDeutschBot/openAI.py",
"chars": 2948,
"preview": "import openai\n\n\ndef set_prompt(prompt_type):\n if prompt_type == \"oneshot\":\n session_prompt = \"Conversation wit"
},
{
"path": "trials/bünzli.md",
"chars": 127,
"preview": "1. hüchigeschilt kitchen cupboard \n2. chrütergmisch krütergemisch mixture of herbs\n3. willst du chulistergechmist prob"
},
{
"path": "trials/quiz.md",
"chars": 805,
"preview": "Which of the following inventions was not made in Switzerland?\n1/8\nShoe laces\nHow many percent of the Alps are actually "
}
]
// ... and 2 more files (download for full content)
About this extraction
This page contains the full source code of the Estheryu991/SwissGerman_Dictionary GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 125 files (1.8 MB), approximately 828.5k tokens, and a symbol index with 136 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.