如何从python中的单词中分离标点符号?

时间:2019-11-14 22:41:37

标签: python string spell-checking

我正在尝试创建一个拼写检查功能,以读取文本文件,该文本文件包含包含多个拼写错误的单词的段落。例如:“我最喜欢的科目是:物理,数学,化学树和生物学-我发现有必要在课余时间使用iPad进行综合笔记。”我有三个要解决的问题:

  1. 当前,由于该单词后面紧跟着逗号,因此该程序将Maths视为不正确的单词。我认为,为了解决此问题,最好像这样在文本文件中拆分字符串:['My','favorite','subjects','are',':','',' Physcs”,“”,“ Maths”,“ ...”等。如何在不使用任何导入的python函数(例如string或regex(re)函数)的情况下将字符串分为单词和标点符号?

  2. 我目前正在通过遍历文本文件中的每个单词,将每个单词与可接受的英语单词字典进行比较。是否有更好的方法来预处理列表,以快速识别单词是否包含给定元素以改善程序的运行时间?

  3. 有几个单词,例如“ eBook”和“ iPad”是下面函数is_valid_word中使用的规则的例外(即,该单词必须以大写字母开头,所有其他字母均为小写或单词中的所有字符都必须大写)。有没有一种方法可以检查字符串是否是有效单词?

任何帮助将不胜感激!

def get_words():
    with open( "english.txt" ) as a:
         words = a.readlines()
    words = [word.strip() for word in words]
    return words

isWord = get_words()

def is_valid_word(st):
    if isinstance(st, str):
        st_lower = st.lower()
        if st_lower in isWord:
            if (st[0:len(st)].isupper() or st[0:len(st)].islower()) or (st[0].isupper() and st[1:len(st)].islower()) or st[0:len(st)].isupper():
                return (True)
            else: 
                return(False)
        else:
            return (False)
    else:
        return (False)

def spell_check_file( file ):
    incorrectWords = []  # Will contain all incorrectly spelled words.
    num = 0  # Used for line counter.
    with open(file, 'r') as f:
        for line_no, line in enumerate(f):
            for word in line.split():
                if is_valid_word(word) == False:
                    incorrectWords.append(line_no)
                    incorrectWords.append(word)
        for f in incorrectWords:
            return incorrectWords
            print (incorrectWords)

spell_check_file("passage.txt")

1 个答案:

答案 0 :(得分:0)

这种任务就是正则表达式的用途。尝试不使用正则表达式是一种自我惩罚的方式。

>>> import re
>>> pattern = re.compile(r"[\w']+|\s+|[^\w'\s]+")
>>> pattern.findall("My favorite subjects are: Physics, Maths, Chemistry")
['My', ' ', 'favorite', ' ', 'subjects', ' ', 'are', ':', ' ', 'Physics', ',',
 ' ', 'Maths', ',', ' ', 'Chemistry']

请注意,我在与单词匹配的部分中加入了',因此“不”之类的单词将保留为一个整体。