如何不借助nltk、spacy等外部库,仅用Regex判断词性
仅用正则表达式识别英文单词的词性(名词、形容词、动词)
仅靠正则表达式识别词性只能基于英文单词的构词后缀,无法处理不规则词、多义词,也做不到100%准确,但可以覆盖大部分常见规则词的判断。以下是具体实现思路和示例:
核心思路:基于词性后缀的正则匹配
英文中不同词性通常有固定的后缀,我们可以针对这些后缀编写正则模式,匹配对应的词性。
1. 名词识别
常见名词后缀包括:-tion, -sion, -ment, -ness, -ity, -ship, -hood, -dom, -ance, -ence,以及复数形式的-s, -es。
对应的正则模式:
noun_pattern = re.compile(r'^(.*)(tion|sion|ment|ness|ity|ship|hood|dom|ance|ence|s|es)$', re.IGNORECASE)
示例匹配:action, happiness, friendship, cats
2. 形容词识别
常见形容词后缀包括:-able, -ible, -al, -ful, -less, -ous, -ic, -ive, -y, -ish。
对应的正则模式:
adj_pattern = re.compile(r'^(.*)(able|ible|al|ful|less|ous|ic|ive|y|ish)$', re.IGNORECASE)
示例匹配:comfortable, helpful, selfish, happy
3. 动词识别
常见动词后缀包括:-ate, -ify, -ize, -en,以及分词形式的-ing, -ed。
对应的正则模式:
verb_pattern = re.compile(r'^(.*)(ate|ify|ize|en|ing|ed)$', re.IGNORECASE)
示例匹配:organize, simplify, widen, running
完整实现示例(Python)
import re # 预编译正则模式,提升匹配效率 noun_pattern = re.compile(r'^(.*)(tion|sion|ment|ness|ity|ship|hood|dom|ance|ence|s|es)$', re.IGNORECASE) adj_pattern = re.compile(r'^(.*)(able|ible|al|ful|less|ous|ic|ive|y|ish)$', re.IGNORECASE) verb_pattern = re.compile(r'^(.*)(ate|ify|ize|en|ing|ed)$', re.IGNORECASE) def guess_pos(word): # 优先级:先匹配名词和形容词,再匹配动词(避免分词后缀被误判) if noun_pattern.match(word): return "名词(推测)" elif adj_pattern.match(word): return "形容词(推测)" elif verb_pattern.match(word): return "动词(推测)" else: return "无法通过正则确定词性" # 测试用例 test_words = ["action", "comfortable", "organize", "run", "happiness", "excited", "cats"] for word in test_words: print(f"{word}: {guess_pos(word)}")
关键局限性说明
- 不规则词无法识别:比如
go(动词)、child(名词)这类无固定后缀的单词,正则无法匹配。 - 多义词歧义无法区分:比如
excited既可以是动词过去式,也可以是形容词;running可以是动词现在分词、形容词或名词,正则无法判断具体语境。 - 后缀重叠误判:少数单词可能同时符合多个词性后缀,需要根据实际需求调整匹配优先级。
内容的提问来源于stack exchange,提问作者Jap Ndufor
相关产品推荐
相关产品推荐

