对串联字符串进行标记

时间:2016-09-21 07:21:55

标签: python elasticsearch machine-learning google-bigquery

我有一组包含如下连接词的字符串:

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

当我在Google中输入这些字词时,它会识别“你的意思是什么?” (“长串”,“谷歌云”)。我的应用程序中需要类似的功能。

我查看了Python和ElasticSearch提供的选项。我发现的所有标记化示例都基于空格,大写字母,特殊字符等。

如果字符串是英文的(但它们可能包含名称),我有哪些选择?它不一定是特定的技术。

我可以使用Google BigQuery完成此操作吗?

2 个答案:

答案 0 :(得分:1)

您还可以推出自己的实施吗?我正在考虑这样的算法:

  1. 获取包含您要区分的所有字词的字典
  2. 构建一个允许快速查找的数据结构(我正在考虑trie
  3. 尝试找到第一个单词(从一个字符开始并增加它直到找到一个单词);如果找到,请使用剩余的字符串并执行相同操作,直到没有剩余。如果没有找到任何内容,请回溯并扩展前一个单词。
  4. 如果字符串可以拆分,应该是ok-ish,但是如果它的乱码会尝试所有可能性。当然,这取决于你的词典有多大。但这只是一个快速思考,也许它有所帮助。

答案 1 :(得分:1)

如果您确实选择使用BigQuery解决此问题,那么以下是候选解决方案:

  1. 将所有可能的英语单词列表加载到名为words的表中。例如,https://github.com/dwyl/english-words包含约350,000个单词的列表。互联网上也有其他数据集(即WordNet)。

  2. 使用标准SQL,在候选列表上运行以下查询:

  3. 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美分。