如何解决不使用NLTK的python中的Tokenizer方法
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之类的程序包,该程序包支持正则表达式。 [Related question]
,改用 gensim。
tokenized_word = gensim.utils.simple_preprocess(str(sentences ),deacc=True) # deacc=True removes punctuations
我假设您正在谈论编译器的标记器。此类标记通常由常规语言定义,对于该常规语言,正则表达式/有限状态自动机是自然的解决方案。一个例子:
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
正则表达式进行匹配。只要存在匹配项,Token
生成器函数就会生成由类型和值组成的lexer
实例。在此示例中,WHITESPACE
令牌不是在解析器将忽略空格且仅用于分隔其他令牌的假设下产生的。
有一个包罗万象的ERROR
标记被定义为最后一个标记,如果其他标记正则表达式都不匹配(则使用.
,则该标记将与单个字符匹配)换行符,除非使用了标记re.S
,但不需要匹配换行符,因为换行符由WHITESPACE
令牌正则表达式匹配,因此是“合法”匹配)。添加了特殊代码以防止连续生成ERROR
令牌。实际上,lexer
生成一个ERROR
令牌,然后丢弃输入,直到它可以再次与合法令牌匹配为止。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。