New post

查找

Article
· Nov 19, 2024 2m read

Cómo ver el contenido de los archivos de journal fuera del Portal de Gestión

Preguntas frecuentes de InterSystems

Si el archivo de journal es demasiado grande para buscarlo o filtrarlo mediante el Portal de administración, podemos consultarlo mediante los dos métodos siguientes.

① Usando la utilidad ^JRNDUMP
② Usandolo en código

================================================== ========== 

① Usando la utilidad ^JRNDUMP. Por ejemplo, si deseamos seleccionar todos los registros del archivo de journal que incluyen la referencia global ^ABC, hagamos lo siguiente:

*Ejecuta todos los comandos a continuación en el espacio de nombres %SYS.

DO SELECT^JRNDUMP("C:\MyCache\mgr\journal\YYYYMMDD.001","","","^ABC",1)

Si deseamos seleccionar solo registros que coincidan exactamente con la referencia global ^ABC:

 DO SELECT^JRNDUMP("C:\MyCache\mgr\journal\YYYYMMDD.001","","","^ABC",0)

Si deseamos seleccionar solo registros para operaciones Set locales en ^ABC global, hagamos lo siguiente:

 DO SELECT^JRNDUMP("C:\MyCache\mgr\journal\YYYYMMDD.001","","","^ABC","",6)

Si deseamos seleccionar solo registros para operaciones  Set locales y remotas en el ^ABC global:

  DO SELECT^JRNDUMP("C:\MyCache\mgr\journal\YYYYMMDD.001","","","^ABC","","s")

Consulta la página del documento a continuación para obtener más detalles.

Presentando registros de journal usando la utilidad ^JRNDUMP

================================================== ========== 
② How to reference it in a program. You can use the %SYS.Journal.Record class to obtain the record contents of any journal file. Cómo usarlo en código. Podemos utilizar la clase %SYS.Journal.Record para obtener el contenido de los registros de cualquier archivo de journal.

 set jrn="C:\intersystems\cache\mgr\journal\20160101.003"
  set log="C:\temp\journal.log"

  set file=##class(%File).%New(log)
  do file.Open("WSN")
  set rs=##class(%ResultSet).%New("%SYS.Journal.Record:List")
  do rs.Execute(jrn)
  while rs.Next() {
    set time=rs.Get("TimeStamp") // Time: yyyy-mm-dd hh:mm:ss
    set type=rs.Get("TypeName")  // Type: SET, KILL, xxTrans etc.
    set gref=rs.Get("GlobalReference") // global reference
    set gval=rs.Get("NewValue")  // Updated value
    /* if gref["ABC" { */
    set line=time_" ["_type_"] "_gref
    if type="SET" { set line=line_"="_gval }
    do file.WriteLine(line)
    /* } */
  }
  do file.Close()

Consulte la referencia de la clase a continuación para obtener más detalles.

Referencia de la clase (%SYS.Journal.Record:List)

Discussion (0)1
Log in or sign up to continue
Article
· Nov 18, 2024 1m read

クラス定義に32個より多くのインデックスがあると、MS-ACCESSからそのテーブルにリンクできません。

これは、InterSystems FAQサイトの記事です。

これは、MS-ACCESSの制限事項です。

MS-ACCESSは、インデックスが32個より多いテーブルにはリンクできません。

この問題を回避する方法として、直接テーブル(クラス)をリンクするのではなく、VIEWを使用する方法があります。

Discussion (0)1
Log in or sign up to continue
Article
· Nov 18, 2024 2m read

第二十五章 TCP 客户端 服务器通信 - TCP 设备的 READ 命令

第二十五章 TCP 客户端 服务器通信 - TCP 设备的 READ 命令

TCP 设备的 READ 命令

从服务器或客户端发出 READ 命令以读取客户端或服务器设置的任何字符。

语法如下:

READ var:timeout 
READ *var:timeout
READ var#length:timeout

超时参数虽然是可选的,但强烈建议使用,因为如果指定了超时,则 READ 的成功或失败由 $TEST 特殊变量的值指示。如果在超时到期之前读取尝试成功,则 $TEST 设置为 1;如果超时到期,$TEST 设置为 0

超时参数支持秒和秒的分数到 1/100 秒。例如,1010.5.5.05

Discussion (0)1
Log in or sign up to continue
Question
· Nov 18, 2024

Add InterSystems.Data.IRISClient.dll to Nuget as a package?

Since .Net has a unified package manager system (Nuget.org) why doesn't Intersystems create and add a nuget package (.nupkg) containing the InterSystems.Data.IRISClient.dll file.

This would make it easier for external .net developers to obtain the package for creating tools and/or applications that utilize Iris/Iris4Health

Can  Intersystems create a nuget package?

5 Comments
Discussion (5)2
Log in or sign up to continue
Article
· Nov 18, 2024 6m read

Predição de Diagnósticos com Vector Search e Machine Learning

A ideia

Já estamos em 2024, a versão IRIS 2024.1 acabou de ser lançada e todo mundo está falando sobre ela por aqui. Já temos muitos tutoriais sobre busca vetorial e aplicações de chat de inteligência artificial. Hoje quero propor algo diferente. Quero apresentar uma ideia e explorar todos os seus limites, e ao longo do texto farei algumas perguntas sobre a capacidade das ferramentas utilizadas, para que depois possamos compreender não só os resultados das novas funcionalidades, mas também como a máquina as processa.

A ideia é simples: transformar as anamneses psicológicas dos pacientes em vetores e utilizá-los como base para a aprendizagem de máquina. Dessa forma, podemos construir uma máquina capaz de discernir se um paciente tem um diagnóstico a partir de sua anamnese.

Para começar, vamos testar com exemplos de anamneses de pacientes autistas e não autistas e criar um banco de dados de vetores para treiná-lo a distinguir os pacientes com transtorno do espectro autista daqueles que não o têm.

Para isso necessitaremos:

- Uma base de dados de anamneses de pacientes com e sem o transtorno (já existem alguns casos disponíveis na internet, e podemos até gerá-los nós mesmos com a ajuda da IA Google Gemini).
-Um modelo de incorporação em Python para transformar anamneses em vetores;
- InterSystems Machine Learning.

O objetivo aqui não é substituir um terapeuta ou psicólogo, mas discutir o poder e os limites das ferramentas InterSystems. E se fizermos bem, essa aplicação pode se tornar um acessório para esses profissionais.

 

Passo a passo

1- Transformar o texto em vetores

Primero temos que aprender como fazer a transformação de texto cru para vetores.

Seguindo o tutorial da documentação InterSystems, devemos escolher um módulo Python que tenha um bom modelo para o tipo de texto que vamos transformar.

Além da sugestão da documentação, quero adicionar a sugestão de usar a função Word2Vec da biblioteca Gensim, como no código abaixo. Deixo também dois sites que a explicam como um mestre: Text Vectorization Using Python: Word2Vec e Word2Vec — Skip-Gram (esse último é mais por curiosidade, achei muito interessante).

 

# importar las librerias
import gensim
from gensim.models import Word2Vec, KeyedVectors
import pandas as pd 

# una función para tratar el texto
import re
def remove_prepositions(text):
    prepositions = ['his', 'he', 'she', 'her', 'hers','it','about', 'above', 'across', 'after', 'against', 'along', 'among', 'around', 'at', 'before', 'behind', 'below', 'beneath', 'beside', 'between', 'beyond', 'but', 'by', 'concerning', 'considering', 'despite', 'down', 'during', 'except', 'for', 'from', 'in', 'inside', 'into', 'like', 'near', 'of', 'off', 'on', 'onto', 'out', 'outside', 'over', 'past', 'regarding', 'round', 'since', 'through', 'throughout', 'till', 'to', 'toward', 'under', 'underneath', 'until', 'up', 'upon', 'with', 'within', 'without']
    pattern = r'\b(' + '|'.join(prepositions) + r')\b\s*'
    text = re.sub(pattern, '', text, flags=re.IGNORECASE)
    return text

# transformar el texto en un pandas dataframe
with open('./texts/tea-adult.txt', 'r') as f:
    f = remove_prepositions(f.read())
    lines = f.split('\n')

data = pd.DataFrame(list(zip(lines))) 
data.columns = ['anamnesis']

anamnesis_new=data.anamnesis.apply(gensim.utils.simple_preprocess)

# parametros de lo modelo
model=gensim.models.Word2Vec(window=5, min_count=2, workers=4, sg=0)

# entrenar el modelo
model.build_vocab(anamnesis_new, progress_per=1000)
model.train(anamnesis_new, total_examples=model.corpus_count, epochs=model.epochs)

# salvar el modelo entrenado
model.save("./anamnesis.model")

Eu escolhi tratar o texto nesse caso usando uma simples função que encontrei em uma busca rápida, porque se retirarmos preposições e outras palavras que não têm relação com assuntos específicos, resulta em uma melhor performance e rendimento da máquina. Isso porque assim o texto é menor.

Aqui deixo minhas primeiras perguntas:

  • É melhor pré-processar o texto eliminando preposições e outras palavras irrelevantes antes de transformá-lo em vetores?
  • Uma máquina não tem o conceito de semântica. Assim, essa manobra pressupõe que não há perda de significado para o computador. Essa suposição é enganosa?

 

Criar a base de dados com os vetores em IRIS

Não quero ocupar muito do seu tempo aqui, pois a documentação InterSystems já explicou essa parte muito bem.

Resumindo, temos que criar uma tabela com uma coluna para os embeddings e um UID que faça referência ao texto original. Aí, adicionamos cada incorporação texto-vetor e seu UID na tabela:

INSERT INTO Sample.Embeddings (Embedding, UID) 
   VALUES (TO_VECTOR(?,double), ?)

 

Se você escolher usar o Word2Vec, a lista de embeddings pode ser extraída do modelo salvo em "./anamnesis.model" no exemplo acima.

Outra pergunta: o que você usou para transformar os textos em vetores? Por que escolheu esse método?

Usar o InterSystems IRIS ML para treinar a tabela

Agora que temos a tabela com os vetores, podemos adicionar uma coluna que indica se a incorporação veio de uma anamnese de um autista ou não.

Seguindo novamente a excelente documentação da InterSystems sobre esse assunto, criamos um modelo de predição a partir dessa tabela.

CREATE MODEL AnamnesiaAutistaModel PREDICTING (es_autista) FROM AnamnesiaAutista

A treinamos

TRAIN MODEL AnamnesiaAutistaModel

E a validamos com algumas anamneses que ainda não usamos.

VALIDATE MODEL AnamnesiaAutistaModelo From AnamnesiaTeste

Por fim, podemos fazer a predição em novos dados.

SELECT *, PREDICT(AnamnesiaAutistaModel) FROM NuevasAnamnesias

 

Análise matemática da solução

Solução 1: Utilizando o InterSystems IntegratedML para realizar todas as etapas descritas anteriormente, aplicamos um modelo de floresta aleatória para decidir se um teste de autismo é positivo ou negativo, com base no conhecimento fornecido ao computador. Obviamente, com a colaboração de um psicólogo no projeto, podemos adicionar, além das anamneses, uma lista de sintomas de autismo e treinar ainda mais a máquina para obter resultados melhores.

Dessa forma, o computador toma uma decisão com base em números que representam medidas de relação entre palavras. Se essa relação for similar à dos dados utilizados para treinar a máquina, ela decide que o diagnóstico é positivo. Acredito que podemos melhorar os resultados se atribuirmos pesos a essas medidas, de acordo com sua relação com a palavra "autismo". Podemos alcançar isso combinando a ferramenta com a busca vetorial antes da tomada de decisão da máquina. Seguindo o exemplo com Gensim:

similarity = model.wv.similarity(w1='autism',w2='sociability')

Então, se o computador decidir por sim, mas essa semelhança for baixa, a decisão será negativa.

Solução 2: Outra opção era simplesmente realizar uma busca vetorial em nossa tabela de incorporações. Lá teríamos usado uma similaridade de cosseno ou produto escalar e chegado a uma similaridade suficiente (algo como um valor p de 0,05) que nos diria se é um caso de autismo ou não.

Assim, temos as duas perguntas finais:

  • Para um modelo de aprendizado de máquina, o benefício de usar um vetor no lugar de um texto é óbvio em termos de desempenho, pois estamos usando números, que são mais próximos da linguagem da máquina, então pulamos algumas etapas que a máquina teria que fazer. Mas o resultado é igualmente bom?
  • Se os resultados nas duas soluções forem próximos, a busca vetorial pode ser usada como base para aprendizado de máquina e predição? Em quais casos é mais adequado utilizar um enfoque ou outro?

 

O Futuro

Um banco de dados com essas características também pode ser utilizado para pesquisas e descoberta de novas similaridades em diversos tipos de diagnósticos. Ao adicionar detalhes sobre o estilo de vida dos pacientes, além dos sintomas, a máquina pode realizar uma análise pragmática e gerar novas hipóteses para pesquisa, permitindo confirmar se a máquina interpretou corretamente as relações entre comportamentos e diagnósticos.

Discussion (0)1
Log in or sign up to continue