如何将带有分隔符的字符串拆分为集合?

3
我想将文件中的单词读入到一个集合中,就像这样:
# Text file
bill
beep-boop
wow
apostrophe'

然后当我打印时
>>> print(mySet)
{'bill', 'beep', 'boop', 'wow', 'apostrophe'}

所以我不想要任何前导或结束的撇号,但是如何使用split()函数有多个分隔符?我只有这个:

mySet = set((stdin.read().split()))

2
你具体有哪些分隔符? - Brad Solomon
@BradSolomon 一个单词是一个或多个不区分大小写的字符。这些字符可以是英语语言中的所有字母和/或单引号/撇号,但不能包含十进制数字,也不能以撇号开头或结尾。 - Coder117
1个回答

5
不要关注分隔符,而是应该关注单词/标记的构成。根据您的评论,
一个单词是一个或多个大小写不敏感的字符。这些字符可以是英语语言中的所有字母和单引号/撇号。没有小数数字。没有前导或结束的撇号。
'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
# {'d', 'a', 'said', 'abcd', 'apostrophe', 'beep', 'bb', 'c', 'more', 'he', 'words', "i'm", 'yep', 'bill', "j'aime", 'one', 'wow', 'here', 'boop'}

这类正则表达式与一些机器学习算法中用于将文本文档转换为标记计数矩阵的正则表达式相似。scikit-learn的CountVectorizer使用token_pattern='(?u)\b\w\w+\b',其中定义单词为具有两个或更多字母的单词。
要从命令行运行此操作,请创建一个名为tokenizer.py的脚本:
# 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


你的正则表达式与“J'aime”和“I'm”不匹配。 - abybaddi009
抱歉,实际上这些应该是一个单词。例如,在“Don't”中,撇号属于“字符可以是所有英文字母和/或撇号”的范畴。只有前导和结尾的撇号应该被删除。因此,它应该在列表中列出为:{'Some','Other','Words','Don't'}。 - Coder117
是的,所以如果文本文件中有两个单词:Hehe,我只想要小写版本。@BradSolomon 附言:非常感谢你的帮助 :) - Coder117
@BradSolomon,“Some99”不应被视为一个单词,也不应该放入我的集合中。同样的情况也适用于“w3rd”。 - Coder117
1
@Coder117 这是我的最后更新。如果需要的话,现在该轮到你自己进行一些研究了。祝你好运! - Brad Solomon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接