Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中不使用NLTK的标记器方法_Python_Nlp_Nltk_Tokenize - Fatal编程技术网

python中不使用NLTK的标记器方法

python中不使用NLTK的标记器方法,python,nlp,nltk,tokenize,Python,Nlp,Nltk,Tokenize,python新手-我需要一些帮助,了解如何在不使用任何库(如Nltk)的情况下用python编写标记器方法。我怎么开始?谢谢大家! 根据复杂性,您可以简单地使用stringsplit函数 #独立于句子的单词 单词=原始文本。拆分(“”) #句子和单词 句子=原始文本。拆分('.')) words_in_句子=[句子分割('')表示句子中的句子] 如果您想做一些更复杂的事情,可以使用提供正则表达式支持的包,如。[]我假设您谈论的是编译器的标记器。此类标记通常可由正则语言定义,正则表达式/有限状态

python新手-我需要一些帮助,了解如何在不使用任何库(如Nltk)的情况下用python编写标记器方法。我怎么开始?谢谢大家!

根据复杂性,您可以简单地使用string
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
标记不会产生,前提是解析器将忽略空白,并且仅用于分离其他标记

存在一个catchall
ERROR
标记,定义为最后一个标记,如果其他标记正则表达式均不匹配,则该标记将匹配单个字符(一个
用于此,除非使用标志
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='')