การจำแนกข้อความขนาดใหญ่


18

ฉันต้องการจัดหมวดหมู่ข้อมูลข้อความของฉัน ฉันมี300 classes200 เอกสารการฝึกอบรมต่อชั้นเรียน (ดังนั้น60000 documents in total) และนี่น่าจะส่งผลให้ข้อมูลมิติสูงมาก (เราอาจมองเกินกว่า1 ล้านมิติ )

ฉันต้องการดำเนินการตามขั้นตอนต่อไปนี้ในไปป์ไลน์ (เพื่อให้คุณได้ทราบถึงความต้องการของฉัน):

  1. การแปลงแต่ละเอกสารเป็นฟีเจอร์เวกเตอร์ ( tf-idfหรือvector space model)
  2. Feature selection( Mutual Informationโดยเฉพาะอย่างยิ่งหรือมาตรฐานอื่น ๆ )
  3. การฝึกอบรมลักษณนาม ( SVM, Naive Bayes, Logistic RegressionหรือRandom Forest)
  4. การทำนายข้อมูลที่มองไม่เห็นตามตัวจําแนกรุ่นที่ผ่านการฝึกอบรม

ดังนั้นคำถามคือฉันใช้เครื่องมือ / กรอบการทำงานสำหรับจัดการข้อมูลมิติสูงเช่นนี้หรือไม่ ฉันตระหนักถึงผู้ต้องสงสัยตามปกติ (R, WEKA ... ) แต่เท่าที่ความรู้ของฉันไป (ฉันอาจผิด) อาจไม่มีใครสามารถจัดการข้อมูลขนาดใหญ่นี้ได้ มีเครื่องมือเก็บของอื่น ๆ ที่ฉันสามารถดูได้หรือไม่?

ถ้าฉันต้องขนานมันฉันควรจะดูApache Mahoutหรือไม่? ดูเหมือนว่ามันอาจจะไม่ได้มีฟังก์ชั่นที่ฉันต้องการ

ขอบคุณทุกคนล่วงหน้า


อัปเดต: ฉันดูเว็บไซต์นี้รายชื่อรับเมล R และอินเทอร์เน็ตโดยทั่วไป ฉันเห็นว่าปัญหาต่อไปนี้อาจเกิดขึ้นในสถานการณ์ของฉัน:

(1) การประมวลผลข้อมูลของฉันล่วงหน้าโดยใช้ R ( โดยเฉพาะอย่างยิ่งแพคเกจtm ) อาจใช้การไม่ได้เนื่องจากtmจะช้าอย่างเด็ดขาด

(2) เนื่องจากฉันจะต้องใช้ชุดของแพ็กเกจ R (การประมวลผลก่อน, เมทริกซ์เบาบาง, ตัวแยกประเภท ฯลฯ ) การทำงานร่วมกันระหว่างแพ็กเกจอาจกลายเป็นปัญหาและฉันอาจมีค่าใช้จ่ายเพิ่มเติมในการแปลงข้อมูลจากรูปแบบหนึ่ง . ตัวอย่างเช่นถ้าฉันทำการประมวลผลล่วงหน้าโดยใช้tm(หรือเครื่องมือภายนอกเช่น WEKA) ฉันจะต้องคิดหาวิธีแปลงข้อมูลนี้เป็นรูปแบบที่ไลบรารี HPC ใน R สามารถอ่านได้ และอีกครั้งมันไม่ชัดเจนสำหรับฉันหากแพ็กเกจตัวแยกประเภทจะใช้ข้อมูลโดยตรงตามที่มีให้ในไลบรารี HPC

ฉันกำลังติดตามใช่ไหม? และที่สำคัญกว่านั้นฉันกำลังเข้าท่า?


R สามารถจัดการชุดข้อมูลที่มีขนาดใหญ่กว่านี้ได้คุณเพียงแค่ต้องใช้เครื่องมือที่มีอยู่ให้ดี ไม่มีความแตกต่างระหว่างสิ่งที่สามารถทำได้ในภาษาหรือสภาพแวดล้อมที่สำคัญใด ๆ แม้ว่า Weka และ Mahout จะล่าช้าในแง่ของสิ่งที่มีอยู่ FWIW นี่เป็นขนาดตัวอย่างที่ค่อนข้างเล็กและมิติ 1M ไม่ใช่เรื่องใหญ่ แต่มันก็เกินสถิติ คำแนะนำของฉันคือ R หรือ Python เนื่องจากทั้งฟรีและง่ายสำหรับผู้เริ่มต้น Matlab ไม่ฟรี แต่ก็ดีเหมือนกัน นอกจากนี้ยังต้องเสียภาษีจำนวนมากเมื่อคุณใช้คอมพิวเตอร์จำนวนมาก
Iterator

1
จุดสำคัญยิ่งกว่าคือคุณมีคลาสมากกว่าตัวอย่างต่อคลาสและคุณฝังไว้ในพื้นที่มิติที่สูงมาก ฉันไม่แน่ใจว่าคุณจะได้รับการแยกชั้นดีมากที่นี่ คุณมีความสัมพันธ์เชิงโครงสร้างบ้างหรือไม่สำหรับชั้นเรียนของคุณ? ถ้าเป็นเช่นนั้นวิธีการเหล่านี้บางอย่างอาจเสียค่าใช้จ่ายไม่ดีหากไม่มีข้อมูลเชิงลึก
Iterator

1
คุณสามารถใช้foreachไลบรารีเขียนโค้ดแบบขนานใน R ได้ผลดีโดยเฉพาะอย่างยิ่งเมื่อใช้ร่วมกับฟอเรสต์แบบสุ่มซึ่งง่ายต่อการขนาน
ซัค

2
คำถามสองสามข้อ: 1) คุณสนใจที่จะเปรียบเทียบวิธีการเรียนรู้ประเภทต่าง ๆ ทั้งหมดที่คุณพูดถึงหรือคุณแค่ต้องการที่จะทำงานให้เสร็จ 2) เอกสารแต่ละรายการเป็นของ 1, 1 หรือมากกว่านั้นหรือ 0 หรือมากกว่าของคลาส? 3) คุณต้องการใช้การเลือกคุณสมบัติด้วยเหตุผลบางอย่างโดยเฉพาะหรือคุณคิดว่ามันจำเป็นหรือไม่? ฉันเห็นด้วยกับความคิดเห็นอื่น ๆ ว่านี่เป็นปัญหาขนาดปานกลางตามมาตรฐานในปัจจุบันและไม่จำเป็นต้องลดขนาด
DavidDLewis

1
ฉันทำงานเกี่ยวกับการจัดหมวดหมู่ข้อความที่เกี่ยวข้องกับหัวข้อเกือบ 10,000 รายการ (เช่นชั้นเรียนหรือหมวดหมู่หรือคำใดก็ตามที่คุณต้องการ) ฉันกำลังปรับจูนระบบการจำแนกข้อความนี้ในระดับนี้ ฉันไม่สามารถแบ่งปันเทคนิคของตัวเองในขณะที่พวกเขาเป็นเจ้าของ แต่ฉันมีคำแนะนำนิดหน่อย: ระมัดระวังในการสมมติว่าเทคนิคที่แนะนำบางส่วนมีการปรับระดับเว้นแต่ว่าได้พิสูจน์แล้วว่าทำเช่นนั้น จากประสบการณ์ของผมมีน้อยมาก

คำตอบ:


13

สิ่งนี้ควรเป็นไปได้ที่จะทำให้มันทำงานได้ตราบใดที่ข้อมูลถูกแสดงเป็นโครงสร้างข้อมูลแบบเบาบางเช่น scipy.sparse.csr_matrixอินสแตนซ์ใน Python ผมเขียนกวดวิชาสำหรับการทำงานเกี่ยวกับข้อมูลที่เป็นข้อความ มันเป็นไปได้ต่อไปเพื่อลดการใช้หน่วยความจำเพิ่มเติมโดยใช้ประโยชน์จากเคล็ดลับ hashing นี้: ปรับให้ใช้HashingVectorizerแทนหรือCountingVectorizer TfidfVectorizerนี่คือคำอธิบายในส่วนเอกสารข้อความที่มีการสกัด

โดยทั่วไปแล้วป่าสุ่มมีราคาแพงกว่าแบบจำลองเชิงเส้น (เช่นเครื่องสนับสนุนเวกเตอร์เชิงเส้นและการถดถอยแบบโลจิสติก) และ Multinomial หรือ Bernoulli ไร้เดียงสา Bayes และสำหรับปัญหาการจำแนกข้อความส่วนใหญ่ที่ไม่แม่นยำ

หาก scikit เรียนรู้จบลงไม่สามารถปรับขนาดให้กับปัญหาของคุณVowpal Wabbitจะทำ (และอาจเร็วกว่า sklearn) แม้ว่ามันจะไม่ใช้โมเดลทั้งหมดที่คุณกำลังพูดถึง

แก้ไขเมื่อเดือนเมษายน 2558 เพื่อสะท้อนถึงสถานะปัจจุบันของห้องสมุด scikit-Learn และเพื่อแก้ไขลิงก์ที่เสียหาย


ปัญหาที่เกิดขึ้นกับการใช้เทคนิคการลดขนาดที่ไม่เป็นมาตรฐานคือคุณมีแนวโน้มที่จะประสบปัญหาเมื่อคุณพยายามเผยแพร่งานของคุณ อย่างน้อยในฟิลด์การจำแนกข้อความฉันรู้ว่าผู้วิจารณ์ต้องการเห็นเทคนิคที่ใช้กันทั่วไป (ทำให้ง่ายต่อการเปรียบเทียบกับเทคนิคการจำแนกประเภทที่มีอยู่ด้วย)
user721975

ไม่ต้องกังวล - @ogrisel ไม่ได้พูดถึงสิ่งที่ไม่ได้มาตรฐานอย่างน้อยก็ไม่เกี่ยวข้องกับการจัดหมวดหมู่ข้อความที่ทันสมัยแม้ว่าฉันยังไม่ได้อ่านบทช่วยสอนของเขา
Iterator

+1 ฉันคิดว่า Python น่าจะเป็นวิธีที่สนุกสนาน มีแพ็คเกจล่าสุดใน R สำหรับการขุดข้อความ แต่ถ้ามีการคำนวณมากกว่าความเชี่ยวชาญทางสถิติและความสนใจ Python จะเป็นคำแนะนำของฉัน
Iterator

@ogrisel: ความรุ่งโรจน์สำหรับผลงานที่คุณและคนอื่น ๆ ได้ทำให้เข้าใจ ฉันแนะนำให้ใช้กับหลาย ๆ คนที่ทำงานใน Python - การออกแบบทั้งหมดเป็นแบบอย่าง
Iterator

สำหรับการลดขนาด "ที่ไม่ได้มาตรฐาน" (ใช้การฉายแบบสุ่ม) และฟีเจอร์การแฮชตรวจสอบเคล็ดลับการแฮ็กโดย John Langford และการสนทนาเกี่ยวกับ metaoptimizeนี้
ogrisel

10

Gensimสำหรับ Python เป็นเวทมนต์ และเนื่องจากอยู่ใน Python คุณสามารถใช้ร่วมกับคำแนะนำของ @ ogrisel


1

ไม่ใช่เสียงดังตุ๊ดฮอร์นของฉันเอง แต่ฉันทำซีรีย์วิดีโอยอดนิยมในการวิเคราะห์ข้อความด้วย Rapidminer คุณสามารถดูได้ที่นี่:

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

คุณอาจหลีกเลี่ยงการเลือกคุณสมบัติเพียงใช้ตัวแยกประเภทที่ไม่ได้สร้างเมทริกซ์ล้าน * ล้านในหน่วยความจำ :)

การถดถอยโลจิสติกจะทำให้หายใจไม่ออกในหลายมิตินั้น Naive Bayes ถือว่าขนาดที่เป็นอิสระดังนั้นคุณจะสบายดี SVM ไม่ได้ขึ้นอยู่กับจำนวนมิติ (แต่ขึ้นอยู่กับจำนวนของเวกเตอร์การสนับสนุน) ดังนั้นมันจึงใช้ได้เช่นกัน

แม้ว่า 300 จะมีคลาสจำนวนมาก ฉันจะเริ่มต้นด้วยเพียงไม่กี่และดำเนินการของคุณ


ตัวชี้และคำแนะนำที่ยอดเยี่ยม ขอบคุณ คุณช่วยอธิบายสิ่งที่คุณหมายถึงโดย "เริ่มต้นด้วยเพียงไม่กี่และทำงานของคุณ"?
user721975

ดีแทนที่จะเป็น 300 คลาส (เช่น "ไวโอลินวิโอลาเชลโลทรัมเป็ต ... ") คุณสามารถจัดประเภทใหม่ให้มีจำนวนน้อยลงเช่น "สตริงทองเหลือง"
Neil McGuigan

ตกลงฉันเข้าใจแล้ว
user721975

1

ก่อนอื่นตามความเห็นของคุณฉันจะถือว่านี่เป็นปัญหาการจำแนกเลขฐานสอง 300 (ใช่ / ไม่ใช่) มีผู้เรียนลักษณนามไบนารีตัวแยกประเภทโอเพ่นซอร์สที่ใช้งานง่ายจำนวนมากและสิ่งนี้ช่วยให้คุณแลกเปลี่ยนเวลาสำหรับหน่วยความจำ

SVMs และการถดถอยแบบโลจิสติกส์อาจเป็นวิธีที่ได้รับความนิยมมากที่สุดในการจัดหมวดหมู่ข้อความ ทั้งสองอย่างสามารถจัดการขนาด 1000000 ได้อย่างง่ายดายเนื่องจากการใช้งานที่ทันสมัยใช้โครงสร้างข้อมูลที่กระจัดกระจายและรวมถึงการตั้งค่าการทำให้เป็นปกติ

ชุดการเรียนรู้ของเครื่องโอเพนซอร์สหลายชุดรวมถึงWEKAและKNIMEรวมถึง SVM และการถดถอยโลจิสติก การใช้งานแบบสแตนด์อโลนของ SVMs ได้แก่libSVMและSVMlight สำหรับการถดถอยโลจิสติกฉันจะเสียบBXRtrain และ BXRclassifyซึ่งฉันพัฒนาด้วย Madigan, Genkin และอื่น ๆ BXRclassify สามารถสร้างดัชนีในหน่วยความจำของโมเดลการถดถอยโลจิสติกนับพันและใช้พร้อมกัน

สำหรับการแปลงข้อความเป็นรูปแบบเวกเตอร์ของคุณลักษณะฉันมักจะเขียน Perl ขึ้นมาเล็กน้อยเพื่อทำสิ่งนั้นตั้งแต่เริ่มต้น :-) แต่ฉันคิดว่าชุดการเรียนรู้ของเครื่องที่ฉันกล่าวถึงรวมถึงโทเค็นและโค้ดเวกเตอร์ อีกเส้นทางหนึ่งคือการใช้ชุดเครื่องมือภาษาธรรมชาติมากขึ้นเช่นLingPipeถึงแม้ว่ามันอาจเกินความสามารถของคุณ


+1 ความคิดเห็นดี ถ้าฉันต้องทำ 300 ใช่ / ไม่ใช่การจำแนกประเภทฉันจะเลือกข้อมูลการฝึกอบรมเชิงลบสำหรับชั้นเรียนได้อย่างไร ข้อมูลในเชิงบวกอย่างชัดเจนคือเอกสารที่เป็นของชั้นเรียน
user721975

ความคิดเห็นอื่น SVM / Logistic reg สามารถจัดการมิติได้อย่างแน่นอน แต่ฉันจะใช้การทดสอบเพื่อเลือกพารามิเตอร์สำหรับตัวแยกประเภทเหล่านี้ได้อย่างไร ตัวอย่างเช่นในชุดข้อมูลขนาดเล็กคุณสามารถเรียกใช้การตรวจสอบความถูกต้องไขว้ 10 เท่าเพื่อตัดสินใจเกี่ยวกับพารามิเตอร์ แต่วิธีการใดที่ใช้กับข้อมูลขนาดใหญ่เช่นนั้นเพื่อให้อัลกอริทึมเสร็จสิ้นการทำงานในเวลาที่เหมาะสม
721975

@ user721975: สำหรับการเลือกปฏิบัติเฉพาะเอกสารเชิงบวกคือเอกสารที่มีฉลาก X ติดอยู่และเอกสารเชิงลบเป็นเอกสารที่เหลือทั้งหมด
DavidDLewis

@ user721975: มันยากที่จะให้คำแนะนำทั่วไปเกี่ยวกับเวลาทำงานเนื่องจากรายละเอียดแตกต่างกันมากระหว่างอัลกอริทึมและการใช้งาน การตรวจสอบความถูกต้องไขว้ 10 เท่าอาจไม่เป็นผลสำหรับชุดข้อมูลของคุณ: 60000 ตัวอย่างไม่ใช่เรื่องสำคัญ
DavidDLewis

1
ชุดการฝึกที่ไม่สมดุลนั้นไม่จำเป็นต้องเป็นปัญหา แต่จริง ๆ แล้วฉันรู้ว่ามีบางสิ่งที่ฉันสับสน: เนื่องจากเอกสารสามารถเป็น 0, 1 หรือหลายคลาสคุณหมายถึงอะไรโดยมีเอกสารฝึกอบรม 200 รายการต่อชั้น คุณทำบางสิ่งเพื่อลบเอกสารที่มี 0 คลาสหรือ 2+ ชั้นเรียนหรือไม่? โดยทั่วไปแล้วคุณสร้างเอกสาร 60000 ชุดนี้ได้อย่างไร
DavidDLewis

1

ตั้งแต่ Sklearn 0.13 มีแน่นอนการดำเนินการของHashingVectorizer

แก้ไข:นี่เป็นตัวอย่างที่สมบูรณ์ของแอปพลิเคชันดังกล่าวจากเอกสาร sklearn

โดยทั่วไปตัวอย่างนี้แสดงให้เห็นว่าคุณสามารถจัดประเภทข้อความในข้อมูลที่ไม่เหมาะสมในหน่วยความจำหลักของคอมพิวเตอร์ (แต่ใช้ดิสก์ / เครือข่าย / ... )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.