英文分詞對比nltk vs spacy


word tokenize

  1. NLTK

    1. nltk.word_tokenize

    substring,按標點字符和空格划分,但保留小數、分數一類

    1. nltk.tokenize.RegexpTokenizer

    正則可保留固定的一部分,如對一些金錢'$10'表示或者其他非空白序列

    1. nltk.tokenize.stanford.StanfordTokenizer

    會將單位切分更細,例如:kg/m² -> 'kg', '/', 'm', '²'

    1. nltk.tokenize.mwe.MWETokenizer

    對已分詞的文本進行再處理或者合並多個字符為一個

    1. nltk.tokenizr.WordPunctTokenizer.tokenize()`

    按字符和非字符進行划分,相當於使用正則 \w+|[^\w\s]+,與word_tokenize的區別在於,會將小數、分數分開

    1. nltk.tokeizer.WhitespaceTokenizer().tokenize()

    按(space, tab, newline)划分

  2. Spacy

    預定義的分詞是按照空格來划分,spaCy首先對文本分詞,原始文本在空格處分割,類似於text.split(' '),然后分詞器(Tokenizer)從左向右依次處理token,在處理token時,spaCy做了兩個check:

    • 是否匹配特殊規則(execption rule)
    • 是否前綴、中綴或后綴可以分割

    spacy進行自定義規則處理,比如網址:

    import re
    from spacy.lang.en import English
    nlp = spacy.load("en_core_web_sm")
    
    def my_en_tokenizer(nlp):
        prefix_re = spacy.util.compile_prefix_regex(English.Defaults.prefixes)
        suffix_re = spacy.util.compile_suffix_regex(English.Defaults.suffixes)
        infix_re = spacy.util.compile_infix_regex(English.Defaults.infixes)
        pattern_re = re.compile(r'^https?://')
        return spacy.tokenizer.Tokenizer(nlp.vocab,
                                         English.Defaults.tokenizer_exceptions,
                                  		 prefix_re.search,
                                         suffix_re.search,
                                         infix_re.finditer,
                                         token_match=pattern_re.match)
    
    nlp.tokenizer = my_en_tokenizer(nlp)
    doc = nlp(ss)
    print([t.text for t in doc])
    
    '''
    ['abd', ',', 'defe', ',', 'https://www.selleck.eu/products/MK-2206']
    '''
    

簡單總結:

​ nltk的word_tokenize符合常用分詞,能將帶有連字符'-','/'的詞進行保留,對常用單位進行保留,比如'kg/m²'等。添加自定義詞典,可利用MWETokenizer進一步處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM