दिलचस्प पोस्ट
नक्शा का उपयोग करते समय प्रतिक्रिया 'अपरिभाषित की संपत्ति नहीं पढ़ सकता' django orm, कैसे निष्पादित क्वेरी को देखने के लिए (या लॉग)? MongoDB BSON दस्तावेज़ आकार सीमा को समझना सी ++ कास्ट सिंटेक्स शैली एंड्रॉइड में ड्रायेट करने के लिए बिटमैप कन्वर्ट कैसे करें? क्या हमें कक्षा में हमेशा एक डिफॉल्ट कन्स्ट्रक्टर शामिल करना चाहिए? एक्सेस प्रतिबंध: प्रकार 'अनुप्रयोग' एपीआई नहीं है (आवश्यक पुस्तकालय आरटी.जर पर प्रतिबंध) पायथन में सिवाय / सिवाय: आप अपवादों को ठीक से कैसे अनदेखा कर सकते हैं? आप PostgreSQL में सत्र ID के लिए उपयुक्त एक यादृच्छिक स्ट्रिंग कैसे बनाते हैं? JTextField में केवल अंकों की शुरुआत करने की अनुमति देने के लिए कैसे? इवेंट जब तत्व पृष्ठ पर जोड़ा गया नरम कीबोर्ड से रोकें बटन मैं ब्राउज़र का स्क्रॉलबार आकार कैसे प्राप्त करूं? डेटा-योग्य मेगा-प्रोग्रामिंग कैसे MySQL करने के लिए SQL सर्वर डेटाबेस माइग्रेट करने के लिए?

वाक्यों पर पायथन विभाजन पाठ

मेरे पास एक पाठ फ़ाइल है मुझे वाक्य की एक सूची प्राप्त करने की आवश्यकता है।

यह कैसे लागू किया जा सकता है? संक्षेप में बहुत सारे सूक्ष्मताएं हैं, जैसे डॉट का इस्तेमाल किया जा रहा है।

मेरा पुराना regexp बुरा काम करता है

re.compile('(\. |^|!|\?)([AZ][^;↑\.<>@\^&/\[\]]*(\.|!|\?) )',re.M) 

वेब के समाधान से एकत्रित समाधान "वाक्यों पर पायथन विभाजन पाठ"

प्राकृतिक भाषा टूलकिट ( nltk.org ) में आपको क्या चाहिए यह समूह पोस्टिंग इंगित करता है कि यह ऐसा करता है:

 import nltk.data tokenizer = nltk.data.load('tokenizers/punkt/english.pickle') fp = open("test.txt") data = fp.read() print '\n-----\n'.join(tokenizer.tokenize(data)) 

(मैंने इसे करने की कोशिश नहीं की है!)

यह फ़ंक्शन Huckleberry Finn के संपूर्ण पाठ को लगभग 0.1 सेकंड में वाक्यों में विभाजित कर सकता है और कई दर्दनाक किनारों के कई मामलों को संभाल सकता है, जो वाक्य को गैर-तुच्छ जैसे पार्स करना जैसे " श्री जॉन जॉनसन जूनियर का जन्म अमरीका में हुआ था लेकिन उनकी पीएच अर्जित की थी डी। इज़राइल में एक इंजीनियर के रूप में नाइके इंक में शामिल होने से पहले। उन्होंने क्रेग्सलिस्ट.ओआरजी पर एक व्यवसाय विश्लेषक के रूप में भी काम किया। "

 # -*- coding: utf-8 -*- import re caps = "([AZ])" prefixes = "(Mr|St|Mrs|Ms|Dr)[.]" suffixes = "(Inc|Ltd|Jr|Sr|Co)" starters = "(Mr|Mrs|Ms|Dr|He\s|She\s|It\s|They\s|Their\s|Our\s|We\s|But\s|However\s|That\s|This\s|Wherever)" acronyms = "([AZ][.][AZ][.](?:[AZ][.])?)" websites = "[.](com|net|org|io|gov)" def split_into_sentences(text): text = " " + text + " " text = text.replace("\n"," ") text = re.sub(prefixes,"\\1<prd>",text) text = re.sub(websites,"<prd>\\1",text) if "Ph.D" in text: text = text.replace("Ph.D.","Ph<prd>D<prd>") text = re.sub("\s" + caps + "[.] "," \\1<prd> ",text) text = re.sub(acronyms+" "+starters,"\\1<stop> \\2",text) text = re.sub(caps + "[.]" + caps + "[.]" + caps + "[.]","\\1<prd>\\2<prd>\\3<prd>",text) text = re.sub(caps + "[.]" + caps + "[.]","\\1<prd>\\2<prd>",text) text = re.sub(" "+suffixes+"[.] "+starters," \\1<stop> \\2",text) text = re.sub(" "+suffixes+"[.]"," \\1<prd>",text) text = re.sub(" " + caps + "[.]"," \\1<prd>",text) if "”" in text: text = text.replace(".”","”.") if "\"" in text: text = text.replace(".\"","\".") if "!" in text: text = text.replace("!\"","\"!") if "?" in text: text = text.replace("?\"","\"?") text = text.replace(".",".<stop>") text = text.replace("?","?<stop>") text = text.replace("!","!<stop>") text = text.replace("<prd>",".") sentences = text.split("<stop>") sentences = sentences[:-1] sentences = [s.strip() for s in sentences] return sentences 

यहां सड़क के दृष्टिकोण का एक माध्यम है जो किसी भी बाहरी पुस्तकालयों पर भरोसा नहीं करता है। संक्षेप और टर्मिनेटर के बीच ओवरलैप को छोड़ने के साथ-साथ समाप्ति पर विविधता के बीच ओवरलैप को बाहर करने के लिए मैं लिस्ट का उपयोग करता हूं, उदाहरण के लिए: '।' बनाम '।' '

 abbreviations = {'dr.': 'doctor', 'mr.': 'mister', 'bro.': 'brother', 'bro': 'brother', 'mrs.': 'mistress', 'ms.': 'miss', 'jr.': 'junior', 'sr.': 'senior', 'ie': 'for example', 'eg': 'for example', 'vs.': 'versus'} terminators = ['.', '!', '?'] wrappers = ['"', "'", ')', ']', '}'] def find_sentences(paragraph): end = True sentences = [] while end > -1: end = find_sentence_end(paragraph) if end > -1: sentences.append(paragraph[end:].strip()) paragraph = paragraph[:end] sentences.append(paragraph) sentences.reverse() return sentences def find_sentence_end(paragraph): [possible_endings, contraction_locations] = [[], []] contractions = abbreviations.keys() sentence_terminators = terminators + [terminator + wrapper for wrapper in wrappers for terminator in terminators] for sentence_terminator in sentence_terminators: t_indices = list(find_all(paragraph, sentence_terminator)) possible_endings.extend(([] if not len(t_indices) else [[i, len(sentence_terminator)] for i in t_indices])) for contraction in contractions: c_indices = list(find_all(paragraph, contraction)) contraction_locations.extend(([] if not len(c_indices) else [i + len(contraction) for i in c_indices])) possible_endings = [pe for pe in possible_endings if pe[0] + pe[1] not in contraction_locations] if len(paragraph) in [pe[0] + pe[1] for pe in possible_endings]: max_end_start = max([pe[0] for pe in possible_endings]) possible_endings = [pe for pe in possible_endings if pe[0] != max_end_start] possible_endings = [pe[0] + pe[1] for pe in possible_endings if sum(pe) > len(paragraph) or (sum(pe) < len(paragraph) and paragraph[sum(pe)] == ' ')] end = (-1 if not len(possible_endings) else max(possible_endings)) return end def find_all(a_str, sub): start = 0 while True: start = a_str.find(sub, start) if start == -1: return yield start start += len(sub) 

मैंने इस एंट्री से कार्ल का खोजक_कार्यपूर्ण कार्य का उपयोग किया था: पायथन में एक सबस्ट्रिंग के सभी घटनाओं को खोजें

साधारण मामलों (जहां वाक्यों को सामान्य रूप से समाप्त किया जाता है) के लिए, यह काम करना चाहिए:

 import re text = ''.join(open('somefile.txt').readlines()) sentences = re.split(r' *[\.\?!][\'"\)\]]* *', text) 

रेगेक्स *\. + *\. + , जो बाईं ओर 0 या अधिक रिक्त स्थान से घिरी हुई अवधि से मेल खाता है और दाईं ओर 1 या अधिक के बराबर है (वाकई में बदलाव के रूप में गिना जाने वाले समय की तरह कुछ को रोकने के लिए)।

जाहिर है, सबसे मजबूत समाधान नहीं, लेकिन यह ज्यादातर मामलों में ठीक कर देंगे। एकमात्र ऐसा मामला शामिल नहीं है, संक्षेपण (शायद वाक्य की सूची के माध्यम से चलाया जाता है और जांचता है कि sentences में प्रत्येक स्ट्रिंग कैपिटल कैरेक्टर के साथ शुरू होती है?)

@Artyom,

नमस्ते! आप इस फ़ंक्शन का उपयोग करके रूसी (और कुछ अन्य भाषाओं) के लिए एक नया टोकनेइज़र बना सकते हैं:

 def russianTokenizer(text): result = text result = result.replace('.', ' . ') result = result.replace(' . . . ', ' ... ') result = result.replace(',', ' , ') result = result.replace(':', ' : ') result = result.replace(';', ' ; ') result = result.replace('!', ' ! ') result = result.replace('?', ' ? ') result = result.replace('\"', ' \" ') result = result.replace('\'', ' \' ') result = result.replace('(', ' ( ') result = result.replace(')', ' ) ') result = result.replace(' ', ' ') result = result.replace(' ', ' ') result = result.replace(' ', ' ') result = result.replace(' ', ' ') result = result.strip() result = result.split(' ') return result 

और फिर इसे इस तरह से कॉल करें:

 text = 'вы выполняете поиск, используя Google SSL;' tokens = russianTokenizer(text) 

शुभकामनाएँ, मरिलेना

इसमें कोई संदेह नहीं है कि एनएलटीके उद्देश्य के लिए सबसे उपयुक्त है। लेकिन एनएलटीके के साथ शुरू करना काफी दर्दनाक है (लेकिन एक बार जब आप इसे स्थापित करते हैं – तो आप पुरस्कार पा सकते हैं)

तो यहां सरल री आधारित कोड http://pythonicprose.blogspot.com/2009/09/python-split-paragraph-into-sentences.html पर उपलब्ध है।

 # split up a paragraph into sentences # using regular expressions def splitParagraphIntoSentences(paragraph): ''' break a paragraph into sentences and return a list ''' import re # to split by multile characters # regular expressions are easiest (and fastest) sentenceEnders = re.compile('[.!?]') sentenceList = sentenceEnders.split(paragraph) return sentenceList if __name__ == '__main__': p = """This is a sentence. This is an excited sentence! And do you think this is a question?""" sentences = splitParagraphIntoSentences(p) for s in sentences: print s.strip() #output: # This is a sentence # This is an excited sentence # And do you think this is a question 

वाक्यों को पाठ में विभाजित करने के लिए regex का उपयोग करने के बजाय, आप nltk लाइब्रेरी भी उपयोग कर सकते हैं

 >>> from nltk import tokenize >>> p = "Good morning Dr. Adams. The patient is waiting for you in room number 3." >>> tokenize.sent_tokenize(p) ['Good morning Dr. Adams.', 'The patient is waiting for you in room number 3.'] 

रेफरी: https://stackoverflow.com/a/9474645/2877052