簡體   English   中英

不使用NLTK的python中的Tokenizer方法

[英]Tokenizer method in python without using NLTK

python 新手 - 我需要一些幫助來弄清楚如何在 python 中編寫標記器方法而不使用任何庫,如 Nltk。 我將如何開始? 謝謝!

根據復雜性,您可以簡單地使用字符串split功能。

# Words independent of sentences
words = raw_text.split(' ')

# Sentences and words
sentences = raw_text.split('. ')
words_in_sentences = [sentence.split(' ') for sentence in sentences]

如果你想做一些更復雜的事情,你可以使用像re這樣的包,它提供對正則表達式的支持。 [ 相關問題]

我假設您正在談論編譯器的標記器。 這樣的標記通常可以由正則表達式/有限狀態自動機是自然解決方案的正則語言定義。 一個例子:

import re
from collections import namedtuple


Token = namedtuple('Token', ['type','value'])

def lexer(text):

    IDENTIFIER = r'(?P<IDENTIFIER>[a-zA-Z_][a-zA-Z_0-9]*)'
    ASSIGNMENT = r'(?P<ASSIGNMENT>=)'
    NUMBER = r'(?P<NUMBER>\d+)'
    MULTIPLIER_OPERATOR = r'(?P<MULTIPLIER_OPERATOR>[*/])'
    ADDING_OPERATOR = r'(?P<ADDING_OPERATOR>[+-])'
    WHITESPACE = r'(?P<WHITESPACE>\s+)'
    EOF = r'(?P<EOF>\Z)'
    ERROR = r'(?P<ERROR>.)' # catch everything else, which is an error

    tokenizer = re.compile('|'.join([IDENTIFIER, ASSIGNMENT, NUMBER, MULTIPLIER_OPERATOR, ADDING_OPERATOR, WHITESPACE, EOF, ERROR]))
    seen_error = False
    for m in tokenizer.finditer(text):
        if m.lastgroup != 'WHITESPACE': #ignore whitespace
            if m.lastgroup == 'ERROR':
                if not seen_error:
                    yield Token(m.lastgroup, m.group())
                    seen_error = True # scan until we find a non-error input
            else:
                yield Token(m.lastgroup, m.group())
                seen_error = False
        else:
            seen_error = False
                

for token in lexer('foo = x12 * y / z - 3'):
    print(token)

印刷:

Token(type='IDENTIFIER', value='foo')
Token(type='ASSIGNMENT', value='=')
Token(type='IDENTIFIER', value='x12')
Token(type='MULTIPLIER_OPERATOR', value='*')
Token(type='IDENTIFIER', value='y')
Token(type='MULTIPLIER_OPERATOR', value='/')
Token(type='IDENTIFIER', value='z')
Token(type='ADDING_OPERATOR', value='-')
Token(type='NUMBER', value='3')
Token(type='EOF', value='')

上面的代碼將每個標記(例如IDENTIFIERASSIGNMENT等)定義為簡單的正則表達式,然后使用|將它們組合成單個正則表達式模式| 運算符並將表達式編譯為變量tokenizer 然后它使用正則表達式finditer方法和輸入文本作為其參數來創建一個“掃描器”,它嘗試將連續的輸入標記與tokenizer正則表達式進行匹配。 只要存在匹配, lexer生成器函數就會生成由類型和值組成的Token實例。 在此示例中,假設空格將被解析器忽略並且僅用於分隔其他標記,則不會產生WHITESPACE標記。

有一個包羅萬象的ERROR標記被定義為最后一個標記,如果沒有其他標記正則表達式匹配,它將匹配單個字符(一個.用於此,除非使用標志re.S ,否則它將不匹配換行符,但是不需要匹配換行符,因為換行符正被WHITESPACE標記正則表達式匹配,因此是“合法”匹配)。 添加了特殊代碼以防止生成連續的ERROR標記。 實際上, lexer生成一個ERROR標記,然后丟棄輸入,直到它可以再次匹配合法標記。

使用 gensim 代替。

tokenized_word = gensim.utils.simple_preprocess(str(sentences ), deacc=True) # deacc=True removes punctuations

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM