不要关注分隔符,而是应该关注单词/标记的构成。根据您的评论,
一个单词是一个或多个大小写不敏感的字符。这些字符可以是英语语言中的所有字母和单引号/撇号。没有小数数字。没有前导或结束的撇号。
'Some99' 不被认为是一个单词,不应该放入集合中。同样适用于 'w3rd'。
如果有两个单词 'He' 和 'he'--我只想要小写版本。
以下是一个封装了此功能的分词器:
import re
regex = re.compile(r'\b[A-Za-z\'"]+\b', flags=re.U)
一个示例文本文件:
bill
beep-boop
wow
apostrophe'
a
bb
a?c?d?
abcd-abcd?
J'aime
I'm
He said, "Yep"
Some99\words\here\\
One more w3rd
可以理解为:
with open('textfile.txt', 'r') as f:
text = set(word.lower() for word in regex.findall(f.read()))
text
这类正则表达式与一些机器学习算法中用于将文本文档转换为标记计数矩阵的正则表达式相似。scikit-learn的
CountVectorizer使用
token_pattern='(?u)\b\w\w+\b'
,其中定义单词为具有两个或更多字母的单词。
要从命令行运行此操作,请创建一个名为
tokenizer.py
的脚本:
import re
import sys
regex = re.compile(r'\b[A-Za-z\'"]+\b', flags=re.U)
if __name__ == '__main__':
file = sys.argv[1]
with open(file, 'r') as f:
text = set([word.lower() for word in regex.findall(f.read())])
print(text)
然后你可以在命令行中像这样运行:
$ python3 tokenizer.py textfile.txt
你可以在这里进行实验here。