repo นี้มีทั้ง หลักสูตรออนไลน์ รวมถึงกรอบเว็บโอเพนซอร์ซที่ทันสมัย ในหลักสูตรคุณจะได้เรียนรู้วิธีการใช้ Spacy เพื่อสร้างระบบการทำความเข้าใจภาษาธรรมชาติขั้นสูงโดยใช้ทั้งแนวทางการเรียนรู้ตามกฎและเครื่อง ส่วนหน้าขับเคลื่อนโดย Gatsby, review.js และ plyr และการดำเนินการรหัส back-end ใช้สารยึดเกาะหรือไม่? มันคือโอเพ่นซอร์สทั้งหมดและเผยแพร่ภายใต้ใบอนุญาต MIT (รหัสและกรอบงาน) และ CC BY-NC (วัสดุหลักสูตร Spacy)
หลักสูตรนี้ส่วนใหญ่มีไว้สำหรับ การศึกษาด้วยตนเอง ใช่คุณสามารถโกง - โซลูชันทั้งหมดอยู่ใน repo นี้ไม่มีการลงโทษสำหรับการคลิก "แสดงคำแนะนำ" หรือ "แสดงโซลูชัน" และคุณสามารถทำเครื่องหมายแบบฝึกหัดที่ทำเมื่อคุณคิดว่าเสร็จแล้ว
| ภาษา | ตัวอย่างข้อความ 1 | แหล่งที่มา | ผู้เขียน |
|---|---|---|---|
| ภาษาอังกฤษ | ภาษาอังกฤษ | chapters/en , exercises/en | @Ines |
| ชาวเยอรมัน | ชาวเยอรมัน | chapters/de , exercises/de | @Ines, @Jette16 |
| เกี่ยวกับภาษาสเปน | เกี่ยวกับภาษาสเปน | chapters/es , exercises/es | @Mariacamilagl, @damian-romero |
| ภาษาฝรั่งเศส | ภาษาฝรั่งเศส | chapters/fr , exercises/fr | @datakime |
| ญี่ปุ่น | ญี่ปุ่น | chapters/ja , exercises/ja | @tamuhey, @hiroshi-matsuda-rit, @icoxfog417, @akirakubo, @forest1988, @ao9mame, @matsurih, @hiromuhota, @mei28, @polm |
| ชาวจีน | ชาวจีน | chapters/zh , exercises/zh | @crownpku |
| ชาวโปรตุเกส | ภาษาอังกฤษ | chapters/pt , exercises/pt | @Cristianasp |
หากคุณเห็นความผิดพลาดฉันมักจะขอบคุณคำขอดึง!
1. นี่คือภาษาที่ใช้สำหรับตัวอย่างข้อความและทรัพยากรที่ใช้ในแบบฝึกหัด ตัวอย่างเช่นเวอร์ชันภาษาเยอรมันของหลักสูตรยังใช้ตัวอย่างข้อความและรุ่นเยอรมัน ไม่สามารถแปลตัวอย่างโค้ดทั้งหมดได้เสมอไปดังนั้นการแปลบางอย่างอาจยังคงใช้และวิเคราะห์ข้อความภาษาอังกฤษเป็นส่วนหนึ่งของหลักสูตร
ตอนแรกฉันพัฒนาเนื้อหาสำหรับ Datacamp แต่ฉันต้องการสร้างเวอร์ชันฟรีเพื่อให้ผู้คนมากขึ้นและคุณไม่จำเป็นต้องสมัครใช้บริการของพวกเขา ในฐานะโครงการวันหยุดสุดสัปดาห์ฉันลงเอยด้วยการรวบรวมแอพเล็ก ๆ ของฉันเองเพื่อนำเสนอแบบฝึกหัดและเนื้อหาในวิธีที่สนุกสนานและโต้ตอบ
น่าจะใช่! หากคุณกำลังมองหาวิธี DIY ในการเผยแพร่วัสดุของคุณฉันหวังว่ากรอบเล็ก ๆ ของฉันจะมีประโยชน์ เพราะหลายคนแสดงความสนใจในเรื่องนี้ฉันได้รวบรวม repos เริ่มต้นที่คุณสามารถแยกและปรับ:
ines/course-starter-pythonines/course-starter-r แหล่งที่มาของแอพส่วนประกอบ UI และเฟรมเวิร์ก Gatsby สำหรับการสร้างหลักสูตรแบบโต้ตอบได้รับอนุญาตเป็น MIT เช่นซอฟต์แวร์โอเพนซอร์ซทั้งหมดของฉัน วัสดุหลักสูตรเอง (สไลด์และบท) ได้รับใบอนุญาตภายใต้ CC BY-NC ซึ่งหมายความว่าคุณสามารถใช้มันได้อย่างอิสระ - คุณไม่สามารถทำเงินได้
ก่อนอื่นขอบคุณมากนี่มันเจ๋งและมีคุณค่าต่อชุมชนจริงๆหรือ ฉันพยายามตั้งค่าโครงสร้างหลักสูตรดังนั้นจึงเป็นเรื่องง่ายที่จะเพิ่มภาษาที่แตกต่างกัน: ไฟล์เฉพาะภาษาถูกจัดระเบียบเป็นไดเรกทอรีใน exercises และ chapters และข้อความเฉพาะภาษาอื่น ๆ มีอยู่ใน locale.json หากคุณต้องการมีส่วนร่วมมีสองวิธีที่แตกต่างกันในการมีส่วนร่วม:
เริ่มโครงการแปลชุมชน นี่เป็นวิธีที่ง่ายที่สุดและไม่มีสาย คุณสามารถแยก repo, คัดลอกวางเวอร์ชันภาษาอังกฤษเปลี่ยนรหัสภาษาเริ่มแปลและเชิญผู้อื่นให้มีส่วนร่วม (ถ้าคุณต้องการ) หากคุณกำลังมองหาผู้มีส่วนร่วมอย่าลังเลที่จะเปิดปัญหาที่นี่หรือแท็ก @spacy_io บน Twitter เพื่อให้เราสามารถช่วยให้คำพูดออกมาได้ นอกจากนี้เรายังยินดีที่จะตอบคำถามของคุณเกี่ยวกับการติดตามปัญหา
ทำให้เราเป็นข้อเสนอ เราเปิดให้มีการแปลภาษาสำหรับภาษาต่าง ๆ ดังนั้นหากคุณสนใจส่งอีเมลถึงเราที่ [email protected] และรวมข้อเสนอของคุณกำหนดเวลาเวลาโดยประมาณและเล็กน้อยเกี่ยวกับคุณและพื้นหลังของคุณ (และงานเขียนหรือการแปลทางเทคนิคใด ๆ ที่คุณเคยทำในอดีตถ้ามี) ไม่สำคัญว่าคุณจะอยู่ที่ไหน แต่คุณควรจะออกใบแจ้งหนี้เป็นอิสระหรือคล้ายกันขึ้นอยู่กับประเทศของคุณ
ขอบคุณอีกครั้งนี่เจ๋งสุด ๆ ! ในขณะที่วิดีโอภาษาอังกฤษและเยอรมันรวมถึงการบันทึกวิดีโอ แต่ก็ไม่ได้เป็นข้อกำหนดและเรายินดีที่จะให้แทร็กเสียงข้างสไลด์ เราจะดูแลการประมวลผลและการแก้ไขวิดีโอดังนั้นสิ่งที่เราต้องการคือการบันทึกเสียง หากคุณรู้สึกสะดวกสบายในการบันทึกตัวเองอ่านบันทึกสไลด์ในภาษาของคุณส่งอีเมลถึงเราที่ [email protected] และทำให้เรามีข้อเสนอและรวมถึงคุณและงานที่คล้ายกันที่คุณเคยทำในอดีตถ้ามี
ในการเริ่มต้นเซิร์ฟเวอร์การพัฒนาท้องถิ่นให้ติดตั้ง Gatsby และจากนั้นการพึ่งพาอื่น ๆ ทั้งหมดจากนั้นใช้ npm run dev เพื่อเริ่มต้นเซิร์ฟเวอร์การพัฒนา ตรวจสอบให้แน่ใจว่าคุณติดตั้งอย่างน้อยโหนด 10.15
npm install -g gatsby-cli # Install Gatsby globally
npm install # Install dependencies
npm run dev # Run the development server หากทำงานกับ Docker เพียงแค่ Run make build แล้ว make gatsby-dev
เมื่อสร้างเว็บไซต์ Gatsby จะค้นหาไฟล์ .py และทำให้เนื้อหาของพวกเขาพร้อมใช้งานเพื่อค้นหาผ่าน GraphQl สิ่งนี้ช่วยให้เราใช้รหัสดิบภายในแอป ภายใต้ประทุนแอปใช้สารยึดเกาะเพื่อให้บริการภาพที่มีการพึ่งพาแพ็คเกจรวมถึงโมเดล Spacy โดยการโทรไปยัง JupyterLab เราสามารถเรียกใช้รหัสโดยใช้เคอร์เนลที่ใช้งานอยู่ สิ่งนี้ช่วยให้คุณแก้ไขรหัสในเบราว์เซอร์และดูผลลัพธ์สด ดู juniper Repo ของฉันสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการใช้งาน
ในการตรวจสอบรหัสเมื่อผู้ใช้ตี "ส่ง" ฉันกำลังใช้เคล็ดลับแฮ็คเล็กน้อย เนื่องจากรหัส Python ถูกส่งกลับไปยังเคอร์เนลเป็นสตริงเราจึงสามารถจัดการและเพิ่มการทดสอบได้ - ตัวอย่างเช่นการออกกำลังกาย exc_01_02_01.py จะได้รับการตรวจสอบความถูกต้องโดยใช้ test_01_02_01.py (ถ้ามี) รหัสผู้ใช้และการทดสอบรวมกันโดยใช้เทมเพลตสตริง ในขณะนี้ testTemplate ใน meta.json มีลักษณะเช่นนี้:
from wasabi import msg
__msg__ = msg
__solution__ = """${solution}"""
${solution}
${test}
try:
test()
except AssertionError as e:
__msg__.fail(e)
หากมีอยู่ ${solution} จะถูกแทนที่ด้วยค่าสตริงของรหัสผู้ใช้ที่ส่ง ในกรณีนี้เรากำลังแทรกสองครั้ง: หนึ่งครั้งเป็นสตริงเพื่อให้เราสามารถตรวจสอบได้ว่าการส่งมีบางสิ่งบางอย่างและครั้งหนึ่งเป็นรหัสดังนั้นเราจึงสามารถเรียกใช้และตรวจสอบวัตถุที่สร้างขึ้นได้จริง ${test} ถูกแทนที่ด้วยเนื้อหาของไฟล์ทดสอบ ฉันยังสร้างเครื่องพิมพ์ของ wasabi เป็น __msg__ ดังนั้นเราจึงสามารถพิมพ์ข้อความสวย ๆ ในการทดสอบได้อย่างง่ายดาย สุดท้าย try / accept บล็อกตรวจสอบว่าฟังก์ชั่นการทดสอบจะเพิ่ม AssertionError และถ้าเป็นเช่นนั้นแสดงข้อความแสดงข้อผิดพลาด นอกจากนี้ยังซ่อนการติดตามข้อผิดพลาดเต็มรูปแบบ (ซึ่งสามารถรั่วไหลคำตอบที่ถูกต้องได้อย่างง่ายดาย)
ไฟล์ทดสอบนั้นมีลักษณะเช่นนี้:
def test ():
assert "spacy.load" in __solution__ , "Are you calling spacy.load?"
assert nlp . meta [ "lang" ] == "en" , "Are you loading the correct model?"
assert nlp . meta [ "name" ] == "core_web_sm" , "Are you loading the correct model?"
assert "nlp(text)" in __solution__ , "Are you processing the text correctly?"
assert "print(doc.text)" in __solution__ , "Are you printing the Doc's text?"
__msg__ . good (
"Well done! Now that you've practiced loading models, let's look at "
"some of their predictions."
)ด้วยวิธีการนี้มันเป็น ไป ไม่ได้ที่จะตรวจสอบอินพุตอย่างสมบูรณ์แบบ - มีตัวเลือกมากเกินไปและเราต้องการหลีกเลี่ยงข้อดีที่ผิดพลาด
การทดสอบอัตโนมัติตรวจสอบให้แน่ใจว่ารหัสโซลูชันที่ให้เข้ากันได้กับไฟล์ทดสอบที่ใช้เพื่อตรวจสอบการส่ง ชุดทดสอบใช้พลังงานจากเฟรมเวิร์ก pytest และไฟล์ทดสอบที่เรียกใช้งานได้จะถูกสร้างขึ้นโดยอัตโนมัติในไดเรกทอรี __tests__ ก่อนที่เซสชันการทดสอบจะเริ่มขึ้น ดู conftest.py สำหรับรายละเอียดการใช้งาน
# Install requirements
pip install -r binder/requirements.txt
# Run the tests (will generate the files automatically)
python -m pytest __tests__ หากทำงานกับ Docker เพียงแค่เรียกใช้ make build แล้ว make pytest
├── binder
| └── requirements.txt # Python dependency requirements for Binder
├── chapters # chapters, grouped by language
| ├── en # English chapters, one Markdown file per language
| | └── slides # English slides, one Markdown file per presentation
| └── ... # other languages
├── exercises # code files, tests and assets for exercises
| ├── en # English exercises, solutions, tests and data
| └── ... # other languages
├── public # compiled site
├── src # Gatsby/React source, independent from content
├── static # static assets like images, available in slides/chapters
├── locale.json # translations of meta and UI text
├── meta.json # course metadata
└── theme.sass # UI theme colors and settings requirements.txt ในที่เก็บกำหนดแพ็คเกจที่ติดตั้งเมื่อสร้างด้วยสารยึดเกาะ สำหรับหลักสูตรนี้ฉันใช้ repo แหล่งที่มาเป็น repo สารยึดเกาะเพราะมันช่วยให้ทุกอย่างอยู่ในที่เดียว นอกจากนี้ยังช่วยให้การอ้างอิงแบบฝึกหัดและโหลดไฟล์อื่น ๆ (เช่น JSON) ซึ่งจะถูกคัดลอกไปยังสภาพแวดล้อม Python ฉันสร้างสารยึดเกาะจาก binder สาขาซึ่งฉันจะอัปเดตเฉพาะเมื่อไฟล์ที่เกี่ยวข้องกับสารยึดเกาะเปลี่ยน มิฉะนั้นการอัปเดตทุกครั้งที่เป็น master จะทำให้เกิดการสร้างภาพขึ้นใหม่
คุณสามารถระบุการตั้งค่าสารยึดเกาะเช่น repo, สาขาและประเภทเคอร์เนลในส่วน "juniper" ของ meta.json ฉันขอแนะนำให้เรียกใช้งานสร้างครั้งแรกผ่านอินเทอร์เฟซบนเว็บไซต์ Binder เนื่องจากจะให้บันทึกรายละเอียดและข้อเสนอแนะเกี่ยวกับว่าทุกอย่างทำงานได้ตามที่คาดไว้หรือไม่ ป้อน URL ที่เก็บข้อมูลของคุณคลิก "เปิดตัว" และรอให้ติดตั้งการอ้างอิงและสร้างภาพ

บทจะถูกวางไว้ใน /chapters และเป็นไฟล์ markdown ที่ประกอบด้วย <exercise> ส่วนประกอบ พวกเขาจะกลายเป็นหน้าเช่น /chapter1 ในบล็อก frontmatter ของพวกเขาที่ด้านบนของไฟล์พวกเขาจำเป็นต้องระบุ type: chapter เช่นเดียวกับ meta ต่อไปนี้:
---
title : The chapter title
description : The chapter description
prev : /chapter1 # exact path to previous chapter or null to not show a link
next : /chapter3 # exact path to next chapter or null to not show a link
id : 2 # unique identifier for chapter
type : chapter # important: this creates a standalone page from the chapter
---
สไลด์ถูกวางไว้ใน /slides และเป็นไฟล์ markdown ที่ประกอบด้วยเนื้อหาสไลด์คั่นด้วย --- พวกเขาจำเป็นต้องระบุบล็อก frontmatter ต่อไปนี้ที่ด้านบนของไฟล์:
---
type : slides
---
สไลด์แรกและสุดท้าย ใช้เลย์เอาต์พิเศษและจะแสดงพาดหัวตรงกลางของสไลด์ หมายเหตุลำโพง (ในกรณีนี้สคริปต์) สามารถเพิ่มได้ที่ส่วนท้ายของสไลด์นำหน้าด้วย Notes: จากนั้นพวกเขาจะแสดงทางด้านขวาถัดจากสไลด์ นี่คือตัวอย่างไฟล์สไลด์:
---
type : slide
---
# Processing pipelines
Notes: This is a slide deck about processing pipelines.
---
# Next slide
- Some bullet points here
- And another bullet point
< img src = " /image.jpg " alt = " An image located in /static " />เมื่อใช้องค์ประกอบที่กำหนดเองตรวจสอบให้แน่ใจว่าได้วางแนวใหม่ระหว่างแท็กเปิด/ปิดและเด็ก ๆ มิฉะนั้นเนื้อหา markdown อาจไม่ถูกต้อง
<exercise>คอนเทนเนอร์ของแบบฝึกหัดเดียว
| การโต้แย้ง | พิมพ์ | คำอธิบาย |
|---|---|---|
id | หมายเลข / สตริง | รหัสออกกำลังกายที่ไม่ซ้ำกันภายในบท |
title | สาย | ชื่อการออกกำลังกาย |
type | สาย | ประเภทเสริม "slides" ทำให้คอนเทนเนอร์กว้างขึ้นและเพิ่มไอคอน |
| เด็ก | - | เนื้อหาของการออกกำลังกาย |
< exercise id = " 1 " title = " Introduction to spaCy " >
Content goes here...
</ exercise ><codeblock>| การโต้แย้ง | พิมพ์ | คำอธิบาย |
|---|---|---|
id | หมายเลข / สตริง | ตัวระบุที่ไม่ซ้ำกันของแบบฝึกหัดรหัส |
source | สาย | ชื่อของไฟล์ต้นฉบับ (โดยไม่ต้องขยายไฟล์) ค่าเริ่มต้นเป็น exc_${id} หากไม่ได้ตั้งค่า |
solution | สาย | ชื่อของไฟล์โซลูชัน (โดยไม่ต้องขยายไฟล์) ค่าเริ่มต้นเป็น solution_${id} หากไม่ได้ตั้งค่า |
test | สาย | ชื่อของไฟล์ทดสอบ (โดยไม่ต้องขยายไฟล์) ค่าเริ่มต้นใน test_${id} หากไม่ได้ตั้งค่า |
| เด็ก | สาย | คำแนะนำเสริมจะปรากฏขึ้นเมื่อผู้ใช้คลิก "แสดงคำแนะนำ" |
< codeblock id = " 02_03 " >
This is a hint!
</ codeblock ><slides>คอนเทนเนอร์เพื่อแสดงสไลด์แบบโต้ตอบโดยใช้เปิดเผย. js และไฟล์ markdown
| การโต้แย้ง | พิมพ์ | คำอธิบาย |
|---|---|---|
source | สาย | ชื่อไฟล์สไลด์ (โดยไม่มีส่วนขยายไฟล์) |
< slides source = " chapter1_01_introduction-to-spacy " >
</ slides ><choice>คอนเทนเนอร์สำหรับคำถามแบบปรนัย
| การโต้แย้ง | พิมพ์ | คำอธิบาย |
|---|---|---|
id | สตริง / หมายเลข | รหัสที่ไม่ซ้ำกันเสริม สามารถใช้งานได้หากมีคำถามทางเลือกมากกว่าหนึ่งคำถามในแบบฝึกหัดเดียว |
| เด็ก | โหนด | ส่วนประกอบ <opt> สำหรับตัวเลือกเท่านั้น |
< choice >
< opt text = " Option one " >You have selected option one! This is not good.</ opt >
< opt text = " Option two " correct = " true " >Yay! </ opt >
</ choice ><opt>ตัวเลือกแบบปรนัย
| การโต้แย้ง | พิมพ์ | คำอธิบาย |
|---|---|---|
text | สาย | ข้อความตัวเลือกที่จะแสดง รองรับ HTML แบบอินไลน์ |
correct | สาย | "true" หากตัวเลือกคือคำตอบที่ถูกต้อง |
| เด็ก | สาย | ข้อความที่จะแสดงหากเลือกตัวเลือก (อธิบายว่าทำไมมันถูกต้องหรือไม่ถูกต้อง) |