本文目录导读:

我来为你介绍Python文本关键词提取的几种常用方法,包括具体的代码示例。
TF-IDF 方法(最常用)
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
# 示例文本
texts = [
"我喜欢在北京天安门看升国旗,五星红旗迎风飘扬",
"Python是一种流行的编程语言,常用于数据分析",
"机器学习是人工智能的重要分支,深度学习是机器学习的子集"
]
# 分词函数
def cut_words(text):
return ' '.join(jieba.cut(text))
# 处理文本
processed_texts = [cut_words(text) for text in texts]
# 计算TF-IDF
vectorizer = TfidfVectorizer(max_features=100)
tfidf_matrix = vectorizer.fit_transform(processed_texts)
# 提取关键词
feature_names = vectorizer.get_feature_names_out()
for i, text in enumerate(texts):
print(f"\n文本{i+1}的关键词:")
# 获取该文本的TF-IDF值
row = tfidf_matrix[i].toarray()[0]
# 获取词与权重的对应关系
word_weights = [(feature_names[j], row[j]) for j in range(len(row)) if row[j] > 0]
# 按权重排序
word_weights.sort(key=lambda x: x[1], reverse=True)
# 显示前5个关键词
for word, weight in word_weights[:5]:
print(f"{word}: {weight:.4f}")
TextRank 算法
from textrank4zh import TextRank4Keyword
text = "我喜欢在北京天安门看升国旗,五星红旗迎风飘扬,Python是一种流行的编程语言,常用于数据分析。"
tr4w = TextRank4Keyword()
tr4w.analyze(text=text, lower=True, window=2)
print("TextRank提取的关键词:")
for item in tr4w.get_keywords(10, word_min_len=1):
print(f"{item.word}: {item.weight:.4f}")
使用jieba直接提取
import jieba.analyse
text = "我喜欢在北京天安门看升国旗,五星红旗迎风飘扬,Python是一种流行的编程语言,常用于数据分析。"
# 基于TF-IDF算法
keywords_tfidf = jieba.analyse.extract_tags(text, topK=5, withWeight=True)
print("jieba TF-IDF关键词:")
for word, weight in keywords_tfidf:
print(f"{word}: {weight:.4f}")
# 基于TextRank算法
keywords_textrank = jieba.analyse.textrank(text, topK=5, withWeight=True)
print("\njieba TextRank关键词:")
for word, weight in keywords_textrank:
print(f"{word}: {weight:.4f}")
完整的关键词提取工具类
import jieba
import jieba.analyse
from collections import Counter
class KeywordExtractor:
def __init__(self):
# 加载自定义词典(可选)
# jieba.load_userdict("user_dict.txt")
pass
def extract_by_tfidf(self, text, topK=10):
"""基于TF-IDF提取关键词"""
keywords = jieba.analyse.extract_tags(
text,
topK=topK,
withWeight=True
)
return keywords
def extract_by_textrank(self, text, topK=10):
"""基于TextRank提取关键词"""
keywords = jieba.analyse.textrank(
text,
topK=topK,
withWeight=True
)
return keywords
def extract_by_frequency(self, text, topK=10):
"""基于词频提取关键词"""
# 分词并过滤停用词
words = jieba.cut(text)
stop_words = self._load_stop_words()
words = [word for word in words
if word not in stop_words and len(word) > 1]
# 统计词频
word_freq = Counter(words)
return word_freq.most_common(topK)
def _load_stop_words(self):
"""加载停用词表"""
# 这里使用简单的停用词列表
stop_words = set([
'的', '了', '在', '是', '我', '有', '和', '就',
'不', '人', '都', '一', '一个', '上', '也', '很',
'到', '说', '要', '去', '你', '会', '着', '没有'
])
return stop_words
# 使用示例
extractor = KeywordExtractor()
text = """
北京市是中国首都,也是政治文化中心,这里有许多著名景点,
比如故宫、天安门广场、长城等,北京不仅是历史名城,也是现代化大都市。
"""
print("TF-IDF关键词:")
for word, weight in extractor.extract_by_tfidf(text, topK=5):
print(f"{word}: {weight:.4f}")
print("\nTextRank关键词:")
for word, weight in extractor.extract_by_textrank(text, topK=5):
print(f"{word}: {weight:.4f}")
print("\n基于词频的关键词:")
for word, count in extractor.extract_by_frequency(text, topK=5):
print(f"{word}: {count}")
批量文本关键词提取
import pandas as pd
import jieba.analyse
def batch_extract_keywords(texts, topK=5):
"""批量提取关键词"""
results = []
for text in texts:
# 提取关键词
keywords = jieba.analyse.extract_tags(text, topK=topK)
results.append({
'text': text[:30] + '...' if len(text) > 30 else text,
'keywords': ','.join(keywords)
})
return pd.DataFrame(results)
# 示例数据
data = [
"Python编程语言在人工智能和机器学习领域应用广泛",
"中国经济持续增长,科技创新推动产业升级",
"环保意识日益增强,可再生能源发展迅速"
]
# 批量处理
result_df = batch_extract_keywords(data, topK=3)
print(result_df)
安装依赖
pip install jieba pip install scikit-learn pip install textrank4zh pip install pandas
实际应用建议
- 中文分词:使用jieba进行准确的中文分词
- 停用词过滤:移除常见的无意义词
- 自定义词典:针对特定领域添加专业词汇
- 多方法结合:综合TF-IDF、TextRank等方法提高准确度
- 结果过滤:去除过短或过长的词条
选择哪种方法取决于你的具体需求:
- TF-IDF:适合准确度要求高、需要词权重的场景
- TextRank:适合不需要训练数据的场景
- 词频统计:适合快速简单的关键词提取