文章目錄
- 地區地址提取
- 完成的處理代碼
在專利合作申請表中,有多家公司合作申請。在專利權人地址中, 有多個公司的地址信息。故想利用這里多個地址。想用這里的地址來代表區域之間的專利合作情況代表區域之間的協同、協作情況。
下圖是專利合作表的一部分:
最終的結果:
假設在一個專利的地址中,有1家成都公司,1家武漢公司,2家北京公司:
成都市,武漢市,北京市,北京市
首先計算這些區域兩兩合作的關系:
import pandas as pd
from itertools import permutations
from collections import Counter
d = Counter(list(permutations(["成都市", "武漢市", "北京市", "北京市"], r=2)))
d
輸出:
Counter({('成都市', '北京市'): 2,('武漢市', '北京市'): 2,('北京市', '成都市'): 2,('北京市', '武漢市'): 2,('北京市', '北京市'): 2,('成都市', '武漢市'): 1,('武漢市', '成都市'): 1})
rows = []
cols = []
values = []for k, v in d.items():row, col = krows.append(row)cols.append(col)values.append(v)demo_matrix = pd.DataFrame({"row": rows,"col": cols,"value": values,}
)
demo_df = demo_matrix.pivot(index="row", columns="col", values="value")
demo_df.fillna(0, inplace=True)
demo_df
輸出:
上述只是使用了一個專利合作地址構建的合作矩陣。特意選取了其中有多個同一個地區的例子進行展示。如上述例子中,同一個專利中有兩家北京的企業,那么 北京-北京 的權重是2。代表了這個區域內部的合作關系。
地區地址提取
從專利的地址中,提取出省市信息。
最開始想的是寫一個正則表達式,提取省市區,但是后面發現這不可行,因為會有自治區、省道,這些特殊名稱的干擾。
為了達到比較高的準確率,我收集了全國66萬個行政區劃代碼表,在其中逐個與專利的地址逐個對應。通過這種方式可以保證比較高的準確率。
由于本次使用省與市的地址,使用下述代碼篩選出只有省和市的數據,篩選代碼如下:
address_df = pd.read_csv("66萬個全國各級行政區劃代碼表.csv")
def is_str(item):return isinstance(item, str) and len(item) > 0
idxs = ((address_df["1"].apply(is_str))& (address_df["2"].apply(is_str))& (~address_df["3"].apply(is_str))
)
address_filter_df = address_df[idxs]
address_filter_df = address_filter_df.drop(columns=["3", "4", "5"])
address_filter_df = address_filter_df.rename(columns={"1": "prov", "2": "city"})
下圖展示全國342個市級單位:
address_filter_df.head(), address_filter_df.shape
完成的處理代碼
處理整個表格的時候,把所有專利的區域合作次數加起來的代碼如下:
加載專利合作表:
def split_address(text):if not isinstance(text, str):return []text = re.split(";", text)text = [item.strip() for item in text if len(item.strip()) > 0]return textaddress1 = "當前專利權人地址"
address2 = "工商注冊地址"df = pd.read_excel("20250212合作申請.xlsx")
下述代碼實現了,從專利地址中抽取出省市信息:
def extract_address(df, address) -> Dict:# 首先是直轄市判斷Four_Municipality = ["北京市", "上海市", "天津市", "重慶市"]for item in Four_Municipality:if item in address:return {"prov": item, "city": ""}for _, row in df.iterrows():prov = row["prov"]city = row["city"]if prov in address and city in address:return {"prov": prov, "city": city}print(f"error not find prov and city, {address}")return None
利用抽取出的省、市,構建矩陣:
def build_marix(attr_name):addresses = df[address1].map(split_address).tolist()ans = {}for row_address in addresses:row_address_parse = []for address in row_address:address_parse = extract_address(address_filter_df, address)if address_parse is None:continuerow_address_parse.append(address_parse)row_address_parse = [tmp["prov"] + " " + tmp["city"] for tmp in row_address_parse]row_address_cnt = Counter(list(permutations(row_address_parse, r=2)))for k, v in row_address_cnt.items():if k not in ans.keys():ans[k] = 0ans[k] += vrows = []cols = []values = []for k, v in ans.items():row, col = krows.append(row)cols.append(col)values.append(v)df_matrix = pd.DataFrame({"row": rows,"col": cols,"value": values,})pivot_df = df_matrix.pivot(index="row", columns="col", values="value")pivot_df.fillna(0, inplace=True)pivot_df.to_excel(f"{attr_name}.xlsx")
項目文件夾的內容如下: