Пропустить дубликаты для EMR - PullRequest
2 голосов
/ 01 июня 2019

В настоящее время у меня есть огромное количество медицинских карт, состоящих из медицинских терминов, которые необходимо перевести. Из соображений стоимости мы не хотим переводить каждый термин для каждой записи. Например, если мы обнаружили, что термины в записи уже часто появляются в предыдущих записях, что означает, что эти термины могут быть переведены уже в предыдущей записи, мы не хотим переводить их снова. Меня попросили разработать программу для достижения этой цели. Подсказки, которые я получил, заключаются в том, что мне может потребоваться разбить записи до уровня алфавита, а для решения этой проблемы может потребоваться матрица. Я буквально новичок в программировании. Поэтому я ищу здесь помощь. Жестоких мыслей / предложений пока достаточно. Спасибо.

[Редактировать Spektre] перенесено из комментариев

Моя проблема сводится к следующему:

Скажем, есть два предложения A и B. A имеет m токенов (a1, a2, ……, am), а B имеет n токенов (b1, b2, ……, bn). В то время как A и B могут иметь общие токены. Поэтому мне нужна функция для оценки вероятности токенов в B, которые не покрываются A.

Токены уже сохранены в словаре.

Как это реализовать?

1 Ответ

0 голосов
/ 05 июня 2019

Так что, если я правильно понимаю, вы хотите знать, если bi не в A.

Я не пишу код на python, но вижу это так (в C ++ как языки)

bool untranslated(int j,int m,int n,string *a,string *b)
    {
    // the dictionaries are: a[m],b[n]
    for (int i=0;j<m;i++)   // inspect all tokens of A
     if (b[j]==a[i])        // if b[j] present in A
      return false;
    return true;
    }

Теперь, если словари довольно большие, вам нужно изменить линейный поиск на двоичный поиск .Также, чтобы ускорить (если слова большие), вам нужно использовать хеши ( карта хешей ) для сопоставления.Грубо, в зависимости от вашего языка, вы не можете наивно сравнивать слова с ==, а реализовать какую-то функцию, которая преобразует слово в его симплексную грамматическую форму и сохраняет в словаре только это.Это может быть довольно сложно реализовать.

Теперь вероятность всего предложения будет:

// your dictionaries:
const int m=?,n=?;   
string A[m],string B[n]; 
// code:
int j; float p;
for (p=0.0,j=0;j<n;j++)             // test all words of B
 if (untranslated(j,m,n,A,B)) p++;   // and count how many are untranslated
p/=float(n); // normalize p to <0,1> its your probability that sentence B is not in A

результирующая вероятность p находится в диапазоне <0,1>, так что если вы хотите использовать процент вместопросто умножьте его на 100.

[Edit1] вхождение bi

, что является совершенно другой проблемой, но также решаемой относительно легко.Это так же, как вычисление гистограммы:

  1. добавить счетчик для каждого слова в A словаре

    , поэтому каждая запись A будет выглядеть какэто:

    struct A_record
     {
     string word;
     int cnt;
     };
    
    int m=0;
    A_record a[];
    
  2. обработка B предложения

    по каждому слову bi поиск в словаре A.Если его нет, добавьте его в словарь и установите его счетчик на 1.Если он присутствует, просто увеличьте его счетчик на единицу.

    const int n=?;     // input sentence word count
    string b[n]={...}; // input sentence words
    int i,j;
    for (i=0;i<n;i++)  // process B
     for (j=0;j<m;j++) // search in A (should be binary search or has-map search)
      if (b[i]==a[j].word)
       {  a[j].cnt++; j=-1; break; } // here a[j].cnt is the bi occurrence you wanted if divided by m then its probability <0,1>
    if (j<0)
     { a[m].word=b[i]; a[m].cnt=1; m++; } // here no previous occurrence of bi
    

    Теперь, если вы хотите только предыдущее вхождение bi, посмотрите во время поиска соответствующее a[j].cnt.Если вы хотите, чтобы в тексте встречалось любое слово b[i], посмотрите на тот же счетчик после обработки всего текста.

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