修改python nltk.word_tokenize以排除"#"作为分隔符

时间:2016-02-27 19:03:19

标签: python nltk tokenize

我正在使用Python的NLTK库来标记我的句子。

如果我的代码是

text = "C# billion dollars; we don't own an ounce C++"
print nltk.word_tokenize(text)

我将此作为输出

['C', '#', 'billion', 'dollars', ';', 'we', 'do', "n't", 'own', 'an', 'ounce', 'C++']

符号;.#被视为分隔符。有没有办法从分隔符集中删除#,例如+不是分隔符,因此C++显示为单个代币?

我希望我的输出

['C#', 'billion', 'dollars', ';', 'we', 'do', "n't", 'own', 'an', 'ounce', 'C++']

我希望C#被视为一个令牌。

3 个答案:

答案 0 :(得分:1)

另一个想法:不是改变文本的标记方式,而是在代币上循环并加入每个#'#'与前一个。

txt = "C# billion dollars; we don't own an ounce C++"
tokens = word_tokenize(txt)

i_offset = 0
for i, t in enumerate(tokens):
    i -= i_offset
    if t == '#' and i > 0:
        left = tokens[:i-1]
        joined = [tokens[i - 1] + t]
        right = tokens[i + 1:]
        tokens = left + joined + right
        i_offset += 1

>>> tokens
['C#', 'billion', 'dollars', ';', 'we', 'do', "n't", 'own', 'an', 'ounce', 'C++']

答案 1 :(得分:1)

处理多词标记化时,另一种方法是使用NLTK Multi-Word Expression tokenizer重新标记提取的标记:

mwtokenizer = nltk.MWETokenizer(separator='')
mwtokenizer.add_mwe(('c', '#'))
mwtokenizer.tokenize(tokens)

答案 2 :(得分:0)

NLTK使用正则表达式来标记文本,因此您可以使用其正则表达式标记生成器来定义自己的正则表达式。

我将为您创建一个示例,其中文本将分割在任何空格字符(制表符,换行符,ecc)和其他几个符号上,例如:

>>> txt = "C# billion dollars; we don't own an ounce C++"
>>> regexp_tokenize(txt, pattern=r"\s|[\.,;']", gaps=True)
['C#', 'billion', 'dollars', 'we', 'don', 't', 'own', 'an', 'ounce', 'C++']