Planos de descarga

Eu precisava de tentar coisas diferentes com um conjunto de dados de fórmula sensatamente enorme, para brincar com alguns pensamentos de organização de festas. A questão era, eu não tinha um conjunto de dados.

Esquece isso, pensei, há montes de planos Online-eu vou utilizar uma parte deles!

Por causa das organizações de informação implantadas como o microformato h-formula, e o esboço da fórmula de Schema.org, um grande número dos planos distribuídos online são aumentados semanticamente. Muito melhor, há uma pérola Ruby chamada hangry para analisar estas configurações. Em questão de segundos, eu estava transformando planos em informação organizada.

O que eu mais gostava era de consertos, e aqui chego ao meu próximo número: Eu tinha arranjos compreensíveis de arranjos, mas nada devidamente organizado para olhar para quantidades, descobrir similitudes ou converter unidades.

Os ingredientes são difíceis

Os primeiros exemplos que eu olhei pareciam muito simples:

 “2 colheres de sopa de manteiga”,

 “2 colheres de sopa de farinha”,

 “1/2 copo de vinho branco”,

 “1 chávena de caldo de galinha”,

Parecia que um padrão claro estava surgindo, e talvez uma linha de código Ruby fosse suficiente:

quantidade, unidade, nome = descrição.split(” “, 3)

Infelizmente, a verdade era substancialmente mais desconcertante. Descobri um número cada vez maior de modelos que não se enquadravam neste exemplo simples. Algumas fixações tinham numerosas quantidades que deveriam ter sido unidas (“3 taças e 2 colheres de sopa”, ou “2 pacotes de 10 onças”); outras tinham quantidades eletivas em métrica e magnífica, ou em taças de onças; ainda outras buscavam o nome de fixação com diretrizes de planejamento, ou registraram diferentes fixações juntas em algo semelhante.

Os casos incomuns se elevaram cada vez mais, e o meu código Ruby simples ficou cada vez mais emaranhado. Deixei de gostar do código, nessa altura, deixei de sentir que ficaria tudo bem depois da refatoração, e no final eu o descartei.

Eu precisava de um acordo totalmente diferente.

Reconhecimento de substância nomeada

Isso parecia ser a questão ideal para gerenciar a IA-I tinha pilhas de informações que eu precisava classificar; arranjar fisicamente um modelo solitário era realmente simples; mas distinguir fisicamente um exemplo geral era, na melhor das hipóteses, difícil, e até mesmo de um ponto de vista pessimista inconcebível.

Depois de pensar nas minhas escolhas, um reconhecedor de substâncias nomeado assemelhava-se ao aparelho correto a ser utilizado. Os reconhecedores de substâncias nomeados distinguem classificações pré-caracterizadas no conteúdo; para a minha situação eu precisava de um para perceber o nome, quantidades e unidades de fixação.

Eu me estabeleci sobre o Stanford NER, que usa um modelo de agrupamento de campos arbitrário contingente. Para ir diretamente ao assunto, não compreendo a matemática por trás deste tipo específico de modelo, no entanto, você pode examinar o papel1 caso precise de todas as malditas sutilezas. O importante para mim foi poder preparar este modelo NER sem qualquer outro conjunto de dados.

O procedimento que segui para preparar o meu modelo dependia do modelo de Jane Austen da Stanford NER FAQ.

Preparação do modelo

A coisa principal que fiz foi reunir as informações do meu modelo. Dentro de uma fórmula solitária, a forma como as fixações são compostas é muito uniforme. Eu precisava garantir que eu tinha um escopo decente de configurações, então juntei as fixações de cerca de 30.000 planos on-line em um rundown solitário, organizei-as arbitrariamente e escolhi os 1.500 iniciais para ser meu conjunto de preparação.

Parecia-se com isto:

açúcar de confeiteiro para polvilhar o bolo

1 1/2 chávenas de salmão fumado em cubos

1/2 copo de amêndoas inteiras (3 oz), torradas

Em seguida, utilizei uma peça do conjunto de aparelhos de PNL de Stanford para dividi-los em fichas.

A direção que acompanha o conteúdo de uso da informação padrão, e as fichas de rendimento para o rendimento padrão:

java – cp stanford-ner.jar edu.stanford.nlp.process.PTBTokenizer

Para esta situação, eu precisava de montar um modelo que compreendesse uma representação de fixação solitária, não um arranjo completo de retratos de fixação. No discurso de PNL, isso implica que cada representação de conserto deve ser vista como um relatório diferente. Para falar disso aos instrumentos do Stanford NER, temos que isolar cada arranjo de fichas com uma linha clara.

Dividi-os utilizando um pouco de conteúdo de conchas:

enquanto lê a linha; fazer

 echo $line | java -cp stanford-ner.jar edu.stanford.nlp.process.PTBTokenizer >> train.tok

 echo >> train.tok

feito < train.txt

A saída era parecida com esta:

pasteleiros

açúcar

para

varredura

o

bolo

1 1/2

taças

cortado em cubos

fumado

salmão

1/2

xícara

todo

amêndoas

-LRB-

3

oz

-RRRB-

,

tostado

O último adiantamento manual foi rotular as fichas, demonstrando qual era uma peça do nome de uma fixação, qual era uma peça da quantidade, e qual era uma peça da unidade. 1.500 modelos eram cerca de 10.000 fichas, cada uma nomeada à mão – nunca deixe que ninguém lhe revele que a IA é atractiva.

Cada ficha precisa de uma marca, mesmo as fichas que não são intrigantes, que são nomeadas com O. Stanford NER prevê que as fichas e a marca devem ser isoladas por um personagem de tabulação. Para começar, eu marquei cada ficha com O:

perl -ne ‘chomp; $_ =~ /^$/ ? print “\n” : print “$_\tO\n” {\i1}

 train.tok > train.tsv

Várias horas depois, os resultados foram algo parecidos com isto:

nome dos confeiteiros

”               NOME

nome de açúcar         

para             O

O       

o             O

bolo            O

1 1/2           QUANTIDADE

copos            UNIT

em cubos           O

n         ome fumado

n         ome de salmão

1/2             QUANTIDADE

unidade de copo           

todo           O

n        ome da amêndoa

-LRB-           O

3               QUANTIDADE

unidade de oz            

-RRRB-           O

,               O

tostado         O

Agora que o conjunto de treino estava terminado, eu podia construir o modelo:

java -cp stanford-ner.jar edu.stanford.nlp.ie.crf.CRFClassifier \

 -trainFile train.tsv {\i1}

 -serializeTo ner-model.ser.gz {\i1}

 -prop train.prop

O ficheiro train.prop que utilizei era muito semelhante ao ficheiro de exemplo do Stanford NER FAQ, austen.prop.

E lá o tinha eu! Um modelo que poderia classificar novos exemplos.