วิธีสร้างแอปประมวลผลภาษาธรรมชาติ

เผยแพร่แล้ว: 2022-03-11

การประมวลผลภาษาธรรมชาติ—เทคโนโลยีที่ช่วยให้ซอฟต์แวร์แอปพลิเคชันสามารถประมวลผลภาษามนุษย์—มีแพร่หลายอย่างแพร่หลายในช่วงไม่กี่ปีที่ผ่านมา

การค้นหาของ Google สามารถตอบคำถามที่ฟังดูเป็นธรรมชาติมากขึ้น Siri ของ Apple สามารถเข้าใจคำถามที่หลากหลาย และบริษัทจำนวนมากขึ้นเรื่อยๆ ก็ใช้แชทอัจฉริยะและบอทโทรศัพท์เพื่อสื่อสารกับลูกค้า (ตามสมควร) แต่ซอฟต์แวร์ที่ดูเหมือน "ฉลาด" นี้ใช้งานได้จริงอย่างไร

ในบทความนี้ คุณจะได้เรียนรู้เกี่ยวกับเทคโนโลยีที่ทำให้แอปพลิเคชันเหล่านี้ใช้งานได้ และคุณจะได้เรียนรู้วิธีการพัฒนาซอฟต์แวร์ประมวลผลภาษาธรรมชาติของคุณเอง

บทความนี้จะแนะนำคุณเกี่ยวกับกระบวนการตัวอย่างในการสร้างตัววิเคราะห์ความเกี่ยวข้องของข่าวสาร ลองนึกภาพว่าคุณมีพอร์ตหุ้น และคุณต้องการให้แอปรวบรวมข้อมูลผ่านเว็บไซต์ข่าวยอดนิยมโดยอัตโนมัติ และระบุบทความที่เกี่ยวข้องกับพอร์ตโฟลิโอของคุณ ตัวอย่างเช่น หากพอร์ตหุ้นของคุณรวมถึงบริษัทต่างๆ เช่น Microsoft, BlackStone และ Luxottica คุณอาจต้องการดูบทความที่กล่าวถึงบริษัททั้งสามนี้

เริ่มต้นใช้งานห้องสมุด Stanford NLP

แอปประมวลผลภาษาที่เป็นธรรมชาติ เช่นเดียวกับแอปการเรียนรู้ของเครื่องอื่นๆ สร้างขึ้นจากอัลกอริธึมที่ค่อนข้างเล็ก เรียบง่าย และใช้งานง่ายจำนวนหนึ่งซึ่งทำงานควบคู่กัน มักจะเหมาะสมที่จะใช้ไลบรารีภายนอกที่อัลกอริทึมเหล่านี้ทั้งหมดได้รับการติดตั้งและรวมเข้าด้วยกันแล้ว

ตัวอย่างเช่น เราจะใช้ไลบรารี Stanford NLP ซึ่งเป็นไลบรารีประมวลผลภาษาธรรมชาติที่ใช้ Java ที่มีประสิทธิภาพซึ่งมาพร้อมกับการรองรับหลายภาษา

อัลกอริทึมเฉพาะอย่างหนึ่งจากไลบรารีนี้ที่เราสนใจคือตัวติดแท็ก part-of-speech (POS) เครื่องแท็ก POS ใช้เพื่อกำหนดส่วนของคำพูดโดยอัตโนมัติให้กับทุกคำในข้อความ เครื่องแท็ก POS นี้จัดประเภทคำในข้อความตามคุณสมบัติของคำศัพท์และวิเคราะห์คำเหล่านั้นโดยสัมพันธ์กับคำอื่นๆ รอบตัว

กลไกที่แน่นอนของอัลกอริทึมการแท็ก POS อยู่นอกเหนือขอบเขตของบทความนี้ แต่คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับมันได้ที่นี่

ในการเริ่มต้น เราจะสร้างโปรเจ็กต์ Java ใหม่ (คุณสามารถใช้ IDE ที่คุณชื่นชอบได้) และเพิ่มไลบรารี Stanford NLP ลงในรายการการพึ่งพา หากคุณกำลังใช้ Maven เพียงเพิ่มลงในไฟล์ pom.xml ของคุณ:

 <dependency> <groupId>edu.stanford.nlp</groupId> <artifactId>stanford-corenlp</artifactId> <version>3.6.0</version> </dependency> <dependency> <groupId>edu.stanford.nlp</groupId> <artifactId>stanford-corenlp</artifactId> <version>3.6.0</version> <classifier>models</classifier> </dependency>

เนื่องจากแอปจะต้องแยกเนื้อหาของบทความออกจากหน้าเว็บโดยอัตโนมัติ คุณจะต้องระบุการอ้างอิงสองรายการต่อไปนี้ด้วย:

 <dependency> <groupId>de.l3s.boilerpipe</groupId> <artifactId>boilerpipe</artifactId> <version>1.1.0</version> </dependency>
 <dependency> <groupId>net.sourceforge.nekohtml</groupId> <artifactId>nekohtml</artifactId> <version>1.9.22</version> </dependency>

เมื่อเพิ่มการพึ่งพาเหล่านี้ คุณก็พร้อมที่จะก้าวไปข้างหน้า

อุปกรณ์ขูดและทำความสะอาด

ส่วนแรกของตัววิเคราะห์ของเราจะเกี่ยวข้องกับการดึงบทความและแยกเนื้อหาออกจากหน้าเว็บ

เมื่อดึงบทความจากแหล่งข่าว หน้ามักจะเต็มไปด้วยข้อมูลที่ไม่เกี่ยวข้อง (วิดีโอที่ฝัง ลิงก์ขาออก วิดีโอ โฆษณา ฯลฯ) ที่ไม่เกี่ยวข้องกับตัวบทความ นี่คือที่มาของ Boilerpipe

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

ไลบรารี Boilerpipe มาพร้อมกับการสนับสนุนในตัวสำหรับการขูดหน้าเว็บ สามารถดึง HTML จากเว็บ ดึงข้อความจาก HTML และล้างข้อความที่แยกออกมา คุณสามารถกำหนดฟังก์ชัน extractFromURL ที่จะรับ URL และใช้ Boilerpipe เพื่อส่งคืนข้อความที่เกี่ยวข้องมากที่สุดเป็นสตริงโดยใช้ ArticleExtractor สำหรับงานนี้:

 import java.net.URL; import de.l3s.boilerpipe.document.TextDocument; import de.l3s.boilerpipe.extractors.CommonExtractors; import de.l3s.boilerpipe.sax.BoilerpipeSAXInput; import de.l3s.boilerpipe.sax.HTMLDocument; import de.l3s.boilerpipe.sax.HTMLFetcher; public class BoilerPipeExtractor { public static String extractFromUrl(String userUrl) throws java.io.IOException, org.xml.sax.SAXException, de.l3s.boilerpipe.BoilerpipeProcessingException { final HTMLDocument htmlDoc = HTMLFetcher.fetch(new URL(userUrl)); final TextDocument doc = new BoilerpipeSAXInput(htmlDoc.toInputSource()).getTextDocument(); return CommonExtractors.ARTICLE_EXTRACTOR.getText(doc); } }

ไลบรารี Boilerpipe มีตัวแยกที่แตกต่างกันตามอัลกอริธึม Boilerpipe โดย ArticleExtractor ได้รับการปรับให้เหมาะสมเป็นพิเศษสำหรับบทความข่าวที่มีรูปแบบ HTML ArticleExtractor เน้นเฉพาะที่แท็ก HTML ที่ใช้ในแต่ละบล็อกเนื้อหาและความหนาแน่นของลิงก์ขาออก ซึ่งเหมาะกับงานของเรามากกว่า DefaultExtractor ที่เร็วกว่าแต่ง่ายกว่า

ฟังก์ชันในตัวจะดูแลทุกอย่างให้เรา:

  • HTMLFetcher.fetch รับเอกสาร HTML
  • getTextDocument แยกเอกสารข้อความ
  • CommonExtractors.ARTICLE_EXTRACTOR.getText แยกข้อความที่เกี่ยวข้องจากบทความโดยใช้อัลกอริทึม Boilerpipe

ตอนนี้คุณสามารถทดลองใช้กับบทความตัวอย่างเกี่ยวกับการควบรวมกิจการของยักษ์ใหญ่ด้านการมองเห็น Essilor และ Luxottica ซึ่งคุณสามารถหาได้ที่นี่ คุณสามารถป้อน URL นี้ไปยังฟังก์ชันและดูว่ามีอะไรออกมาบ้าง

เพิ่มรหัสต่อไปนี้ในฟังก์ชันหลักของคุณ:

 public class App { public static void main( String[] args ) throws java.io.IOException, org.xml.sax.SAXException, de.l3s.boilerpipe.BoilerpipeProcessingException { String urlString = "http://www.reuters.com/article/us-essilor-ma-luxottica-group-idUSKBN14Z110"; String text = BoilerPipeExtractor.extractFromUrl(urlString); System.out.println(text); } }

คุณควรเห็นในผลลัพธ์ของคุณในเนื้อหาหลักของบทความ โดยไม่มีโฆษณา แท็ก HTML และลิงก์ขาออก นี่คือข้อมูลโค้ดเริ่มต้นจากสิ่งที่ฉันได้รับเมื่อรันสิ่งนี้:

 MILAN/PARIS Italy's Luxottica (LUX.MI) and France's Essilor (ESSI.PA) have agreed a 46 billion euro ($49 billion) merger to create a global eyewear powerhouse with annual revenue of more than 15 billion euros. The all-share deal is one of Europe's largest cross-border tie-ups and brings together Luxottica, the world's top spectacles maker with brands such as Ray-Ban and Oakley, with leading lens manufacturer Essilor. "Finally ... two products which are naturally complementary -- namely frames and lenses -- will be designed, manufactured and distributed under the same roof," Luxottica's 81-year-old founder Leonardo Del Vecchio said in a statement on Monday. Shares in Luxottica were up by 8.6 percent at 53.80 euros by 1405 GMT (9:05 am ET), with Essilor up 12.2 percent at 114.60 euros. The merger between the top players in the 95 billion eyewear market is aimed at helping the businesses to take full advantage of expected strong demand for prescription spectacles and sunglasses due to an aging global population and increasing awareness about eye care. Jefferies analysts estimate that the market is growing at between...

และนั่นคือเนื้อหาหลักของบทความ ยากที่จะจินตนาการว่าสิ่งนี้จะใช้งานได้ง่ายกว่ามาก

การติดแท็กส่วนของคำพูด

เมื่อคุณแยกเนื้อหาบทความหลักสำเร็จแล้ว คุณสามารถดำเนินการพิจารณาว่าบทความนั้นกล่าวถึงบริษัทที่สนใจของผู้ใช้หรือไม่

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

ประการแรก การค้นหาสตริงอาจมีแนวโน้มที่จะมีผลบวกปลอม บทความที่กล่าวถึง Microsoft Excel อาจถูกแท็กว่ากล่าวถึง Microsoft เป็นต้น

ประการที่สอง ขึ้นอยู่กับการสร้างนิพจน์ทั่วไป การค้นหานิพจน์ทั่วไปสามารถนำไปสู่การเนกาทีฟเชิงลบได้ ตัวอย่างเช่น บทความที่มีวลี "รายได้รายไตรมาสของ Luxottica เกินความคาดหมาย" อาจพลาดการค้นหานิพจน์ทั่วไปที่ค้นหา "Luxottica" ที่ล้อมรอบด้วยช่องว่างสีขาว

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

ไลบรารี CoreNLP ของ Stanford มีคุณสมบัติที่ทรงพลังมากมาย และมีวิธีแก้ไขปัญหาทั้งสามข้อนี้

สำหรับเครื่องวิเคราะห์ของเรา เราจะใช้เครื่องติดแท็ก Parts-of-Speech (POS) โดยเฉพาะอย่างยิ่ง เราสามารถใช้เครื่องแท็ก POS เพื่อค้นหาคำนามที่เหมาะสมทั้งหมดในบทความและเปรียบเทียบกับพอร์ตหุ้นที่น่าสนใจของเรา

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

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

Stanford CoreNLP ให้แท็กเกอร์ที่สะดวกมากที่เรียกว่า MaxentTagger ซึ่งสามารถให้การแท็ก POS ในโค้ดเพียงไม่กี่บรรทัด

นี่คือการนำไปใช้อย่างง่าย:

 public class PortfolioNewsAnalyzer { private HashSet<String> portfolio; private static final String modelPath = "edu\\stanford\\nlp\\models\\pos-tagger\\english-left3words\\english-left3words-distsim.tagger"; private MaxentTagger tagger; public PortfolioNewsAnalyzer() { tagger = new MaxentTagger(modelPath); } public String tagPos(String input) { return tagger.tagString(input); }

ฟังก์ชัน tagger tagPos ใช้สตริงเป็นอินพุตและส่งออกสตริงที่มีคำในสตริงดั้งเดิมพร้อมกับส่วนที่เกี่ยวข้องของคำพูด ในฟังก์ชันหลักของคุณ สร้างอินสแตนซ์ PortfolioNewsAnalyzer และป้อนเอาต์พุตของมีดโกนลงในฟังก์ชันแท็กเกอร์ และคุณควรเห็นสิ่งนี้:

 MILAN/PARIS_NN Italy_NNP 's_POS Luxottica_NNP -LRB-_-LRB- LUX.MI_NNP -RRB-_-RRB- and_CC France_NNP 's_POS Essilor_NNP -LRB-_-LRB- ESSI.PA_NNP -RRB-_-RRB- have_VBP agreed_VBN a_DT 46_CD billion_CD euro_NN -LRB-_-LRB- $_$ 49_CD billion_CD -RRB-_-RRB- merger_NN to_TO create_VB a_DT global_JJ eyewear_NN powerhouse_NN with_IN annual_JJ revenue_NN of_IN more_JJR than_IN 15_CD billion_CD euros_NNS ._. The_DT all-share_JJ deal_NN is_VBZ one_CD of_IN Europe_NNP 's_POS largest_JJS cross-border_JJ tie-ups_NNS and_CC brings_VBZ together_RB Luxottica_NNP ,_, the_DT world_NN 's_POS top_JJ spectacles_NNS maker_NN with_IN brands_NNS such_JJ as_IN Ray-Ban_NNP and_CC Oakley_NNP ,_, with_IN leading_VBG lens_NN manufacturer_NN Essilor_NNP ._. ``_`` Finally_RB ..._: two_CD products_NNS which_WDT are_VBP naturally_RB complementary_JJ --_: namely_RB frames_NNS and_CC lenses_NNS --_: will_MD be_VB designed_VBN ,_, manufactured_VBN and_CC distributed_VBN under_IN the_DT same_JJ roof_NN ,_, ''_'' Luxottica_NNP 's_POS 81-year-old_JJ founder_NN Leonardo_NNP Del_NNP Vecchio_NNP said_VBD in_IN a_DT statement_NN on_IN Monday_NNP ._. Shares_NNS in_IN Luxottica_NNP were_VBD up_RB by_IN 8.6_CD percent_NN at_IN 53.80_CD euros_NNS by_IN 1405_CD GMT_NNP -LRB-_-LRB- 9:05_CD am_NN ET_NNP -RRB-_-RRB- ,_, with_IN Essilor_NNP up_IN 12.2_CD percent_NN at_IN 114.60_CD euros_NNS ._. The_DT merger_NN between_IN the_DT top_JJ players_NNS in_IN the_DT 95_CD billion_CD eyewear_NN market_NN is_VBZ aimed_VBN at_IN helping_VBG the_DT businesses_NNS to_TO take_VB full_JJ advantage_NN of_IN expected_VBN strong_JJ demand_NN for_IN prescription_NN spectacles_NNS and_CC sunglasses_NNS due_JJ to_TO an_DT aging_NN global_JJ population_NN and_CC increasing_VBG awareness_NN about_IN...

กำลังประมวลผลเอาต์พุตที่แท็กเป็น Set

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

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

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

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

ด้านล่างนี้เป็นฟังก์ชันที่ใช้การแยกและการจัดเก็บคำนามเฉพาะ วางฟังก์ชันนี้ในคลาส PortfolioNewsAnalyzer ของคุณ:

 public static HashSet<String> extractProperNouns(String taggedOutput) { HashSet<String> propNounSet = new HashSet<String>(); String[] split = taggedOutput.split(" "); for (String token: split ){ String[] splitTokens = token.split("_"); if(splitTokesn[1].equals("NNP")){ propNounSet.add(splitTokens[0]); } } return propNounSet; }

มีปัญหากับการใช้งานนี้แม้ว่า หากชื่อบริษัทประกอบด้วยคำหลายคำ (เช่น Carl Zeiss ในตัวอย่าง Luxottica) การใช้งานนี้จะไม่สามารถเข้าใจได้ ในตัวอย่างของ Carl Zeiss ระบบจะแทรก "Carl" และ "Zeiss" ลงในชุดแยกจากกัน ดังนั้นจึงไม่มีสตริง "Carl Zeiss" แม้แต่สตริงเดียว

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

 public static HashSet<String> extractProperNouns(String taggedOutput) { HashSet<String> propNounSet = new HashSet<String>(); String[] split = taggedOutput.split(" "); List<String> propNounList = new ArrayList<String>(); for (String token: split ){ String[] splitTokens = token.split("_"); if(splitTokens[1].equals("NNP")){ propNounList.add(splitTokens[0]); } else { if (!propNounList.isEmpty()) { propNounSet.add(StringUtils.join(propNounList, " ")); propNounList.clear(); } } } if (!propNounList.isEmpty()) { propNounSet.add(StringUtils.join(propNounList, " ")); propNounList.clear(); } return propNounSet; }

ตอนนี้ฟังก์ชันควรส่งคืนชุดที่มีคำนามเฉพาะบุคคล และ คำนามเฉพาะที่ต่อเนื่องกัน (เช่น เว้นวรรค) หากคุณพิมพ์ propNounSet คุณควรเห็นสิ่งต่อไปนี้:

 [... Monday, Gianluca Semeraro, David Goodman, Delfin, North America, Luxottica, Latin America, Rossi/File Photo, Rome, Safilo Group, SFLG.MI, Friday, Valentina Za, Del Vecchio, CEO Hubert Sagnieres, Oakley, Sagnieres, Jefferies, Ray Ban, ...]

การเปรียบเทียบผลงานกับ PropNouns Set

เราใกล้จะเสร็จแล้ว!

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

การนำไปใช้นั้นง่ายมาก เพิ่มรหัสต่อไปนี้ในคลาส PortfolioNewsAnalyzer ของคุณ:

 private HashSet<String> portfolio; public PortfolioNewsAnalyzer() { portfolio = new HashSet<String>(); } public void addPortfolioCompany(String company) { portfolio.add(company); } public boolean arePortfolioCompaniesMentioned(HashSet<String> articleProperNouns){ return !Collections.disjoint(articleProperNouns, portfolio); }

วางมันทั้งหมดเข้าด้วยกัน

ตอนนี้ เราสามารถเรียกใช้แอปพลิเคชันทั้งหมด—การขูด การทำความสะอาด การติดแท็ก การรวบรวม และการเปรียบเทียบ นี่คือฟังก์ชันที่ทำงานผ่านแอปพลิเคชันทั้งหมด เพิ่มฟังก์ชันนี้ในคลาส PortfolioNewsAnalyzer ของคุณ:

 public boolean analyzeArticle(String urlString) throws IOException, SAXException, BoilerpipeProcessingException { String articleText = extractFromUrl(urlString); String tagged = tagPos(articleText); HashSet<String> properNounsSet = extractProperNouns(tagged); return arePortfolioCompaniesMentioned(properNounsSet); }

ในที่สุด เราก็ใช้แอพได้แล้ว!

นี่คือตัวอย่างการใช้บทความเดียวกันกับข้างต้นและ Luxottica เป็นบริษัทพอร์ต:

 public static void main( String[] args ) throws IOException, SAXException, BoilerpipeProcessingException { PortfolioNewsAnalyzer analyzer = new PortfolioNewsAnalyzer(); analyzer.addPortfolioCompany("Luxottica"); boolean mentioned = analyzer.analyzeArticle("http://www.reuters.com/article/us-essilor-ma-luxottica-group-idUSKBN14Z110"); if (mentioned) { System.out.println("Article mentions portfolio companies"); } else { System.out.println("Article does not mention portfolio companies"); } }

เรียกใช้สิ่งนี้ และแอปควรพิมพ์ "บทความกล่าวถึงบริษัทพอร์ตโฟลิโอ"

เปลี่ยนบริษัทพอร์ตจาก Luxottica เป็นบริษัทที่ไม่ได้กล่าวถึงในบทความ (เช่น “Microsoft”) และแอปควรพิมพ์ “บทความไม่ได้กล่าวถึงบริษัทพอร์ตโฟลิโอ”

การสร้างแอป NLP ไม่จำเป็นต้องยาก

ในบทความนี้ เราได้ก้าวผ่านขั้นตอนการสร้างแอปพลิเคชันที่ดาวน์โหลดบทความจาก URL ล้างข้อมูลโดยใช้ Boilerpipe ประมวลผลโดยใช้ Stanford NLP และตรวจสอบว่าบทความมีข้อมูลอ้างอิงที่น่าสนใจหรือไม่ (ในกรณีของเรา บริษัทใน พอร์ตโฟลิโอ) ดังที่แสดงให้เห็น การใช้ประโยชน์จากอาร์เรย์ของเทคโนโลยีนี้ทำให้สิ่งที่อาจเป็นงานที่น่ากลัวกลายเป็นงานที่ค่อนข้างตรงไปตรงมา

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

[หมายเหตุ: คุณสามารถหาสำเนาของรหัสที่อ้างอิงในบทความนี้ได้ที่นี่]