python勾股定理中三个数的关系是、找出三十以内的_从勾股定理到余弦相似度-程序员的数学基础...
大部分程序員由于理工科的背景,有一些高數(shù)、線性代數(shù)、概率論與數(shù)理統(tǒng)計(jì)的數(shù)學(xué)基礎(chǔ)。所以當(dāng)機(jī)器學(xué)習(xí)的熱潮來臨的時(shí)候,都躍躍欲試,對(duì)機(jī)器學(xué)習(xí)的算法以及背后的數(shù)學(xué)思想有比較強(qiáng)烈的探索欲望。
本文的作者就是其中的一位。然而實(shí)踐的過程中,又發(fā)現(xiàn)數(shù)學(xué)知識(shí)的理解深度有些欠缺,在理解一些公式背后的意義時(shí),有些力不從心的感覺。因此梳理了一些數(shù)學(xué)上的知識(shí)盲點(diǎn),理順自己的知識(shí)脈絡(luò),順便分享給有需要的人。
本文主要講解余弦相似度的相關(guān)知識(shí)點(diǎn)。相似度計(jì)算用途相當(dāng)廣泛,是搜索引擎、推薦引擎、分類聚類等業(yè)務(wù)場(chǎng)景的核心點(diǎn)。為了理解清楚余弦相似度的來龍去脈,我將會(huì)從最簡(jiǎn)單的初中數(shù)學(xué)入手,逐步推導(dǎo)出余弦公式。然后基于余弦公式串講一些實(shí)踐的例子。
一、業(yè)務(wù)背景
通常我們?nèi)粘i_發(fā)中,可能會(huì)遇到如下的業(yè)務(wù)場(chǎng)景。
精準(zhǔn)營(yíng)銷,圖像處理,搜索引擎 這三個(gè)看似風(fēng)馬牛不相及的業(yè)務(wù)場(chǎng)景,其實(shí)面臨一個(gè)共同的問題就是相似度的計(jì)算。例如精準(zhǔn)營(yíng)銷中的人群擴(kuò)量涉及用戶相似度的計(jì)算;圖像分類問題涉及圖像相似度的計(jì)算,搜索引擎涉及查詢?cè)~和文檔的相似度計(jì)算。相似度計(jì)算中,可能由于《數(shù)學(xué)之美》的影響,大家最熟悉的應(yīng)該是余弦相似度。那么余弦相似度是怎么推導(dǎo)出來的呢?
二、數(shù)學(xué)基礎(chǔ)
理解余弦相似度,要從理解金字塔開始。我們知道金字塔的底座是一個(gè)巨大的正方形。例如吉薩大金字塔的邊長(zhǎng)超過230m。構(gòu)造這樣一個(gè)巨大的正方形,如何保證構(gòu)造出來的圖形不走樣呢?比如如何確保構(gòu)造的結(jié)果不是菱形或者梯形。
1、勾股定理
要保證構(gòu)造出來的四邊形是正方形,需要保證兩個(gè)點(diǎn):其一是四邊形的邊長(zhǎng)相等;其二是四邊形的角是直角。四邊形的邊長(zhǎng)相等很容易解決,在工程實(shí)踐中,取一根定長(zhǎng)的繩子作為邊長(zhǎng)就可以了。如何保障直角呢?古人是利用勾股定理解決的,更切確地說是勾股定理的逆定理。
構(gòu)造一個(gè)三角形,保證三角形的三邊長(zhǎng)分別是3,4,5。那么邊長(zhǎng)為5的邊對(duì)應(yīng)的角為直角。中國(guó)有個(gè)成語“無規(guī)矩不成方圓”,其中的矩,就是直角的尺。
勾股證明是初中數(shù)學(xué)的知識(shí),理解很容易。證明也很簡(jiǎn)單,據(jù)說愛因斯坦11歲就發(fā)現(xiàn)了一種證明方法。勾股定理的證明方法據(jù)統(tǒng)計(jì)有超過400種, 感興趣的同學(xué)可以自行了解。另勾股定理也是費(fèi)馬大定理的靈感來源,費(fèi)馬大定理困擾了世間智者300多年,也誕生了很多的逸聞趣事,這里不贅述。
2、余弦定理
勾股定理存在著一個(gè)很大的限制,就是要求三角形必須是直角三角形。那么對(duì)于普通的三角形,三個(gè)邊存在什么樣的關(guān)系呢?這就引出了余弦定理。
余弦定理指出了任意三角形三邊的關(guān)系,也是初中就可以理解的數(shù)學(xué)知識(shí),證明也比較簡(jiǎn)單,這里就略過了。
其實(shí)對(duì)于三角形,理解了勾股定理和余弦定理。就已經(jīng)掌握了三角形的很多特性和秘密了。比如根據(jù)等邊三角形,可以推導(dǎo)出cos(60)=1/2。但是如果想理解幾何更多的秘密,就需要進(jìn)入解析幾何的世界。這個(gè)數(shù)學(xué)知識(shí)也不算很高深,高中數(shù)學(xué)知識(shí)。
這里我們理解最簡(jiǎn)單就可以了,那就是三角形在直角坐標(biāo)系中的表示。所謂“橫看成嶺側(cè)成峰,遠(yuǎn)近高低各不同”,我們可以理解為三角形的另一種表現(xiàn)形式。
比如我們可以用a,b,c三個(gè)邊描述一個(gè)三角形;在平面直角坐標(biāo)系中,我們可以用兩個(gè)向量表示一個(gè)三角形。
3、余弦相似度
當(dāng)我們引入了直角坐標(biāo)系后,三角形的表示就進(jìn)入了更靈活、更強(qiáng)大和更抽象的境界了。幾何圖形可以用代數(shù)的方法來計(jì)算,代數(shù)可以用幾何圖形形象化表示,大大降低理解難度。比如我們用一個(gè)向量來表示三角形的一個(gè)邊,就可以從二維空間直接擴(kuò)展到高維空間。
這里,向量的定義跟點(diǎn)是一樣的;向量的乘法也只是各個(gè)維度值相乘累加;向量的長(zhǎng)度看似是新的東西,其實(shí)繞了一個(gè)圈,本質(zhì)上還是勾股定理,只是勾股定理從二維空間擴(kuò)展到了N維空間而已。而且向量長(zhǎng)度又是兩個(gè)相同向量乘法的特例。數(shù)學(xué)的嚴(yán)謹(jǐn)性在這里體現(xiàn)得淋漓盡致。
結(jié)合勾股定理,余弦定理,直角坐標(biāo)系,向量。我們就可以很自然地推導(dǎo)出余弦公式了,這里唯一的理解難點(diǎn)就是勾股定理和余弦定理都是用向量來表示。
得到了余弦公式后,我們?cè)撛趺蠢斫庥嘞夜侥?#xff1f;
極端情況下,兩個(gè)向量重合了,就代表兩個(gè)向量完全相似。然而這里的完全相似,其實(shí)是指向量的方向。向量有方向和長(zhǎng)度兩個(gè)要素,這里只使用方向這一個(gè)要素,在實(shí)踐中就埋下了隱患。但是畢竟一個(gè)數(shù)學(xué)模型建立起來了。我們可以用這個(gè)模型解決一些實(shí)際中的問題了。
所謂數(shù)學(xué)模型,有可能并不需要高深的數(shù)學(xué)知識(shí),對(duì)外的表現(xiàn)也僅僅是一個(gè)數(shù)學(xué)公式。比如余弦定理這個(gè)數(shù)學(xué)模型,高中數(shù)學(xué)知識(shí)就足夠理解了。而且關(guān)于模型,有這樣一個(gè)很有意思的論述:“所有的數(shù)學(xué)模型都是錯(cuò)的,但是有些是有用的”。這里我們更多關(guān)注其有用的一面。
理解了向量夾角,那么該怎么理解向量呢?它僅僅是三角形的一條邊嗎?
人生有幾何,萬物皆向量。向量在數(shù)學(xué)上是簡(jiǎn)單的抽象,這個(gè)抽象我們可以用太多實(shí)際的場(chǎng)景來使它落地。比如用向量來指代用戶標(biāo)簽,用向量來指代顏色,用向量來指代搜索引擎的邏輯...
三、業(yè)務(wù)實(shí)踐
理解了余弦定理,理解了數(shù)學(xué)建模的方式。接下來我們就可以做一些有意思的事情了。比如前面提到的三個(gè)業(yè)務(wù)場(chǎng)景,我們可以看看如何用余弦相似度來解決。當(dāng)然實(shí)際問題肯定遠(yuǎn)遠(yuǎn)要復(fù)雜得多,但是核心的思想都是類似的。
案例1:精準(zhǔn)營(yíng)銷
假設(shè)一次運(yùn)營(yíng)計(jì)劃,比如我們?nèi)Χ?w的用戶,如何擴(kuò)展到10萬人呢?
利用余弦相似度,我們這里其實(shí)最核心的問題就是:如何將用戶向量化?
將每個(gè)用戶視為一個(gè)向量,用戶的每個(gè)標(biāo)簽值視為向量的一個(gè)維度。當(dāng)然這里實(shí)際工程中還有特征歸一化,特征加權(quán)等細(xì)節(jié)。我們這里僅作為演示,不陷入到細(xì)節(jié)中。
對(duì)于人群,我們可以取人群中,所有用戶維度值的平均值,作為人群向量。這樣處理后,就可以使用余弦公式計(jì)算用戶的相似度了。
我們通過計(jì)算大盤用戶中每個(gè)用戶跟圈定人群的相似度,取topN即可實(shí)現(xiàn)人群的擴(kuò)量。
直接“show me the code”吧!
# -*- coding: utf-8 -*-
import numpy as np
import numpy.linalg as linalg
def cos_similarity(v1, v2):
num = float(np.dot(v1.T, v2)) # 若為行向量則 A.T * B
denom = linalg.norm(v1) * linalg.norm(v2)
if denom > 0:
cos = num / denom # 余弦值
sim = 0.5 + 0.5 * cos # 歸一化
return sim
return 0
if __name__ == ‘__main__‘:
u_tag_list = [
["女", "26", "是", "白領(lǐng)"],
["女", "35", "是", "白領(lǐng)"],
["女", "30", "是", "白領(lǐng)"],
["女", "22", "是", "白領(lǐng)"],
["女", "20", "是", "白領(lǐng)"]
]
new_user = ["女", "20", "是", "白領(lǐng)"]
u_tag_vector = np.array([
[1, 26, 1, 1],
[1, 35, 1, 1],
[1, 30, 1, 1],
[1, 22, 1, 1],
[1, 20, 1, 1]
])
c1 = u_tag_vector[0]
c1 += u_tag_vector[1]
c1 += u_tag_vector[2]
c1 += u_tag_vector[3]
c1 += u_tag_vector[4]
c1 = c1/5
new_user_v1 = np.array([1, 36, 1, 1])
new_user_v2 = np.array([-1, 20, 0, 1])
print("vector-u1: ", list(map(lambda x: ‘%.2f‘ % x, new_user_v1.tolist()[0:10])))
print("vector-u2: ", list(map(lambda x: ‘%.2f‘ % x, new_user_v2.tolist()[0:10])))
print("vector-c1: ", list(map(lambda x: ‘%.2f‘ % x, c1.tolist()[0:10])))
print("sim: ", cos_similarity(c1, new_user_v1))
print("sim: ", cos_similarity(c1, new_user_v2))
案例2:圖像分類
有兩類圖片,美食和萌寵。對(duì)于新的圖片,如何自動(dòng)分類呢?
這里我們的核心問題是:圖片如何向量化?
圖片由像素構(gòu)成,每個(gè)像素有RGB三個(gè)通道。由于像素粒度太細(xì),將圖片分割成大小相對(duì)的格子,每個(gè)格子定義3個(gè)維度,維度值取格子內(nèi)像素均值。
下面也是給出樣例代碼:
# -*- coding: utf-8 -*-
import numpy as np
import numpy.linalg as linalg
import cv2
def cos_similarity(v1, v2):
num = float(np.dot(v1.T, v2)) # 若為行向量則 A.T * B
denom = linalg.norm(v1) * linalg.norm(v2)
if denom > 0:
cos = num / denom # 余弦值
sim = 0.5 + 0.5 * cos # 歸一化
return sim
return 0
def build_image_vector(im):
"""
:param im:
:return:
"""
im_vector = []
im2 = cv2.resize(im, (500, 300))
w = im2.shape[1]
h = im2.shape[0]
h_step = 30
w_step = 50
for i in range(0, w, w_step):
for j in range(0, h, h_step):
each = im2[j:j+h_step, i:i+w_step]
b, g, r = each[:, :, 0], each[:, :, 1], each[:, :, 2]
im_vector.append(np.mean(b))
im_vector.append(np.mean(g))
im_vector.append(np.mean(r))
return np.array(im_vector)
def show(imm):
imm2 = cv2.resize(imm, (510, 300))
print(imm2.shape)
imm3 = imm2[0:50, 0:30]
cv2.imshow("aa", imm3)
cv2.waitKey()
cv2.destroyAllWindows()
imm4 = imm2[51:100, 0:30]
cv2.imshow("bb", imm4)
cv2.waitKey()
cv2.destroyAllWindows()
imm2.fill(0)
def build_image_collection_vector(p_name):
path = "D:\python-workspace\cos-similarity\images\"
c1_vector = np.zeros(300)
for pic in p_name:
imm = cv2.imread(path + pic)
each_v = build_image_vector(imm)
a=list(map(lambda x:‘%.2f‘ % x, each_v.tolist()[0:10]))
print("p1: ", a)
c1_vector += each_v
return c1_vector/len(p_name)
if __name__ == ‘__main__‘:
v1 = build_image_collection_vector(["food1.jpg", "food2.jpg", "food3.jpg"])
v2 = build_image_collection_vector(["pet1.jpg", "pet2.jpg", "pet3.jpg"])
im = cv2.imread("D:\python-workspace\cos-similarity\images\pet4.jpg")
v3 = build_image_vector(im)
print("v1,v3:", cos_similarity(v1,v3))
print("v2,v3:", cos_similarity(v2,v3))
a = list(map(lambda x: ‘%.2f‘ % x, v3.tolist()[0:10]))
print("p1: ", a)
im2 = cv2.imread("D:\python-workspace\cos-similarity\images\food4.jpg")
v4 = build_image_vector(im2)
print("v1,v4:", cos_similarity(v1, v4))
print("v2,v4:", cos_similarity(v2, v4))
至于代碼中用到的圖片,用戶可以自行收集即可。筆者也是直接從搜索引擎中截取的。程序計(jì)算的結(jié)果也是很直觀的,V2(萌寵)跟圖像D1的相似度為0.956626,比V1(美食)跟圖像D1的相似度0.942010更高,所以結(jié)果也是很明確的。
案例3:文本檢索
假設(shè)有三個(gè)文檔,描述的內(nèi)容如下。一個(gè)是疫情背景下,蘋果公司的資訊,另外兩個(gè)是水果相關(guān)的信息。輸入搜索詞“蘋果是我最喜歡的水果”,? 該怎么找到最相關(guān)的文檔?
這里的核心問題也是文本和搜索詞如何向量化?
這里其實(shí)可以把搜索詞也視為文檔,這樣問題就簡(jiǎn)化成:文檔如何向量化?
出于簡(jiǎn)化問題的角度,我們可以給出最簡(jiǎn)單的答案:文檔由詞組成,每個(gè)詞作為一個(gè)維度;文檔中詞出現(xiàn)的頻率作為維度值。
當(dāng)然,實(shí)際操作時(shí)我們維度值的計(jì)算會(huì)更復(fù)雜一些,比如用TF-IDF。這里用詞頻(TF)并不影響演示效果,所以我們從簡(jiǎn)。
將文本向量化后,剩下也是依樣畫葫蘆,用余弦公式計(jì)算相似度, 流程如下:
最后,給出代碼:
# -*- coding: utf-8 -*-
import numpy as np
import numpy.linalg as linalg
import jieba
def cos_similarity(v1, v2):
num = float(np.dot(v1.T, v2)) # 若為行向量則 A.T * B
denom = linalg.norm(v1) * linalg.norm(v2)
if denom > 0:
cos = num / denom # 余弦值
sim = 0.5 + 0.5 * cos # 歸一化
return sim
return 0
def build_doc_tf_vector(doc_list):
num = 0
doc_seg_list = []
word_dic = {}
for d in doc_list:
seg_list = jieba.cut(d, cut_all=False)
seg_filterd = filter(lambda x: len(x)>1, seg_list)
w_list = []
for w in seg_filterd:
w_list.append(w)
if w not in word_dic:
word_dic[w] = num
num+=1
doc_seg_list.append(w_list)
print(word_dic)
doc_vec = []
for d in doc_seg_list:
vi = [0] * len(word_dic)
for w in d:
vi[word_dic[w]] += 1
doc_vec.append(np.array(vi))
print(vi[0:40])
return doc_vec, word_dic
def build_query_tf_vector(query, word_dic):
seg_list = jieba.cut(query, cut_all=False)
vi = [0] * len(word_dic)
for w in seg_list:
if w in word_dic:
vi[word_dic[w]] += 1
return vi
if __name__ == ‘__main__‘:
doc_list = [
"""
受全球疫情影響,3月蘋果宣布關(guān)閉除大中華區(qū)之外數(shù)百家全球門店,其龐大的供應(yīng)鏈體系也受到?jīng)_擊,
盡管目前富士康等代工廠已經(jīng)開足馬力恢復(fù)生產(chǎn),但相比之前產(chǎn)能依然受限。中國(guó)是iPhone生產(chǎn)的大本營(yíng),
為了轉(zhuǎn)移風(fēng)險(xiǎn),iPhone零部件能否實(shí)現(xiàn)印度制造?實(shí)現(xiàn)印度生產(chǎn)的最大難點(diǎn)就是,相對(duì)中國(guó),印度制造業(yè)仍然欠發(fā)達(dá)
""",
"""
蘋果是一種低熱量的水果,每100克產(chǎn)生大約60千卡左右的熱量。蘋果中營(yíng)養(yǎng)成分可溶性大,容易被人體吸收,故有“活水”之稱。
它有利于溶解硫元素,使皮膚潤(rùn)滑柔嫩。
""",
"""
在生活當(dāng)中,香蕉是一種很常見的水果,一年四季都能吃得著,因其肉質(zhì)香甜軟糯,且營(yíng)養(yǎng)價(jià)值高,所以深受老百姓的喜愛。
那么香蕉有什么具體的功效,你了解嗎?
"""
]
query = "蘋果是我喜歡的水果"
doc_vector, word_dic = build_doc_tf_vector(doc_list)
query_vector = build_query_tf_vector(query, word_dic)
print(query_vector[0:35])
for i, doc in enumerate(doc_vector):
si = cos_similarity(doc, query_vector)
print("doc", i, ":", si)
我們檢索排序的結(jié)果如下:
文檔D2是相似度最高的,符合我們的預(yù)期。這里我們用最簡(jiǎn)單的方法,實(shí)現(xiàn)了一個(gè)搜索打分排序的樣例,雖然它并沒有實(shí)用價(jià)值,但是演示出了搜索引擎的工作原理。
四、超越余弦
前面通過簡(jiǎn)單的3個(gè)案例,演示了余弦定理的用法,但是沒有完全釋放出余弦定理的洪荒之力。接下來展示一下工業(yè)級(jí)的系統(tǒng)中是如何使用余弦定理的。這里選取了開源搜索引擎數(shù)據(jù)庫ES的內(nèi)核Lucene作為研究對(duì)象。研究的問題是:Lucene是如何使用余弦相似度進(jìn)行文檔相似度打分?
當(dāng)然,對(duì)于Lucene的實(shí)現(xiàn),它有另一個(gè)名字:向量空間模型。即許多向量化的文檔集合形成了向量空間。我們首先直接看公式:
很明顯,實(shí)際公式跟理論公式長(zhǎng)相差異很大。那么我們?cè)趺蠢斫饽?#xff1f;換言之,我們?cè)趺椿诶碚摴酵茖?dǎo)出實(shí)際公式呢?
首先需要注意的是,在Lucene中,文檔向量的特征不再是我們案例3中展示的,用的詞頻,而是TF-IDF。關(guān)于TF-IDF相關(guān)的知識(shí),比較簡(jiǎn)單,主要的思路在于:
如何量化一個(gè)詞在文檔中的關(guān)鍵程度?? TF-IDF給出的答案是綜合考慮詞頻(詞在當(dāng)前文檔中出現(xiàn)的次數(shù))以及逆文檔頻率(詞出現(xiàn)的文檔個(gè)數(shù))兩個(gè)因素。
詞在當(dāng)前文檔中出現(xiàn)次數(shù)(TF)越多,? 詞越重要
詞在其他文檔出現(xiàn)的次數(shù)(IDF)越少,詞越獨(dú)特
感興趣的話,可以自行參考其他資料,這里不展開說明。
回到我們的核心問題:?我們?cè)趺椿诶碚摴酵茖?dǎo)出實(shí)際公式呢?
四步走就可以了,如下圖:
第一步:計(jì)算向量乘法
向量乘法就是套用數(shù)學(xué)公式了。這里需要注意的是,這里有兩個(gè)簡(jiǎn)化的思想:
查詢語句中不存在的詞tf(t,q)=0
查詢語句基本沒有重復(fù)的詞tf(t,q)=1
所以我們比較簡(jiǎn)單完成了第一步推導(dǎo):
第二步: 計(jì)算查詢語句向量長(zhǎng)度|V(q)|
計(jì)算向量長(zhǎng)度,其實(shí)就是勾股定理的使用了。只不過這里是多維空間的勾股定理。
這里取名queryNorm, 表示這個(gè)操作是對(duì)向量的歸一化。這個(gè)其實(shí)是當(dāng)向量乘以queryNorm后,就變成了單位向量。單位向量的長(zhǎng)度為1,所以稱為歸一化,也就是取名norm。理解了這一層,看lucene源碼的時(shí)候,就比較容易理解了。這正如瑯琊榜的臺(tái)詞一樣:問題出自朝堂,答案卻在江湖。這里是問題出自Lucene源碼,答案卻在數(shù)學(xué)。
第三步:計(jì)算文檔向量長(zhǎng)度|V(d)|
這里其實(shí)是不能沿用第二步的做法的。前面已經(jīng)提到,向量有兩大要素:方向和長(zhǎng)度。余弦公式只考慮了方向因素。這樣在實(shí)際應(yīng)用中,余弦相似度就是向量長(zhǎng)度無關(guān)的了。
這在搜索引擎中,如果查詢語句命中了長(zhǎng)文檔和短文檔,按照余弦公式TF-IDF特征,偏向于對(duì)短小的文檔打較高的分?jǐn)?shù)。對(duì)長(zhǎng)文檔不公平,所以需要優(yōu)化一下。
這里的優(yōu)化思路就是采用文檔詞個(gè)數(shù)累積,從而降低長(zhǎng)文檔和短文檔之間的差距。當(dāng)然這里的業(yè)務(wù)訴求可能比較多樣,所以在源碼實(shí)現(xiàn)的時(shí)候,開放了接口允許用戶自定義。借以提升靈活度。
第四步:混合用戶權(quán)重和打分因子
所謂用戶權(quán)重,就是指用戶指定查詢?cè)~的權(quán)重。例如典型地競(jìng)價(jià)排名就是人為提升某些查詢?cè)~的權(quán)重。所謂打分因子,即如果一個(gè)文檔中相比其它的文檔出現(xiàn)了更多的查詢關(guān)鍵詞,那么其值越大。綜合考慮了多詞查詢的場(chǎng)景。經(jīng)過4步,我們?cè)倏赐茖?dǎo)出來的公式和實(shí)際公式,發(fā)現(xiàn)相似度非常高。
推導(dǎo)公式和官方公式基本就一致了。
五、總結(jié)
本文簡(jiǎn)單介紹了余弦相似度的數(shù)學(xué)背景。從埃及金字塔的建設(shè)問題出發(fā),引出了勾股定理,進(jìn)而引出了余弦定理。并基于向量推導(dǎo)出來了余弦公式。
接下來通過三個(gè)業(yè)務(wù)場(chǎng)景的例子,介紹余弦公式的應(yīng)用,即數(shù)學(xué)模型如何落地到業(yè)務(wù)場(chǎng)景中。這三個(gè)簡(jiǎn)單的例子代碼不過百行,能夠幫助讀者更好地理解余弦相似度。
最后介紹了一個(gè)工業(yè)級(jí)的樣例。基于Lucene構(gòu)建的ES是當(dāng)前最火熱的搜索引擎解決方案。學(xué)習(xí)余弦公式在Lucene中落地,有助于理解業(yè)界的真實(shí)玩法。進(jìn)一步提升對(duì)余弦公式的理解。
六、參考文獻(xiàn)
作者:Shuai Guangying
總結(jié)
以上是生活随笔為你收集整理的python勾股定理中三个数的关系是、找出三十以内的_从勾股定理到余弦相似度-程序员的数学基础...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux锐捷代码_告诉你Ubuntu
- 下一篇: Python中汉字繁简体互转