根据关键词库提取文本里的关键词
实例一:用正则、for循环处理,适用于关键词库不多的情况
import re # 定义关键词词库 keywords = ['赵震北沈阳演唱会', '衢州全明星演唱会', '丰都群星演唱会', '周传雄苏州演唱会', '刘若英西安演唱会', '五月天北京演唱会', '五月天武汉演唱会', '南山星空音乐节'] # 定义输入文本 text = "五月天北京演唱会的门票已经开售,衢州全明星演唱会赶周传雄苏州演唱会快来抢吧!" # 对文本进行关键词匹配 matched_keywords = [] for keyword in keywords: pattern = re.compile(keyword) if pattern.search(text): matched_keywords.append(keyword) # 输出匹配到的关键词 print("在输入文本中匹配到的关键词有:", matched_keywords)
实例二:定义 Trie 树节点类,适用于关键词库较多的情况
# 定义 Trie 树节点类 class TrieNode: def __init__(self): self.is_end = False # 标记当前节点是否是某个关键词的结尾 self.children = {} # 存储子节点 # 定义 Trie 树类 class Trie: def __init__(self, keywords): self.root = TrieNode() # 初始化根节点 for keyword in keywords: self.insert(keyword) # 将所有关键词插入到 Trie 树中 def insert(self, word): node = self.root for char in word: if char not in node.children: # 若当前字符不存在于 Trie 树中,则新建一个节点 node.children[char] = TrieNode() node = node.children[char] # 沿着 Trie 树向下遍历 node.is_end = True # 标记当前节点是某个关键词的结尾 def search(self, text): matched_keywords = [] # 存储匹配到的关键词 for i in range(len(text)): # 从文本的每个位置开始匹配关键词 node = self.root # 每次匹配都从 Trie 树的根节点开始 for j in range(i, len(text)): # 沿着 Trie 树向下遍历,看能否匹配到关键词 char = text[j] if char not in node.children: break # 若遇到某个字符不在 Trie 树中,则直接退出循环 node = node.children[char] # 继续向下遍历 if node.is_end: # 若匹配到了某个关键词的结尾,则说明匹配成功 matched_keywords.append(text[i:j+1]) # 将该关键词加入到匹配结果中 return matched_keywords # 定义关键词词库 keywords = ['赵震北沈阳演唱会', '衢州全明星演唱会', '丰都群星演唱会', '周传雄苏州演唱会', '刘若英西安演唱会', '五月天北京演唱会', '五月天武汉演唱会', '南山星空音乐节'] # 初始化 Trie 树 trie = Trie(keywords) # 定义输入文本 text = "五月天北京演唱会的门票已经刘若英西安演唱会开售,南山星空音乐节赶快来抢吧!" # 对文本进行关键词匹配 matched_keywords = trie.search(text) # 输出匹配到的关键词 print("在输入文本中匹配到的关键词有:", matched_keywords)