def test_sent_tokenizer(tokens): sents = sentence_tokenizer(tokens) out = ["".join([word.text for word in s[1]]) for s in sents] expected = [ "བཀུར་བར་མི་འགྱུར་ཞིང༌། །བརྙས་བཅོས་མི་སྙན་རྗོད་པར་བྱེད། །", "དབང་དང་འབྱོར་པ་ལྡན་པ་ཡི། །རྒྱལ་རིགས་ཕལ་ཆེར་བག་མེད་པས། །མྱོས་པའི་གླང་ཆེན་བཞིན་དུ་འཁྱམས། །དེ་ཡི་འཁོར་ཀྱང་དེ་འདྲར་འགྱུར། །", "གཞན་ཡང་རྒྱལ་པོ་རྒྱལ་རིགས་ཀྱི། །སྤྱོད་པ་བཟང་ངན་ཅི་འདྲ་བ། །དེ་འདྲའི་ཚུལ་ལ་བལྟས་ནས་སུ། །འབངས་རྣམས་དེ་དང་དེ་འདྲ་སྟེ། །", "རྒྱལ་པོ་ནོར་ལ་བརྐམས་གྱུར་ན། །", "ནོར་གྱིས་རྒྱལ་ཁྲིམས་བསླུ་བར་རྩོམ། །", "མི་བདག་གཡེམ་ལ་དགའ་གྱུར་ན། །", "འཕྱོན་མའི་ཚོགས་རྣམས་མགོ་འཕང་མཐོ། །", "ཕྲ་མར་ཉན་ན་དབྱེན་གྱིས་གཏོར། །", "བརྟག་དཔྱད་མི་ཤེས་རྫུན་གྱིས་སླུ། །ང་ལོ་ཡང་ན་ཀུན་གྱིས་བསྐྱོད། །", "ངོ་དགར་བརྩི་ན་ཟོལ་ཚིག་སྨྲ། །", "དེ་དང་དེ་ལ་སོགས་པ་ཡི། །མི་བདག་དེ་ལ་གང་གང་གིས། །བསླུ་བར་རུང་བའི་སྐབས་མཐོང་ན། །", "གཡོན་ཅན་ཚོགས་ཀྱིས་ཐབས་དེ་སེམས། །མི་རྣམས་རང་འདོད་སྣ་ཚོགས་ལ། །རྒྱལ་པོ་ཀུན་གྱི་ཐུན་མོང་ཕྱིར། །རྒྱལ་པོས་བསམ་གཞིགས་མ་བྱས་ན། །", "ཐ་མར་རྒྱལ་སྲིད་འཇིག་པར་འགྱུར། །", "ཆེན་པོའི་གོ་སར་གནས་པ་ལ། །སྐྱོན་ཀྱང་ཡོན་ཏན་ཡིན་ཚུལ་དུ། །འཁོར་ངན་རྣམས་ཀྱིས་ངོ་བསྟོད་སྨྲ། །", "དེ་ཕྱིར་སྐྱོན་ཡོན་ཤེས་པ་དཀའ། །", "ལྷག་པར་རྩོད་ལྡན་སྙིགས་མའི་ཚེ། །འཁོར་གྱི་ནང་ན་མ་རབས་མང༌། །", "སྐྱོན་ཡང་ཡོན་ཏན་ལྟར་མཐོང་ལ། །རང་འདོད་ཆེ་ཞིང་རྒྱལ་པོ་བསླུ། །ཆུས་དང་འཁོར་གྱི་བདེ་ཐབས་ལ། །བསམ་གཞིགས་བྱེད་པ་དཀོན་པའི་ཕྱིར། །རྒྱལ་པོས་ལེགས་པར་དཔྱད་ནས་", "སུ། །བདེན་པའི་ངག་ལས་", ] assert out == expected
def wl_sentence_tokenize(main, text, lang, sentence_tokenizer='default'): sentences = [] if lang not in main.settings_global['sentence_tokenizers']: lang = 'other' if sentence_tokenizer == 'default': sentence_tokenizer = main.settings_custom['sentence_tokenization'][ 'sentence_tokenizers'][lang] wl_nlp_utils.init_sentence_tokenizers( main, lang=lang, sentence_tokenizer=sentence_tokenizer) # Input of SudachiPy cannot be more than 49149 BYTES if sentence_tokenizer == 'spacy_jpn' and len(text) > 49149 // 4: # Around 300 tokens per line 4 characters per token and 4 bytes per character (≈ 49149 / 4 / 4 / 300) sections = wl_nlp_utils.split_into_chunks_text(text, section_size=10) else: sections = wl_nlp_utils.split_into_chunks_text( text, section_size=main.settings_custom['files']['misc'] ['read_files_in_chunks']) for section in sections: # NLTK if sentence_tokenizer == 'nltk_punkt': lang_texts = { 'ces': 'czech', 'dan': 'danish', 'nld': 'dutch', # English 'eng_gb': 'english', 'eng_us': 'english', 'est': 'estonian', 'fin': 'finnish', 'fra': 'french', # German 'deu_at': 'german', 'deu_de': 'german', 'deu_ch': 'german', 'ell': 'greek', 'ita': 'italian', # Norwegian 'nob': 'norwegian', 'nno': 'norwegian', 'pol': 'polish', # Portuguese 'por_br': 'portuguese', 'por_pt': 'portuguese', 'rus': 'russian', 'slv': 'slovene', 'spa': 'spanish', 'swe': 'swedish', 'tur': 'turkish', # Other languages 'other': 'english' } sentences.extend( nltk.sent_tokenize(section, language=lang_texts[lang])) # spaCy elif sentence_tokenizer.startswith('spacy_'): # Chinese, English, German, Portuguese if not lang.startswith('srp_'): lang = wl_conversion.remove_lang_code_suffixes(main, lang) nlp = main.__dict__[f'spacy_nlp_{lang}'] doc = nlp(section) sentences.extend([sentence.text for sentence in doc.sents]) # Chinese & Japanese elif sentence_tokenizer in ['wordless_zho', 'wordless_jpn']: for line in section.splitlines(): sentence_start = 0 for i, char in enumerate(line): if i >= sentence_start and char in [ '。', '!', '?', '!', '?' ]: for j, char_next in enumerate(line): if j > i and char_next not in [ '。', '!', '?', '!', '?', '’', '”', ')', ')' ]: sentences.append(line[sentence_start:j]) sentence_start = j break if sentence_start <= len(line): sentences.append(line[sentence_start:]) # Icelandic elif sentence_tokenizer == 'tokenizer_isl': for sentence in tokenizer.split_into_sentences(section): sentences.append( wl_word_detokenization.wl_word_detokenize( main, tokens=sentence.split(), lang='isl')) # Thai elif sentence_tokenizer == 'pythainlp_crfcut': sentences.extend(pythainlp.sent_tokenize(section)) # Tibetan elif sentence_tokenizer == 'botok_bod': wl_nlp_utils.init_word_tokenizers(main, lang='bod') tokens = main.botok_word_tokenizer.tokenize(section) for sentence_tokens in botok.sentence_tokenizer(tokens): sentences.append(''.join([ sentence_token.text for sentence_token in sentence_tokens['tokens'] ])) # Vietnamese elif sentence_tokenizer == 'underthesea_vie': sentences.extend(underthesea.sent_tokenize(section)) # Strip spaces sentences = [ sentence_non_empty for sentence in sentences if (sentence_non_empty := sentence.strip()) ]
def wl_sentence_tokenize(main, text, lang, sentence_tokenizer='default'): sentences = [] if lang not in main.settings_global['sentence_tokenizers']: lang = 'other' if sentence_tokenizer == 'default': sentence_tokenizer = main.settings_custom['sentence_tokenization'][ 'sentence_tokenizers'][lang] wl_text_utils.check_sentence_tokenizers( main, lang=lang, sentence_tokenizer=sentence_tokenizer) # NLTK if sentence_tokenizer == main.tr('NLTK - Punkt Sentence Tokenizer'): lang_texts = { 'ces': 'czech', 'dan': 'danish', 'nld': 'dutch', 'eng': 'english', 'est': 'estonian', 'fin': 'finnish', 'fra': 'french', 'deu': 'german', # Greek (Modern) 'ell': 'greek', 'ita': 'italian', # Norwegian Bokmål & Norwegian Nynorsk 'nob': 'norwegian', 'nno': 'norwegian', 'pol': 'polish', 'por': 'portuguese', 'rus': 'russian', 'slv': 'slovene', 'spa': 'spanish', 'swe': 'swedish', 'tur': 'turkish', # Other languages 'other': 'english' } sentences = nltk.sent_tokenize(text, language=lang_texts[lang]) # spaCy elif sentence_tokenizer == main.tr('spaCy - Sentencizer'): nlp = main.__dict__[f'spacy_nlp_{lang}'] doc = nlp(text) # See Issue #3479: https://github.com/explosion/spaCy/issues/3479 doc.is_parsed = True sentences = [sentence.text for sentence in doc.sents] # syntok elif sentence_tokenizer == main.tr('syntok - Sentence Segmenter'): for para in syntok.segmenter.analyze(text): for sentence in para: sentences.append(''.join( [token.spacing + token.value for token in sentence])) # Chinese & Japanese elif sentence_tokenizer in [ main.tr('Wordless - Chinese Sentence Tokenizer'), main.tr('Wordless - Japanese Sentence Tokenizer') ]: for line in text.splitlines(): sentence_start = 0 for i, char in enumerate(line): if i >= sentence_start and char in ['。', '!', '?', '!', '?']: for j, char in enumerate(line): if j > i and char not in [ '。', '!', '?', '!', '?', '’', '”', ')', ')' ]: sentences.append(line[sentence_start:j]) sentence_start = j break if sentence_start <= len(line): sentences.append(line[sentence_start:]) # Icelandic elif sentence_tokenizer == main.tr( 'Tokenizer - Icelandic Sentence Tokenizer'): for sentence in tokenizer.split_into_sentences(text): sentences.append( wl_word_detokenization.wl_word_detokenize( main, tokens=sentence.split(), lang='isl')) # Russian elif sentence_tokenizer == main.tr('razdel - Russian Sentenizer'): sentences = [sentence.text for sentence in razdel.sentenize(text)] # Thai elif sentence_tokenizer == main.tr('PyThaiNLP - CRFCut'): sentences = pythainlp.sent_tokenize(text) # Tibetan elif sentence_tokenizer == main.tr('botok - Tibetan Sentence Tokenizer'): wl_text_utils.check_word_tokenizers(main, lang='bod') tokens = main.botok_word_tokenizer.tokenize(text) for sentence_tokens in botok.sentence_tokenizer(tokens): sentences.append(''.join([ sentence_token.text for sentence_token in sentence_tokens[1] ])) # Vietnamese elif sentence_tokenizer == main.tr( 'Underthesea - Vietnamese Sentence Tokenizer'): sentences = underthesea.sent_tokenize(text) # Strip spaces sentences = [sentence.strip() for sentence in sentences] sentences = wl_text_utils.record_boundary_sentences(sentences, text) return sentences
def sent_tokenize(text): wt = WordTokenizer() tokens = wt.tokenize(text) sentences = sentence_tokenizer(tokens) return [[token.text for token in sentence[1]] for sentence in sentences]