Python 基于特定模式的分词
Tokenizing based on certain pattern with Python
我必须从具有 abc ABC - - 12 V
和 ab abc 1,2W
等句子的句子中标记某些模式。这里 12 V
和 1,2W
都是带单位的值。所以我想标记为 abc
、ABC
和 12 V
。对于另一种情况:ab
、abc
、1,2W
。
我怎样才能做到这一点 ?
那么 nltk word_tokenizer 是一个选项,但我不能插入任何模式,或者我可以吗?
word_tokenize(test_word)
如果您的输入是可预测的,也就是说您知道哪些字符出现在您的标记之间(在本例中我看到一个 space 和一个连字符),您可以使用正则表达式来提取您想要的内容:
import re
def is_float(s):
return re.match(r'^-?\d+(?:\.|,\d+)?$', s)
def extract_tokens(phrase, noise="-"):
phrase_list = re.split("\s+", re.sub(noise, " ", phrase).strip())
phrase_tokenized = []
i, n = 0, len(phrase_list)
while i < n:
phrase_tokenized.append(phrase_list[i])
if phrase_list[i].isdigit() or is_float(phrase_list[i]) and i < n-1:
phrase_tokenized[-1] += " " + phrase_list[i+1]
i += 1
i += 1
return phrase_tokenized
样本测试:
>>> extract_tokens("abc ABC - - 12 V")
['abc', 'ABC', '12 V']
>>> extract_tokens("ab abc 1,2W")
['ab', 'abc', '1,2W']
而对于 "insert a pattern",您需要做的就是根据需要更新 noise
参数。
我必须从具有 abc ABC - - 12 V
和 ab abc 1,2W
等句子的句子中标记某些模式。这里 12 V
和 1,2W
都是带单位的值。所以我想标记为 abc
、ABC
和 12 V
。对于另一种情况:ab
、abc
、1,2W
。
我怎样才能做到这一点 ?
那么 nltk word_tokenizer 是一个选项,但我不能插入任何模式,或者我可以吗?
word_tokenize(test_word)
如果您的输入是可预测的,也就是说您知道哪些字符出现在您的标记之间(在本例中我看到一个 space 和一个连字符),您可以使用正则表达式来提取您想要的内容:
import re
def is_float(s):
return re.match(r'^-?\d+(?:\.|,\d+)?$', s)
def extract_tokens(phrase, noise="-"):
phrase_list = re.split("\s+", re.sub(noise, " ", phrase).strip())
phrase_tokenized = []
i, n = 0, len(phrase_list)
while i < n:
phrase_tokenized.append(phrase_list[i])
if phrase_list[i].isdigit() or is_float(phrase_list[i]) and i < n-1:
phrase_tokenized[-1] += " " + phrase_list[i+1]
i += 1
i += 1
return phrase_tokenized
样本测试:
>>> extract_tokens("abc ABC - - 12 V")
['abc', 'ABC', '12 V']
>>> extract_tokens("ab abc 1,2W")
['ab', 'abc', '1,2W']
而对于 "insert a pattern",您需要做的就是根据需要更新 noise
参数。