我正在使用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#
被视为一个令牌。
答案 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++']