2016-09-21 6 views
1

я получил набор строк, содержащей слово каскадных кодов, такое как следующие: «Вы имели в виду»Tokenizing каскадной строки

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

Когда я печатаю эти терминов на Google, он распознает слова («длинная строка», «облако Google»). Мне нужна аналогичная функциональность в моем приложении.

Я рассмотрел параметры, предоставленные Python и ElasticSearch. Все найденные множители основаны на пробелах, верхнем регистре, специальных символах и т. Д.

Каковы мои варианты, если строки указаны на английском языке (но они могут содержать имена)? Это не должно быть связано с конкретной технологией.

Могу ли я это сделать с помощью Google BigQuery?

ответ

1

Можете ли вы также перевернуть свою собственную реализацию? Я имею в виду алгоритма, как это:

  1. Получить словарь со всеми словами, которые вы хотите, чтобы отличить
  2. Построить структуру данных, которая позволяет быстрый поиск (я имею в виду в trie)
  3. Try найти первое слово (начиная с одного символа и увеличивая его до тех пор, пока не будет найдено слово); если он найден, используйте оставшуюся строку и делайте то же самое до тех пор, пока ничего не останется. Если он ничего не находит, отступите назад и продолжите предыдущее слово.

Должно быть хорошо, если строка может быть разделена, но попробует все возможности, если ее тарабарщина. Конечно, это зависит от того, насколько большой будет ваш словарь. Но это была просто мысль, возможно, это помогает.

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 

Даже очень большой список английских слов будет всего лишь несколько МБ, поэтому стоимость этого запроса минимальна. Первое однократное сканирование на ТБ бесплатное - это достаточно хорошо для примерно 500 000 сканирований на таблице 2 МБ. После этого каждое дополнительное сканирование составляет 0,001 цента.

Смежные вопросы