首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >修改NLTK word_tokenize以防止括号的标记化

修改NLTK word_tokenize以防止括号的标记化
EN

Stack Overflow用户
提问于 2016-05-09 13:59:54
回答 1查看 1.8K关注 0票数 1

我有以下main.py

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/env python
# vim: set noexpandtab tabstop=2 shiftwidth=2 softtabstop=-1 fileencoding=utf-8:

import nltk
import string
import sys
for token in nltk.word_tokenize(''.join(sys.stdin.readlines())):
    #print token
    if len(token) == 1 and not token in string.punctuation or len(token) > 1:
        print token

输出如下所示。

代码语言:javascript
代码运行次数:0
运行
复制
./main.py <<< 'EGR1(-/-) mouse embryonic fibroblasts'
EGR1
-/-
mouse
embryonic
fibroblasts

有没有人知道有没有这样的方法来稍微修改一下记号赋予器?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-05-09 16:25:25

NLTK中的默认word_tokenize()函数是基于正则表达式替换序列的TreebankWordTokenizer

更具体地说,当涉及到在括号之间添加空格时,TreebankWordTokenizer使用以下正则表达式替换:

代码语言:javascript
代码运行次数:0
运行
复制
PARENS_BRACKETS = [
    (re.compile(r'[\]\[\(\)\{\}\<\>]'), r' \g<0> '),
    (re.compile(r'--'), r' -- '),
]

for regexp, substitution in self.PARENS_BRACKETS:
    text = regexp.sub(substitution, text)

例如:

代码语言:javascript
代码运行次数:0
运行
复制
import re

text = 'EGR1(-/-) mouse embryonic fibroblasts'

PARENS_BRACKETS = [
    (re.compile(r'[\]\[\(\)\{\}\<\>]'), r' \g<0> '),
    (re.compile(r'--'), r' -- '),
]

for regexp, substitution in PARENS_BRACKETS:
    text = regexp.sub(substitution, text)

print text

输出

代码语言:javascript
代码运行次数:0
运行
复制
EGR1 ( -/- )  mouse embryonic fibroblasts

因此,回到“黑客”NLTK word_tokenize()函数,您可以尝试类似这样的操作来取消PARENS_BRACKETS替换的影响:

代码语言:javascript
代码运行次数:0
运行
复制
>>> from nltk.tokenize import TreebankWordTokenizer
>>> tokenizer = TreebankWordTokenizer()
>>> tokenizer.PARENS_BRACKETS = []
>>> text = 'EGR1(-/-) mouse embryonic fibroblasts'
>>> tokenizer.tokenize(text)
['EGR1(-/-)', 'mouse', 'embryonic', 'fibroblasts']
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37108656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档