Так что, если я правильно понимаю, вы хотите знать, если 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
, что является совершенно другой проблемой, но также решаемой относительно легко.Это так же, как вычисление гистограммы:
добавить счетчик для каждого слова в A
словаре
, поэтому каждая запись A будет выглядеть какэто:
struct A_record
{
string word;
int cnt;
};
int m=0;
A_record a[];
обработка 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]
, посмотрите на тот же счетчик после обработки всего текста.