2016-09-21 103 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美分。