2016-09-21 101 views
1

我得到了一組包含串聯詞,如以下字符串:「你的意思是」符號化一個連接字符串

longstring (two English words) 
googlecloud (a name and an English word) 

當我鍵入這些條款到谷歌,它承認的話(「長串」,「谷歌雲」)。我的應用程序需要類似的功能。

我研究了Python和ElasticSearch提供的選項。我發現的所有令牌化示例均基於空格,大寫,特殊字符等。

提供的字符串是英文的(但它們可能包含名稱),我的選項是什麼?它不一定要在特定的技術上。

我可以通過Google BigQuery完成此操作嗎?

回答

1

你也可以推出自己的實施?我這樣想着的算法:

  1. 獲取與要區分
  2. 建立一個數據結構,允許快速查找所有字的字典(我想一個trie的)
  3. 試圖找到第一個單詞(從一個字符開始,直到找到一個單詞爲止);如果找到,請使用剩餘的字符串,並執行相同的操作,直到沒有剩餘字符。如果它找不到任何東西,請回溯並擴展前面的單詞。

應該是好的,如果字符串可以拆分,但會嘗試所有可能性,如果它的胡言亂語。當然,這取決於你的字典有多大。但這只是一個快速的想法,也許它有幫助。

1

如果你選擇與BigQuery來解決這個問題,那麼下面是一個候選解決方案:所有可能的英語單詞

  1. 載入列表到表名爲words。例如,https://github.com/dwyl/english-words有約350,000字的列表。互聯網上還有其他數據集(即WordNet)免費提供。

  2. 使用標準的SQL,運行下面的查詢在候選名單:

SELECT first, second FROM ( SELECT word AS first, SUBSTR(candidate, LENGTH(word) + 1) AS second FROM dataset.words CROSS JOIN ( SELECT candidate FROM UNNEST(["longstring", "googlecloud", "helloxiuhiewuh"]) candidate) WHERE STARTS_WITH(candidate, word)) WHERE second IN (SELECT word FROM dataset.words)

在這個例子中它產生:

Row first second 
1 long string 
2 google cloud 

的英語單詞即使是非常大名單將只有幾個MB,所以這個查詢的成本是最小的。首次1 TB掃描是免費的 - 這足以在2 MB的桌面上掃描大約500,000次。之後,每增加一次掃描0.001美分。