Spaces:
Running
Running
| """ | |
| Wikipedia Tool - Tìm kiếm thông tin trên Wikipedia | |
| """ | |
| import wikipedia | |
| from typing import Dict, Any, Optional | |
| def search_wikipedia(query: str, lang: str = "en", summary_length: int = 2000) -> Dict[str, Any]: | |
| """ | |
| Main function: Tìm kiếm thông tin trên Wikipedia | |
| Args: | |
| query: Từ khóa tìm kiếm | |
| lang: Ngôn ngữ Wikipedia (default: "en") | |
| summary_length: Độ dài tóm tắt tối đa | |
| Returns: | |
| Dict chứa thông tin Wikipedia | |
| """ | |
| try: | |
| # Set language | |
| wikipedia.set_lang(lang) | |
| # Tìm kiếm trực tiếp | |
| try: | |
| page = wikipedia.page(query) | |
| return { | |
| "success": True, | |
| "title": page.title, | |
| "summary": page.summary[:summary_length] if page.summary else "No summary available", | |
| "url": page.url, | |
| "categories": page.categories[:5] if hasattr(page, 'categories') else [], | |
| "query_used": query, | |
| "search_method": "direct" | |
| } | |
| except wikipedia.DisambiguationError as e: | |
| # Nếu có nhiều kết quả, lấy kết quả đầu tiên | |
| if e.options: | |
| page = wikipedia.page(e.options[0]) | |
| return { | |
| "success": True, | |
| "title": page.title, | |
| "summary": page.summary[:summary_length] if page.summary else "No summary available", | |
| "url": page.url, | |
| "categories": page.categories[:5] if hasattr(page, 'categories') else [], | |
| "query_used": e.options[0], | |
| "search_method": "disambiguation_first", | |
| "other_options": e.options[1:5] # Lấy 4 option khác | |
| } | |
| else: | |
| raise | |
| except wikipedia.PageError: | |
| # Nếu không tìm thấy trang, thử search | |
| search_results = wikipedia.search(query, results=5) | |
| if search_results: | |
| # Thử lấy kết quả đầu tiên | |
| page = wikipedia.page(search_results[0]) | |
| return { | |
| "success": True, | |
| "title": page.title, | |
| "summary": page.summary[:summary_length] if page.summary else "No summary available", | |
| "url": page.url, | |
| "categories": page.categories[:5] if hasattr(page, 'categories') else [], | |
| "query_used": search_results[0], | |
| "search_method": "search_first", | |
| "other_results": search_results[1:5] | |
| } | |
| else: | |
| return { | |
| "success": False, | |
| "error": f"No Wikipedia results found for: {query}", | |
| "query_used": query, | |
| "search_method": "search_failed" | |
| } | |
| except Exception as e: | |
| return { | |
| "success": False, | |
| "error": f"Wikipedia search error: {str(e)}", | |
| "query_used": query, | |
| "search_method": "error" | |
| } | |
| def extract_search_query_from_question(question: str) -> str: | |
| """ | |
| Trích xuất từ khóa tìm kiếm từ câu hỏi | |
| """ | |
| # Loại bỏ các từ nghi vấn phổ biến | |
| question_words = ["who", "what", "when", "where", "why", "how", "which", "whose"] | |
| stop_words = ["is", "are", "was", "were", "the", "a", "an", "and", "or", "but", "in", "on", "at", "to", "for", "of", "with", "by"] | |
| # Chuyển thành lowercase và tách từ | |
| words = question.lower().replace("?", "").split() | |
| # Loại bỏ question words và stop words | |
| filtered_words = [ | |
| word for word in words | |
| if word not in question_words and word not in stop_words and len(word) > 2 | |
| ] | |
| # Ghép lại thành query | |
| if filtered_words: | |
| return " ".join(filtered_words[:4]) # Lấy tối đa 4 từ | |
| else: | |
| # Fallback: lấy toàn bộ câu hỏi | |
| return question.replace("?", "").strip() | |
| def search_wikipedia_from_question(question: str, lang: str = "en") -> Dict[str, Any]: | |
| """ | |
| Tìm kiếm Wikipedia từ câu hỏi, tự động trích xuất query | |
| Args: | |
| question: Câu hỏi cần tìm kiếm | |
| lang: Ngôn ngữ Wikipedia | |
| Returns: | |
| Dict chứa thông tin Wikipedia | |
| """ | |
| # Trích xuất query từ câu hỏi | |
| search_query = extract_search_query_from_question(question) | |
| print(f"🔍 Wikipedia search query extracted: '{search_query}' from question: '{question[:50]}...'") | |
| # Tìm kiếm | |
| result = search_wikipedia(search_query, lang) | |
| result["original_question"] = question | |
| result["extracted_query"] = search_query | |
| return result | |
| def get_multiple_wikipedia_results(query: str, lang: str = "en", num_results: int = 3) -> Dict[str, Any]: | |
| """ | |
| Lấy nhiều kết quả Wikipedia | |
| """ | |
| try: | |
| wikipedia.set_lang(lang) | |
| search_results = wikipedia.search(query, results=num_results) | |
| results = [] | |
| for result_title in search_results: | |
| try: | |
| page = wikipedia.page(result_title) | |
| results.append({ | |
| "title": page.title, | |
| "summary": page.summary[:500] if page.summary else "No summary", | |
| "url": page.url | |
| }) | |
| except: | |
| continue | |
| return { | |
| "success": True, | |
| "query": query, | |
| "results": results, | |
| "total_found": len(results) | |
| } | |
| except Exception as e: | |
| return { | |
| "success": False, | |
| "error": f"Error getting multiple results: {str(e)}", | |
| "query": query | |
| } | |
| # Test function | |
| if __name__ == "__main__": | |
| # Test direct search | |
| result1 = search_wikipedia("Mercedes Sosa") | |
| print("Direct search result:", result1["title"] if result1["success"] else result1["error"]) | |
| # Test question-based search | |
| result2 = search_wikipedia_from_question("Who was Mercedes Sosa?") | |
| print("Question-based result:", result2["title"] if result2["success"] else result2["error"]) | |
| # Test multiple results | |
| result3 = get_multiple_wikipedia_results("Python programming", num_results=2) | |
| print("Multiple results:", len(result3["results"]) if result3["success"] else result3["error"]) |