ошибка сценария разбора stanford - linux bash - PullRequest
1 голос
/ 11 марта 2011

Может ли кто-нибудь помочь мне проверить мой bash-скрипт? я пытаюсь передать каталог файлов .txt в синтаксический анализатор Стэнфорда (http://nlp.stanford.edu/software/pos-tagger-faq.shtml), но я не могу заставить его работать. Я работаю над Ubuntu 10.10

цикл работает и читает нужные файлы с помощью:

#!/bin/bash -x
cd $HOME/path/to
for file in 'dir -d *'
do
#       $HOME/chinesesegmenter-2006-05-11/segment.sh ctb $file UTF-8
        echo $file
done

но с

#!/bin/bash -x
cd $HOME/yoursing/sentseg_zh
for file in 'dir -d *'
do
#       echo $file
        $HOME/chinesesegmenter-2006-05-11/segment.sh ctb $file UTF-8
done

Я получаю эту ошибку:

alvas@ikoma:~/chinesesegmenter-2006-05-11$ bash segchi.sh
Standard: CTB
File: dir
Encoding: -d
-------------------------------
Exception in thread "main" java.lang.NoClassDefFoundError: edu/stanford/nlp/ie/crf/CRFClassifier
Caused by: java.lang.ClassNotFoundException: edu.stanford.nlp.ie.crf.CRFClassifier
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: edu.stanford.nlp.ie.crf.CRFClassifier. Program will exit.

работает следующая команда:

~/chinesesegmenter-2006-05-11/segment.sh ctb ~/path/to/input.txt UTF-8

и выведите это

alvas@ikoma:~/chinesesegmenter-2006-05-11$ ./segment.sh ctb ~/path/to/input.txt UTF-8
Standard: CTB
File: /home/alvas/path/to/input.txt
Encoding: UTF-8
-------------------------------
Loading classifier from data/ctb.gz...done [1.5 sec].
Using ChineseSegmenterFeatureFactory
Reading data using CTBSegDocumentReader
Sequence tagging 7 documents
如果 您 在 新加坡 只 能 前往 一 间 俱乐部 , 祖卡 酒吧 必然 是 您 的 不二 选择 。
1018 *

Ответы [ 3 ]

3 голосов
/ 11 марта 2011

Как и : (двоеточие), которое должно быть ; или новой строкой, 'dir -d *' не делает то, что вы думаете, - цикл будет иметь только одну итерацию, где file - это длинная строка, начинающаяся с dir -d и со всеми вашими файлами впоследствии.Кроме того, вы изначально меняете путь на основе $file, но затем повторно используете переменную file в цикле, что является подозрительным.Мне нужно немного догадаться о вашем намерении, но это может быть намного проще, например:

#!/bin/bash
cd ~/path/to/whereever
for file in *
do
     ~/chinesesegmenter-2006-05-11/segment.sh ctb "$file" UTF-8
done

Даже если вы использовали (более правильную) версию с обратными галочками:

for file in `dir -d *`

... это все равно будет иметь право на Бесполезное использование ls * Award ;)

Обновление: первоначально я забыл процитировать $file, как указано в другом ответе

2 голосов
/ 11 марта 2011

Вы можете попробовать:

for file in *
do
    $HOME/segment.sh ctb "$file" UTF-8
done

Так что есть пара вещей, которые нужно исправить:

  • Не используйте : после оператора for, используйте ; или новая строка
  • Поместите кавычки вокруг объекта "$file", чтобы разрешить пробелы в имени файла
  • Если вы хотите использовать команду, в которой вы ставите 'dir -d *', вам следует использовать $(dir -d *)или угловые кавычки вместо ``
1 голос
/ 11 марта 2011
for file in 'dir -d *': do

Вы поставили двоеточие вместо точки с запятой.

Если вы хотите легкую отладку, вы можете добавить -x в качестве опции к своему шебангу:

#!/bin/bash -x

Ошибки будет легче обнаружить.

...