栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python之由公司名推算出公司官网(余弦相似度)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python之由公司名推算出公司官网(余弦相似度)

1.问题

对展会数据分类后,我的新任务是如何通过公司名、公司地址、国家等海关数据推断出该公司的官网网站(若官网不存在则不考虑)
以下数据仅供参考:

公司名国家地址
JPW INDUSTRIES INC
427 NEW SANFORD RD LAVERGNE TN 37086 US
Fujian Xishi Co., LtdCN, CHINA
BusinessPartner Co.,ltd

BENKAI Co.,Ltd

GOLD INC
18245 E 40TH AVE AURORA CO 80011 US

需要得到结果:

公司名官方网站
JPW INDUSTRIES INChttp://http://www.jpwindustries.com/
Fujian Xishi Co., Ltdhttp://www.xishigroup.com/
BusinessPartner Co.,ltdhttp://www.traderthailand.com/
BENKAI Co.,Ltdhttp://www.benkaico.com
GOLD INChttps://goldbuginc.com/
2.解决

由数据可看出,公司名是绝对存在的,故解决思路是从公司名出发,而不怎么全面的国家以及地址信息则用来提高准确度。
大体思路是这样的,若公司官网存在,那么通过搜索引擎定会被检索到,搜索引擎自然首选google,所以可以先通过获取谷歌搜索的结果,然后分析获取的结果,从而得出最可能是该公司网站的url。
初步搜索一下,看看各种情况:
第一种情况,检索即可很直观地得出结果

 JPW INDUSTRIES INC  
第二种情况,检索不能直观地得出结果,但官网确实存在(第二检索个结果)
     Fujian Xishi Co., Ltd
第三种情况,输入公司名+公司地址和只输入公司名得出的结果不一样


 GOLD INC

对于第三种情况,可以看出输入公司名+公司地址得出的结果是绝对正确的。
观察第三种情况,当输入公司名+公司地址时,返回结果的右侧会出现公司的详细信息,经过验证,若出现这种情况,则其website对应的url绝对正确。
故代码的第一步骤可以首先检索公司名+公司地址,观察website元素是否存在,若存在,返回公司官网,否则,对公司名进行检索。
代码:

def searchWeb(query, tld='com', lang='en', tbs='0', num=10, safe='off', tpe='', user_agent=None):     query = quote_plus(query)     get_page(url_home % vars())     url = url_search_num % vars()     # Request the Google Search results page.     html = get_page(url)     try:         href = re.findall(r'DirectionsWebsite', str(html))[0]         link = filter_result(href)         return link     except:         pass     return None

     直接返回公司官网

能直接获取公司官网毕竟是少数,大多数据还是要通过一步步计算得出,主要经过以下步骤:
获取搜索引擎检索结果提取url->初步排除某些url->余弦相似度计算最可能的结果

2.1.获取搜索引擎检索结果提取url

对于谷歌搜索,我使用了MarioVilas的项目google,毕竟在国内,为了以防万一我也写了yahoo搜索,代码如下:

#!/usr/bin/env # -*-coding:utf-8-*- # script: yahooSearch.py __author__ = 'howie' import sys import time if sys.version_info[0] > 2:     from urllib.request import Request, urlopen     from urllib.parse import quote_plus, urlparse else:     from urllib import quote_plus     from urllib2 import Request, urlopen     from urlparse import urlparse, parse_qs try:     from bs4 import BeautifulSoup     is_bs4 = True except importError:     from BeautifulSoup import BeautifulSoup     is_bs4 = False url_search = "https://search.yahoo.com/search?p=%(query)s&b=%(start)s&pz=%(num)s" headers = {     'accept-encoding': 'gzip, deflate, sdch, br',     'accept-language': 'zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4',     'upgrade-insecure-requests': '1',     'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,**;q=0.8",                 "Accept-Encoding": "gzip, deflate, sdch",                 "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4",                 "Cache-Control": "max-age=0",                 "Proxy-Connection": "keep-alive",                 "Upgrade-Insecure-Requests": "1",                 "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36",             }             try:                 data = requests.get(domain, headers=headers).text                 soup = BeautifulSoup(data, 'html.parser')                 title = soup.title.get_text()                 title = re.sub(r'rn', '', title.strip())                 titleToken = nltk.word_tokenize(title.lower(), language='english')                 domainData[domain] = titleToken             except:                 pass         return domainData     def get_counts(self, allDomain):         """         返回网站列表各个域名数量         :param allDomain: 网站列表         :return: 网站:数量         """         counts = defaultdict(int)         for eachDomain in allDomain:             counts[eachDomain] += 1         return counts if __name__ == '__main__':     # allQuery = ["National Sales Company, Inc.", "Decor Music Inc.","Fujian Xishi Co., Ltd","Kiho USA Inc.","BusinessPartner Co.,ltd","BENKAI Co.,Ltd"]     # GOLD INC 18245 E 40TH AVE AURORA CO 80011 US     allQuery = ["ALZARKI INTERNATIONAL"]     website = Website(engine='google')     for query in allQuery:         time.sleep(2)         website = website.get_web(query=query)         print(website)


计算余弦相似度代码

# -*-coding:utf-8-*- # script: CosineSimilarity.py __author__ = 'howie' import numpy as np from functools import reduce from math import sqrt class CosineSimilarity(object):     """     余弦相似性计算相似度     """     def __init__(self, initQuery, domainData):         self.title = initQuery         self.data = domainData     def create_vector(self):         """         创建单词向量         :return: wordVector = {} 目标标题以及各个网站标题对应的单词向量         """         wordVector = {}         for web, value in self.data.items():             wordVector[web] = []             titleVector, valueVector = [], []             allWord = set(self.title + value)             for eachWord in allWord:                 titleNum = self.title.count(eachWord)                 valueNum = value.count(eachWord)                 titleVector.append(titleNum)                 valueVector.append(valueNum)             wordVector[web].append(titleVector)             wordVector[web].append(valueVector)         return wordVector     def calculate(self, wordVector):         """         计算余弦相似度         :param wordVector: wordVector = {} 目标标题以及各个网站标题对应的单词向量         :return: 返回各个网站相似度值         """         resultDic = {}         for web, value in wordVector.items():             valueArr = np.array(value)             # 余弦相似性             squares = []             numerator = reduce(lambda x, y: x + y, valueArr[0] * valueArr[1])             square_title, square_data = 0.0, 0.0             for num in range(len(valueArr[0])):                 square_title += pow(valueArr[0][num], 2)                 square_data += pow(valueArr[1][num], 2)             squares.append(sqrt(square_title))             squares.append(sqrt(square_data))             sum_of_squares = reduce(lambda x, y: x * y, squares)             resultDic[web] = numerator / sum_of_squares         return resultDic     def get_website(self, resultDic):         """         获取最可能是官网的网站         :param resultDic: 各个网站相似度值         :return: 最可能的网站 也可能为空         """         website = ''         largest = max(zip(resultDic.values(), resultDic.keys()))         if largest[0]:             website = largest[1]         # 当相似度为0         else:             websites = [key for key, values in resultDic.items() if values == 0.0]             for eachWebsite in websites:                 keyword = ','.join(self.data[eachWebsite]).lower()                 if 'home' in keyword or "welcome" in keyword:                     website = eachWebsite         return website


3.总结

至此,若有更好的解决方案,欢迎赐教,谢谢。



作者:howie6879
链接:https://www.jianshu.com/p/d1cf6c6df6bb


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/223017.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号