目录
SearchManage
一个查询类,单线程查询,简单解析;Entities
,EntitiesSearch
基本类,Tools.py
提供功能函数接口;SearchManage
作为类EntitiesSearch
的子类Wikipedia
类,可实现wikipedia.suggest(query)
的多线程调用;值类型
,主值1
, ···);SparqlQuery
可进行自定义多线程SPARQL查询;BingQuery
多线程爬取模糊搜索结果Entities
继承类JsonAnalysis
,类Wikipedia
继承类EntitiesSearch
;<concurrent.futures.ThreadPoolExecutor>
代替基本线程事务,进一步提高性能;SpellCheck
进行多线程爬取拼写纠错结果;DbpediaLookUp
针对DBpedia知识图谱的多线程查询;https://www.ask.com/web
)搜索进行SpellCheck
,并提供相应解析函数AnalysisTools.ask_analysis
;classDiagram
Entities ..> AnalysisTools:依赖
Entities ..> Tools:依赖
EntitiesSearch ..> Tools:依赖
Entities --|>RequestAnalysis : 继承
EntitiesSearch ..o Entities: 集合
SearchManage --|> EntitiesSearch :继承
Wikipedia --|> EntitiesSearch:继承
SparqlQuery --|> EntitiesSearch:继承
BingQuery --|> EntitiesSearch:继承
SpellCheck --|> EntitiesSearch:继承
DbpediaLookUp --|> EntitiesSearch:继承
class Tools{
@ staticmethod
}
class AnalysisTools{
@ staticmethod
}
class RequestAnalysis{
- request
- analysis
- ready_
}
class Entities{
- index
- entities
- params
}
class EntitiesSearch{
+ entities_num
+ key
+ keys
+ m_num
+ Queue[Entities]: search_queue
+ Queue[Entites]: re_queue
+ List[Entities]: re_list
+ queryParams
- index_
}
class SearchManage{
- url
}
class Wikipedia{
}
class SparqlQuery{
- url_
- returnFormat
}
class BingQuery{
- url_
}
class SpellCheck{
- url_
}
class DbpediaLookUp{
}
from searchmanage import SearchManage
search_m1 = SearchManage(key='search', m_num=20)
search_m2 = SearchManage(key='ids', m_num=10)
"""
url_api(str): 查询网址,默认为"https://www.wikidata.org/w/api.php";
key(str): 查询action,'search' 或者 'ids';
m_num(int): 指定线程数目;
"""
def search_run(self, points: list, keys: Union[str, List[str]] = None,
timeout: float = 30.0, time_stop: float = 30.0, block_num: int = 10,
function_=None, args: tuple = None, **kwargs) -> dict
points(list)
:N维文本或ID列表;keys(Union[str, List[str]])
:解析关键词或其列表;timeout(float)
:每个线程查询的最大限制时间,到超过这个时间,会视为查询失败,默认为30.0
;time_stop(float)
:当某个线程查询失败时,会进行重新查询,该参数表示进行重新查询的间隔时间,默认为30.0
;block_num(int)
:查询失败进行重新查询的最大次数,当达到最大次数时,返回RunTimeError
异常,默认10
;function_(function)
:自定义解析函数;函数要求:第一个参数为待解析json
数据;当值为None
时,使用默认解析方法,默认为None
;args(tuple)
:自定义解析函数的除第一个参数的其他参数元组,默认为None
;**kwargs
:可以用来修改查询参数字典中的值,比如我们要修改返回值数量('limit')为20,可以直接将limit = 20
作为函数参数,修改其他查询参数同理;(dict)
labels,descriptions,aliases
以labels
为例子
labels
,labels/
,labels//
→labels下字典labels/xx
→xx
语言下的值claims
claims
,claims/
,claims//
→claims下字典claims/P
,claims/P/
,claims/P//
→属性ID列表claims/P/value
→所有属性下的值,值的格式为元组,(值类型
,主值1
, ···)claims/Pxx
,claims/Pxx/
,claims/Pxx//
→Pxx
下的字典claims/Pxx/value
→Pxx
的具体值,值的格式为元组,(值类型
,主值1
, ···)claims/Pxx/qualifiers-order
→Pxx
限定词顺序列表claims/Pxx/qualifiers
,claims/Pxx/qualifiers/
,claims/Pxx/qualifiers//
→Pxx
限定词下字典claims/Pxx/references
,claims/Pxx/references/
,claims/Pxx/references//
→Pxx
引用下字典sitelinks
sitelinks
,sitelinks/
,sitelinks//
→外部链接下的字典# key = 'search'
{
'search': # 文本,
'action': 'wbsearchentities',
'format': 'json',
'language': 'en',
'type': 'item',
'limit': 10,
'strictlanguage': None,
'continue': None,
'props': None
}
# key = 'ids'
{
'ids': # 实体ID,
'action': 'wbgetentities',
'format': 'json',
'languages': 'en',
'redirects': None,
'sites': None,
'title': None,
'props': None,
'languagefallback': None,
'normalize': None,
'sitefilter': None
}
wikipedia
-->pip install wikipedia
from searchmanage import Wikipedia
w1 = Wikipedia(m_num = 10)
"""
m_num(int):指定运行线程数量
"""
def search_run(self, points: list, time_stop: float = 30.0, block_num: int = 10,
function_=None, args: tuple = None, **kwargs) -> list
wikipedia
中相关函数,默认为函数wikipedia.suggest()
points(list)
:待查询的N维字符列表;time_stop(float)
:当某个线程查询失败时,会进行重新查询,该参数表示进行重新查询的间隔时间,默认30.0
;block_num(int)
:查询失败进行重新查询的最大次数,当达到最大次数时,返回RunTimeError
异常,默认10
;function(function)
:多线程调用wikipedia
中的相关函数,默认为函数wikipedia.suggest
,默认值为None
;args(tuple)
:调用相关函数的除第一个参数的其他参数元组,默认为None
;**kwargs
:用于功能拓展,暂无实际功能;(list)
:
SPARQLWrapper
--->pip install sparqlwrapper
from searchmanage import SparqlQuery
sql = SparqlQuery(m_num = 10, format_ = 'json')
"""
m_num(int):指定运行线程数量;
format_(str):查询返回格式,默认为'json';
url_(str):查询域名节点,默认为<SparqlQuery.URL_ = "https://query.wikidata.org/sparql">;
sparql_(str): 查询sparql格式语句,默认为<SparqlQuery.SPARQL_>;
"""
def search_run(self, points: list, timeout: float = 30.0, time_stop: float = 30.0,
block_num: int = 10, function_=None, args: tuple = None, **kwargs) -> dict
输入N维ID列表,返回结果字典;
参数说明
points(list)
:N维ID列表;timeout(float)
:每个线程查询的最大限制时间,到超过这个时间,会视为查询失败,默认为30.0
;time_stop(float)
:当某个线程查询失败时,会进行重新查询,该参数表示进行重新查询的间隔时间,默认为30.0
;block_num(int)
:查询失败进行重新查询的最大次数,当达到最大次数时,返回RunTimeError
异常,默认10
;function_(function)
:自定义解析函数;函数要求:第一个参数为待解析json
数据;当值为None
时,使用默认解析方法,默认为None
;args(tuple)
:自定义解析函数的除第一个参数的其他参数元组,默认为None
;**kwargs
:用于功能拓展,暂时无实际功能;返回(dict)
python
字符串格式化%s
标识;# 默认sparql_
SparqlQuery.SPARQL_ = """
SELECT ?item ?itemLabel
WHERE
{
?item wdt:P31 wd:%s.
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
from searchmanage import BingQuery
b = BingQuery(m_num = 10)
"""
url_(str): 模糊搜索域名节点,默认为<BingQuery.URL_ = "https://www.bing.com/search">;
m_num(int):指定运行线程数量;
"""
def search_run(self, points: list, timeout: float = 30.0, time_stop: float = 30.0,
block_num: int = 10, function_=None, args: tuple = None, **kwargs) -> list
url
网址points(list)
:N维字符列表;timeout(float)
:每个线程查询的最大限制时间,到超过这个时间,会视为查询失败,默认为30.0
;time_stop(float)
:当某个线程查询失败时,会进行重新查询,该参数表示进行重新查询的间隔时间,默认为30.0
;block_num(int)
:查询失败进行重新查询的最大次数,当达到最大次数时,返回RunTimeError
异常,默认10
;function_(function)
:自定义正则解析函数;函数要求:第一个参数为待正则解析字符串;当值为None
时,使用默认正则解析方法<REG_ = r"https://www.wikidata.org/wiki/Q\d+"
,默认值为None
;args(tuple)
:自定义解析函数的除第一个参数的其他参数元组,默认为None
;**kwargs
:用于功能拓展,暂时无实际功能;(list)
url
网址映射列表from searchmanage import SpellCheck
sc = SpellCheck(m_num = 10)
"""
url_(str): 爬取拼写结果的域名节点,默认为<BingQuery.URL_ = "https://www.bing.com/search">;
m_num(int):指定运行线程数量;
"""
def search_run(self, points: list, timeout: float = 30.0, time_stop: float = 30.0,
block_num: int = 10, function_=None, args: tuple = None, **kwargs) -> list
points(list)
:N维字符列表;timeout(float)
:每个线程查询的最大限制时间,到超过这个时间,会视为查询失败,默认为30.0
;time_stop(float)
:当某个线程查询失败时,会进行重新查询,该参数表示进行重新查询的间隔时间,默认为30.0
;block_num(int)
:查询失败进行重新查询的最大次数,当达到最大次数时,返回RunTimeError
异常,默认10
;function_(function)
:自定义解析函数;函数要求:第一个参数为requests
对象的text
属性;当值为None
时,获取网页搜索推荐纠错结果,默认值为None
;args(tuple)
:自定义解析函数的除第一个参数的其他参数元组,默认为None
;**kwargs
:用于功能拓展,暂时无实际功能;(list)
from searchmanage import DbpediaLookUp
db = DbpediaLookUp(m_num=10)
"""
key(str):
针对实体某部分进行搜索,可选"query","label", "comment"
or "category", 默认为全局搜索"query";
m_num(int):指定运行线程数量;
"""
def search_run(self, points: list, patten: str = "search", is_all: bool = False, timeout: float = 30.0,
time_stop: float = 30.0, block_num: int = 10, function_=None, args: tuple = (), **kwargs) -> dict
points(list)
:N维文本列表;patten(str)
:查询模式,可选'search'
或'prefix'
,其中'prefix'
为前缀搜索,对应URL为"https://lookup.dbpedia.org/api/prefix"
,默认为普通搜索为'search'
,对应URL为"https://lookup.dbpedia.org/api/search"
;is_all(bool)
:是否返回所有解析结果,解析键值见查询参数字典与解析键值,默认为False
,返回解析键值的前四个;timeout(float)
:每个线程查询的最大限制时间,到超过这个时间,会视为查询失败,默认为30.0
;time_stop(float)
:当某个线程查询失败时,会进行重新查询,该参数表示进行重新查询的间隔时间,默认为30.0
;block_num(int)
:查询失败进行重新查询的最大次数,当达到最大次数时,返回RunTimeError
异常,默认10
;function_(function)
:自定义解析函数;函数要求:第一个参数为待解析json
数据;当值为None
时,使用默认解析方法,默认为None
;args(tuple)
:自定义解析函数的除第一个参数的其他参数元组,默认为None
;**kwargs
:可以用来修改查询参数字典中的值,比如我们要修改返回值数量('maxResults'
)为20,可以直接将maxResults = 20
作为函数参数,修改其他查询参数同理,查询参数见查询参数字典与解析键值;(dict)
# 查询字典格式
PARAM_DBPEDIA_QUERY = {
"query": None,
"label": None,
"comment": None,
"category": None,
"typeName": None,
"maxResults": 10,
"format": "json",
"minRelevance": None
}
"""Parameters using in Dbpedia look up."""
# 解析键值列表,元组第一位为1表明结果为单数,为2说明结果为复数,以列表形式存在
DBPEDIA_KEYS = [(1, 'label'), (1, 'resource'), (2, 'typeName'), (2, 'type'), (1, 'score'),
(1, 'refCount'), (1, 'comment'), (2, 'redirectlabel'), (2, 'category')]
"""Analysis keys using in Dbpedia look up json data."""
# Wikidata Value-type
value_type = {
'wikibase-entityid': [1, 'id', 'entity-type', 'numeric-id'],
'globecoordinate': [2, 'latitude', 'longitude', 'precision', 'globe'],
'time': [1, 'time', 'precision', 'before', 'after', 'timezone'],
'string': None,
'monolingualtext': [2, 'text', 'language'],
'quantity': [1, 'amount', 'lowerBound', 'upperBound']
}
# Wikidata Data-type
data_type = {
'commonsMedia': 'string',
'globe-coordinate': 'globecoordinate',
'wikibase-item': 'wikibase-entityid',
'wikibase-property': 'wikibase-entityid',
'string': 'string',
'monolingualtext': 'monolingualtext',
'external-id': 'string',
'quantity': 'quantity',
'time': 'time',
'url': 'string',
'math': 'string',
'geo-shape': 'string',
'musical-notation': 'string',
'tabular-data': 'string',
'wikibase-lexeme': 'wikibase-entityid',
'wikibase-form': 'wikibase-entityid',
'wikibase-sense': 'wikibase-entityid'
}
from searchmanage import SearchManage, Wikipedia, SparqlQuery, BingQuery, Tools, SpellCheck, DbpediaLookUp
if __name__ == "__main__":
# Read data from csv
d, d_t = Tools.read_csv("data\\1C9LFOKN.csv", is_header=True, out_data_t=True, is_print=True)
print(len(d_t))
# Example data
p1 = [['SEU', 'Chain', 'English'], ['computer', 'games', 'computer game'], ['graph', 'wikipedia'],
['SEU', 'Chain', 'English'], ['computer', 'games', 'computer game'], ['graph', 'wikipedia'],
['SEU', 'Chain', 'English'], ['computer', 'games', 'computer game'], ['graph', 'wikipedia']]
p2 = ["Q3918", "Q355304", "Q106589826", "Q3918", "Q355304", "Q106589826", "Q3918", "Q355304",
"Q106589826", "Q3918", "Q355304", "Q106589826"]
# SearchManage: key = 'search'
s1 = SearchManage(key='search', m_num=10)
r1 = s1.search_run(p1, keys='all', limit=20)
# print(r1)
# SearchManage: key = 'ids'
s2 = SearchManage(key='ids', m_num=20)
r2 = s2.search_run(r1['id'], keys=['labels/en', 'claims/P//', 'claims/P/value'])
# print(r2)
# Wikipedia: <wikipedia.suggest()>
w1 = Wikipedia(m_num=10)
r3 = w1.search_run(p1)
# print(r3)
# SparqlQuery: <sparql_ = SparqlQuery.SPARQL_>
sql1 = SparqlQuery(m_num=12, format_='json')
r4 = sql1.search_run(p2[0:3], timeout=60)
# print(r4)
# BingQuery: <url_ = BingQuery.URL_>
b1 = BingQuery(m_num=24)
r5 = b1.search_run(p1)
print(r5)
p3 = [["elgant palm trre garden", "elgant palm trre", "the sotheast univrsity"],
["elgant", "elgant trre", "the sotheast univrssity"],
["elgat palm trre garden", "elgat palm trre", "the sothaast univrsity"]]
# SpellCheck <url_ = "https://www.bing.com/search">
sc = SpellCheck(m_num=12)
r6 = sc.search_run(p3)
print(r6)
# DbpediaLookUp->"resource"
db = DbpediaLookUp(m_num=10)
r7 = db.search_run(p1, patten='search', is_all=False, maxResults=20)
print(r7['resource'])
# Dbpedia SPARQL
end_point = "https://dbpedia.org/sparql"
sparql_ = """
SELECT?Type?Rtype
WHERE{
<%s> dbp:type ?Type;
rdf:type ?Rtype.}
"""
sql2 = SparqlQuery(m_num=200, format_='json', url_=end_point, sparql_=sparql_)
r8 = sql2.search_run(r7['resource'], timeout=10000)
print(r8['Type'])