動手實現乙個基於NLP的相近單詞檢索器

2021-08-31 03:43:27 字數 1684 閱讀 7030

介紹這個專案的名字為similarvocabulary,專案本身並不複雜,使用了nlp中的詞向量來檢索到關聯程度較大的單詞,專案套用了nlp中乙個開源庫spacy.該庫自帶了乙個訓練好的模型,可以進行英文文字的**。

下面,我們以這個簡單的demo演示一下spacy庫的使用,以及介紹獲取相近單詞的**。

載入模型:

nlp = spacy.load('en_core_web_lg')

獲取輸入文字

這行**主要是用於獲取輸入文字內容,然後將輸入的文字(主要是單詞)進行預處理,生成token:

while true:

if line != :

words += line.replace( , )

line = f.read()

else:

break

nlp = spacy.load('en_core_web_lg')

print(modal loaded.)

tokens = nlp(words)

設定閾值

套用這個庫來實現相近單詞檢索的大致原理是:

通過已經訓練好的模型,通過詞向量對比給定的兩個單詞之間的「距離」,我們給定的這個閾值就是這個「距離」的上線,通過設定這個上限值,就可以獲取我們想要的輸出結果——語義相近的單詞。

我們簡單看一下設定閾值的過程:

threshold = 0.0

while threshold = 0.0:

try:

threshold = float(input(input threshold value:))

except:

threshold = 0.0

length = 3

try:

length = int(input(input result length:))

except:

length = 3

**邏輯很簡單:

要求輸入閾值,需要查詢到的相近單詞的個數。

實現對比查詢

我在這裡實現的邏輯是:給乙個語料庫資料集,資料集裡收集了絕大多數的常用英文單詞,在這個資料集中尋找與我們事先給定的單詞意思相近的結果,然後選擇n個比較優的結果返回。這部分的**是:

while true:

queue = #[['dog',0.1],['cat',0.2]...]

i = input(input your word:)

if i != :

txt = nlp(i)

for token in tokens:

score = token.similarity(txt)

if score = threshold and family_check(txt.text.strip(),token.text.strip()) 0:

if len(queue) = length:

index = 0 # in order to contrast

value = 1.0

for i in range(0,len(queue)):

if queue[i][1] value:

value = queue[i][1]

index = i if value score:

queue[index] = [token.text,score]

else:

print(queue)

用途

自己動手寫乙個單鏈表

單向鍊錶 單鏈表 是鍊錶的一種,其特點是鍊錶的鏈結方向是單向的,對鍊錶的訪問要通過順序讀取從頭部開始。鏈式儲存結構的線性表將採用一組任意的儲存單元存放線性表中的資料元素。由於不需要按順序儲存,鍊錶在插入 刪除資料元素時比順序儲存要快,但是在查詢乙個節點時則要比順序儲存要慢 使用鏈式儲存可以克服順序線...

自己動手寫乙個單鏈表

單向鍊錶 單鏈表 是鍊錶的一種,其特點是鍊錶的鏈結方向是單向的,對鍊錶的訪問要通過順序讀取從頭部開始。鏈式儲存結構的線性表將採用一組任意的儲存單元存放線性表中的資料元素。由於不需要按順序儲存,鍊錶在插入 刪除資料元素時比順序儲存要快,但是在查詢乙個節點時則要比順序儲存要慢 使用鏈式儲存可以克服順序線...

自己動手寫乙個單鏈表

單向鍊錶 單鏈表 是鍊錶的一種,其特點是鍊錶的鏈結方向是單向的,對鍊錶的訪問要通過順序讀取從頭部開始。鏈式儲存結構的線性表將採用一組任意的儲存單元存放線性表中的資料元素。由於不需要按順序儲存,鍊錶在插入 刪除資料元素時比順序儲存要快,但是在查詢乙個節點時則要比順序儲存要慢 使用鏈式儲存可以克服順序線...