[英]Tokenizer method in python without using NLTK
python 新手 - 我需要一些幫助來弄清楚如何在 python 中編寫標記器方法而不使用任何庫,如 Nltk。 我將如何開始? 謝謝!
我假設您正在談論編譯器的標記器。 這樣的標記通常可以由正則表達式/有限狀態自動機是自然解決方案的正則語言定義。 一個例子:
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='')
上面的代碼將每個標記(例如IDENTIFIER
、 ASSIGNMENT
等)定義為簡單的正則表達式,然后使用|
將它們組合成單個正則表達式模式|
運算符並將表達式編譯為變量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.