import os

import jieba.posseg as pseg
from django.conf import settings

# 在模块加载时预先读取停用词表，避免每次调用都读文件
_STOPWORDS = set()
_stopwords_path = os.path.join(settings.BASE_DIR,
                               'apps/core/hit_stopwords.txt')
try:
    with open(_stopwords_path, 'r', encoding='utf-8') as f:
        _STOPWORDS = set(line.strip() for line in f if line.strip())
except FileNotFoundError:
    # 妥善处理文件找不到的情况，例如记录日志或使用空集合
    print(f"Warning: Stopwords file not found at {_stopwords_path}")
    _STOPWORDS = set()
def extract_keywords(text):
        """提取文本中的有效名词关键词（优化版）"""
        # 使用jieba进行分词和词性标注
        words = pseg.cut(text)
        nouns = []
        # 定义更明确的名词词性标签集合
        # 常见的名词词性标签包括：n(普通名词), nr(人名), ns(地名), nt(机构团体), nz(其他专名)
        NOUN_TAGS = {'n', 'nr', 'ns', 'nt', 'nz'}  # 可根据需要扩展

        for word, flag in words:
            # 优化筛选条件：长度大于1，非停用词，且词性在名词集合中
            if (len(word) > 1 and word not in _STOPWORDS
                    and flag in NOUN_TAGS):
                nouns.append(word)

        # 去重并返回列表
        # 使用dict.fromkeys保留首次出现的顺序，若顺序无关紧要可使用list(set(nouns))
        return list(dict.fromkeys(nouns))