การเปรียบเทียบเครื่องวิเคราะห์ Lucene


105

ใครช่วยอธิบายความแตกต่างระหว่างเครื่องวิเคราะห์ต่างๆภายใน Lucene ได้ไหม ฉันได้รับข้อยกเว้น maxClauseCount และฉันเข้าใจว่าฉันสามารถหลีกเลี่ยงปัญหานี้ได้โดยใช้ KeywordAnalyzer แต่ฉันไม่ต้องการเปลี่ยนจาก StandardAnalyzer โดยไม่เข้าใจปัญหารอบตัววิเคราะห์ ขอบคุณมาก ๆ.

คำตอบ:


209

โดยทั่วไปตัววิเคราะห์ใด ๆ ใน Lucene คือ tokenizer + stemmer + stop-words filter

Tokenizer จะแบ่งข้อความของคุณออกเป็นชิ้น ๆ และเนื่องจากตัววิเคราะห์ที่แตกต่างกันอาจใช้โทเค็นที่แตกต่างกันคุณจึงสามารถรับสตรีมโทเค็นเอาต์พุตที่แตกต่างกันได้เช่นลำดับของกลุ่มข้อความ ตัวอย่างเช่นKeywordAnalyzerคุณพูดถึงไม่ได้แยกข้อความเลยและใช้ฟิลด์ทั้งหมดเป็นโทเค็นเดียว ในขณะเดียวกันStandardAnalyzer(และเครื่องวิเคราะห์อื่น ๆ ส่วนใหญ่) ใช้ช่องว่างและเครื่องหมายวรรคตอนเป็นจุดแบ่ง ตัวอย่างเช่นสำหรับวลี "ฉันมีความสุขมาก" มันจะสร้างรายการ ["i", "am", "very", "happy"] (หรืออะไรทำนองนั้น) สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการวิเคราะห์เฉพาะ / tokenizers เห็นของJava เอกสาร

Stemmersใช้เพื่อหาฐานของคำที่เป็นปัญหา ขึ้นอยู่กับภาษาที่ใช้เป็นอย่างมาก ตัวอย่างเช่นสำหรับวลีก่อนหน้าในภาษาอังกฤษจะมีบางอย่างเช่น ["i", "be", "veri", "happi"] และสำหรับภาษาฝรั่งเศส "Je suis très heureux" ตัววิเคราะห์ภาษาฝรั่งเศสบางประเภท (เช่นSnowballAnalyzerinitialized ด้วย "French") จะสร้าง ["je", "être", "tre", "heur"] แน่นอนว่าหากคุณจะใช้ตัววิเคราะห์ของภาษาหนึ่งเพื่อสร้างข้อความในอีกภาษาหนึ่งจะมีการใช้กฎจากภาษาอื่นและตัวควบคุมอาจให้ผลลัพธ์ที่ไม่ถูกต้อง ไม่ใช่ความล้มเหลวของระบบทั้งหมด แต่ผลการค้นหาอาจมีความแม่นยำน้อยกว่า

KeywordAnalyzerไม่ใช้สเตมเมอร์ใด ๆ มันส่งผ่านทุกฟิลด์ที่ไม่มีการแก้ไข ดังนั้นหากคุณกำลังจะค้นหาคำบางคำในข้อความภาษาอังกฤษคุณไม่ควรใช้ตัววิเคราะห์นี้

คำหยุดเป็นคำที่ใช้บ่อยที่สุดและแทบไม่มีประโยชน์ อีกครั้งขึ้นอยู่กับภาษาเป็นอย่างมาก สำหรับภาษาอังกฤษคำเหล่านี้คือ "a", "the", "I", "be", "have" ฯลฯ ตัวกรองคำหยุดจะนำคำเหล่านี้ออกจากสตรีมโทเค็นเพื่อลดเสียงรบกวนในผลการค้นหาในที่สุดวลีของเราก็คือ "I "ฉันมีความสุขมาก" โดยStandardAnalyzerจะเปลี่ยนเป็นรายการ ["veri", "happi"]

และKeywordAnalyzerอีกครั้งไม่ทำอะไร ดังนั้นจึงKeywordAnalyzerใช้สำหรับสิ่งต่างๆเช่น ID หรือหมายเลขโทรศัพท์ แต่ไม่ใช่สำหรับข้อความปกติ

และสำหรับmaxClauseCountข้อยกเว้นของคุณฉันเชื่อว่าคุณจะได้รับมันในการค้นหา ในกรณีนี้ส่วนใหญ่อาจเป็นเพราะคำค้นหาที่ซับซ้อนเกินไป พยายามแบ่งออกเป็นหลาย ๆ แบบสอบถามหรือใช้ฟังก์ชันระดับต่ำมากขึ้น


1
@ffriend: ฉันไม่คิดว่า Stemmer (ใช้ก้อนหิมะหรืออัลกอริทึมอื่น ๆ ) สามารถแปลง am -> ได้เพราะมันเป็นงานของ Lemmatizer คุณสามารถตรวจสอบได้ที่นี่snowball.tartarus.org/demo.php

Tika เหมาะกับเรื่องนี้ตรงไหน? มันเป็นเครื่องวิเคราะห์ทางเทคนิคไม่ใช่หรือ?
anon

1
@anon: Tika เป็นโครงการที่แยกออกมาซึ่งมีคุณสมบัติหลักหลายประการ สมมติว่าคุณหมายถึงตัวแยกวิเคราะห์ Tika ฉันจะบอกว่า Tika ใช้สตรีมแบบไบต์และส่งออกข้อความ + ข้อมูลเมตาในขณะที่ตัววิเคราะห์ของ Lucene รับสตรีมโทเค็นที่ประมวลผลข้อความและเอาต์พุต ตัวอย่างเช่นก่อนอื่นคุณอาจแยกวิเคราะห์ไฟล์ PDF หรือ XML ด้วย Tika โดยสร้างเอกสารที่มีช่องต่างๆเช่น "title" "ผู้แต่ง" และ "ข้อความ" จากนั้นวิเคราะห์ช่องเหล่านี้บางส่วนหรือทั้งหมดด้วยเครื่องวิเคราะห์ของ Lucene
ffriend

แค่สงสัยว่า "มาก" และ "มีความสุข" ไม่ใช่คำปฏิเสธทำไมถึงเปลี่ยนเป็น "veri" และ "happi"? มันตรงกับความแตกต่างของ i <-> y เนื่องจากฟังดูคล้ายกัน
oguzalb

0

ในมุมมองของฉันฉันใช้StandAnalyzerและSmartCNAnalyzer. เพราะฉันต้องค้นหาข้อความในภาษาจีน เห็นได้ชัดว่าSmartCnAnalyzerจัดการภาษาจีนได้ดีกว่า เพื่อวัตถุประสงค์ที่แตกต่างกันคุณต้องเลือกตัววิเคราะห์ properest

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