python中不使用NLTK的标记器方法
python新手-我需要一些帮助,了解如何在不使用任何库(如Nltk)的情况下用python编写标记器方法。我怎么开始?谢谢大家! 根据复杂性,您可以简单地使用stringpython中不使用NLTK的标记器方法,python,nlp,nltk,tokenize,Python,Nlp,Nltk,Tokenize,python新手-我需要一些帮助,了解如何在不使用任何库(如Nltk)的情况下用python编写标记器方法。我怎么开始?谢谢大家! 根据复杂性,您可以简单地使用stringsplit函数 #独立于句子的单词 单词=原始文本。拆分(“”) #句子和单词 句子=原始文本。拆分('.')) words_in_句子=[句子分割('')表示句子中的句子] 如果您想做一些更复杂的事情,可以使用提供正则表达式支持的包,如。[]我假设您谈论的是编译器的标记器。此类标记通常可由正则语言定义,正则表达式/有限状态
split
函数
#独立于句子的单词
单词=原始文本。拆分(“”)
#句子和单词
句子=原始文本。拆分('.'))
words_in_句子=[句子分割('')表示句子中的句子]
如果您想做一些更复杂的事情,可以使用提供正则表达式支持的包,如。[]我假设您谈论的是编译器的标记器。此类标记通常可由正则语言定义,正则表达式/有限状态自动机是其自然解决方案。例如:
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)
上面的代码将每个标记(如标识符
、赋值
等)定义为简单的正则表达式,然后使用|
运算符将它们组合成单个正则表达式模式,并将表达式编译为变量标记器
。然后,它使用正则表达式finditer
方法,将输入文本作为其参数,创建一个“扫描器”,尝试将连续的输入标记与标记器
正则表达式相匹配。只要存在匹配项,lexer
生成器函数就会生成由类型和值组成的Token
实例。在本例中,WHITESPACE
标记不会产生,前提是解析器将忽略空白,并且仅用于分离其他标记
存在一个catchallERROR
标记,定义为最后一个标记,如果其他标记正则表达式均不匹配,则该标记将匹配单个字符(一个
用于此,除非使用标志re.S
,否则不会匹配换行符,但不需要匹配换行符,因为换行符由空格
标记正则表达式匹配,因此是“合法”匹配)。添加特殊代码以防止生成连续的错误
标记。实际上,lexer
生成一个错误
标记,然后丢弃输入,直到可以再次匹配合法标记。改用gensim
tokenized_word=gensim.utils.simple_preprocess(str(句),deacc=True)#deacc=True删除标点符号
您的输入看起来如何?通常,您可以使用示例_string.split()
检索单词列表(没有参数,这是按空格分割的)。
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='')