Идентификация географических положений в тексте

Мне нравятся вспомогательные функции, чтобы скрыть грубые детали bash. В этом случае это добавляет еще больше (скрытой) грубости:

# The first ! negates the result (can't use -n to achieve this)
# the second ! expands the content of varname (can't do ${$varname})
function IsDeclared_Tricky
{
  local varname="$1"
  ! [ -z ${!varname+x} ]
}

Поскольку у меня впервые были ошибки в этой реализации (вдохновленные ответами Дженса и Лайонела), я придумал другое решение:

# Ask for the properties of the variable - fails if not declared
function IsDeclared()
{
  declare -p $1 &>/dev/null
}

Я нахожу это более прямым, более застенчивым и более легким для понимания / запоминания. Тестовый пример показывает, что он эквивалентен:

function main()
{
  declare -i xyz
  local foo
  local bar=
  local baz=''

  IsDeclared_Tricky xyz; echo "IsDeclared_Tricky xyz: $?"
  IsDeclared_Tricky foo; echo "IsDeclared_Tricky foo: $?"
  IsDeclared_Tricky bar; echo "IsDeclared_Tricky bar: $?"
  IsDeclared_Tricky baz; echo "IsDeclared_Tricky baz: $?"

  IsDeclared xyz; echo "IsDeclared xyz: $?"
  IsDeclared foo; echo "IsDeclared foo: $?"
  IsDeclared bar; echo "IsDeclared bar: $?"
  IsDeclared baz; echo "IsDeclared baz: $?"
}

main

Тестовый пример также показывает, что local var НЕ НЕ объявляет var (если не следует '='). В течение достаточно долгого времени я думал, что я объявил переменные таким образом, просто чтобы теперь обнаружить, что я просто выразил свое намерение ... Я полагаю, это неоперация.

IsDeclared_Tricky xyz: 1
IsDeclared_Tricky foo: 1
IsDeclared_Tricky bar: 0
IsDeclared_Tricky baz: 0
IsDeclared xyz 1
IsDeclared boo: 1
IsDeclared bar: 0
IsDeclared baz: 0

БОНУС: usecase

Я в основном использую этот тест, чтобы задавать (и возвращать) параметры для функций несколько «элегантным» и безопасным способом (почти напоминающим интерфейс ...):

#auxiliary functions
function die()
{
  echo "Error: $1"; exit 1
}

function assertVariableDeclared()
{
  IsDeclared "$1" || die "variable not declared: $1"
}

function expectVariables()
{
  while (( $# > 0 )); do
    assertVariableDeclared $1; shift
  done
}

# actual example
function exampleFunction()
{
  expectVariables inputStr outputStr
  outputStr="$inputStr world!"
}

function bonus()
{
  local inputStr='Hello'
  local outputStr= # remove this to trigger error
  exampleFunction
  echo $outputStr
}

bonus

При вызове со всеми требуются объявленные переменные:

Hello world!

else:

Ошибка: переменная не объявлена: outputStr

9
задан Robert Elwell 29 July 2009 в 15:08
поделиться

3 ответа

Проблема, которую вы описываете, часто называется анализом географического запроса или, в более общем смысле, поиском географической информации.

Недавно на CLEF 2007 была поставлена ​​задача сделать это ( http: // www .uni-hildesheim.de / geoclef / 2007 / Query-Parsing.htm ). Команда-победитель использовала грамматику на основе правил, которая похожа на то, что вам, вероятно, не нужно. В другой статье на www2009 говорится о GeoParser: http://www2009.eprints.org/239/ .

На CIKM 2007 также есть несколько статей по поиску географической информации: http: // www.geo.unizh.ch/~rsp/gir07/accepted.html

Я не знаю ни одного программного обеспечения с открытым исходным кодом, которое делает это, но оно может быть встроено в поисковую систему, такую ​​как Lemur.

8
ответ дан 4 December 2019 в 13:49
поделиться

Ссылка для помощи: поиск geonames.org : searchterm как документ xml или json

пример: http://ws.geonames.org/search?q=troy,%20ny&maxRows=10

3
ответ дан 4 December 2019 в 13:49
поделиться

Everyblock.com применяет очень интересный подход, который фокусируется на том, как местоположения выражаются на английском языке - они в основном используют некоторые сложные и обширные регулярные выражения, которые теперь являются открытыми. Их приложение предназначено для сканирования новостных статей, обзоров и различных общедоступных каналов данных и привязки их к определенным местам, и оно хорошо работает. Выражения вроде «Пожар в здании на северо-восточном углу 20-й улицы и улицы Валенсия в Сан-Франциско» очень точно геокодированы. Вы можете изучить источник здесь . Вам, вероятно, понадобится ebpub / ebpub / geocoder / base.py , расположенный в загружаемом файле ebpub , и все вокруг него, например, начиная с класса SmartGeocoder и работая в обратном направлении. .

4
ответ дан 4 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: