joeblurton / doccounter

[Obsolete] A collection of simple tools for analysing PDF, .DOCX, .DOC and .TXT files.
17 stars 14 forks source link

PDF and Doc file with same contents produce different word count #5

Open haakym opened 7 years ago

haakym commented 7 years ago

I created a doc and pdf file with the same text contents for testing purpose of this package and I found I got the following differing word counts:

I believe this is happening because of the regex used to split the text for the .doc file which appears to ignore the following string: <br /> and because there are 5 paragraphs in the text there are 5x <br /> which results in five more words. The regex in question is used in the following method:

function str_word_count_utf8($str) {
    return count(preg_split('~[^\p{L}\p{N}\']+~u',$str));
}

Here is the text content inside the documents:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ante magna, rutrum quis convallis sed, porttitor a est. In ac odio ante. Suspendisse potenti. Sed cursus et magna vitae mollis. Cras vel tortor urna. Pellentesque diam purus, placerat quis lacus eu, accumsan facilisis lectus. Duis sodales, leo at sollicitudin tincidunt, elit neque consequat metus, vitae lacinia diam felis quis augue. Nunc quis mi ipsum. Nulla et semper elit. Aliquam et sem consectetur, aliquet lectus nec, fringilla mi. Nullam eu augue sit amet est vestibulum egestas aliquam vitae quam. Aliquam consectetur nunc vitae dignissim efficitur. Interdum et malesuada fames ac ante ipsum primis in faucibus. Cras sagittis tortor ante, ac semper urna finibus a. 
Nulla facilisi. Vivamus condimentum libero eget lacus suscipit cursus. Proin congue neque nunc, a volutpat orci viverra accumsan. Vestibulum vulputate pretium ipsum. Aenean tortor nisi, interdum a arcu porttitor, tempor mollis quam. Integer in eros pretium, pretium lacus at, dictum leo. In ut elit vel dolor efficitur luctus. Quisque pellentesque, est non viverra fringilla, tellus mi gravida est, scelerisque fermentum turpis quam a tortor. Mauris eu placerat dolor. Ut gravida est aliquet diam luctus, ac ornare justo pretium. Cras a aliquam felis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed molestie arcu vel diam congue aliquet. Maecenas ullamcorper velit id orci ullamcorper ultricies. Nulla justo tellus, tristique quis ex nec, iaculis tristique metus. 
Sed maximus finibus dui sit amet tempor. Nulla ut justo volutpat, iaculis lacus in, volutpat arcu. Suspendisse dapibus arcu ac luctus lobortis. Vivamus ante ante, cursus ut nisl ut, maximus maximus tellus. Maecenas eget orci nec enim maximus vulputate. Nunc egestas, est ac tristique dignissim, nisi ligula feugiat enim, a feugiat massa risus at risus. Praesent facilisis turpis id odio tincidunt, sed tincidunt mi lobortis. Nullam gravida mollis magna ut congue. 
Fusce ultrices mauris quis lobortis rutrum. Nunc risus sapien, egestas ut orci a, lobortis viverra est. In elementum elementum leo, quis aliquam purus vulputate ac. Aliquam erat volutpat. Duis ex neque, convallis sit amet sodales et, consectetur et tortor. Donec commodo ligula vitae nulla faucibus, eget bibendum massa blandit. Pellentesque porta placerat nibh, sit amet volutpat felis consequat vitae. Interdum et malesuada fames ac ante ipsum primis in faucibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur non dignissim purus. Etiam eget sapien mattis, semper tortor vitae, sodales augue. Cras posuere ornare posuere. Nulla facilisi. Cras aliquet mi et tortor fringilla, eu eleifend felis cursus. 
Donec in leo facilisis, maximus tortor non, placerat neque. Donec vulputate erat purus, vitae auctor nisi iaculis vitae. Curabitur nisl lectus, dignissim eu convallis id, volutpat ac lectus. Proin bibendum dictum ex ut porta. Morbi leo tortor, fringilla et lectus nec, facilisis lobortis ex. Donec aliquam nec mauris id tincidunt. Cras at nunc odio. Donec eu nisi sit amet massa rutrum vehicula eget quis augue. Maecenas porta ultricies scelerisque. Duis fringilla tempor dui. Praesent nunc est, hendrerit eget viverra in, varius sed ante. Quisque hendrerit felis et purus euismod consequat.

When running the following code for the .doc file

$docFile = storage_path('app/files/doc-file.doc');
$docCounter->setFile($docFile);
$docWordCount = $docCounter->read_doc_file();

the value of $docWordCount is as follows:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ante magna, rutrum quis convallis sed, porttitor a est. In ac odio ante. Suspendisse potenti. Sed cursus et magna vitae mollis. Cras vel tortor urna. Pellentesque diam purus, placerat quis lacus eu, accumsan facilisis lectus. Duis sodales, leo at sollicitudin tincidunt, elit neque consequat metus, vitae lacinia diam felis quis augue. Nunc quis mi ipsum. Nulla et semper elit. Aliquam et sem consectetur, aliquet lectus nec, fringilla mi. Nullam eu augue sit amet est vestibulum egestas aliquam vitae quam. Aliquam consectetur nunc vitae dignissim efficitur. Interdum et malesuada fames ac ante ipsum primis in faucibus. Cras sagittis tortor ante, ac semper urna finibus a.<br />\rNulla facilisi. Vivamus condimentum libero eget lacus suscipit cursus. Proin congue neque nunc, a volutpat orci viverra accumsan. Vestibulum vulputate pretium ipsum. Aenean tortor nisi, interdum a arcu porttitor, tempor mollis quam. Integer in eros pretium, pretium lacus at, dictum leo. In ut elit vel dolor efficitur luctus. Quisque pellentesque, est non viverra fringilla, tellus mi gravida est, scelerisque fermentum turpis quam a tortor. Mauris eu placerat dolor. Ut gravida est aliquet diam luctus, ac ornare justo pretium. Cras a aliquam felis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed molestie arcu vel diam congue aliquet. Maecenas ullamcorper velit id orci ullamcorper ultricies. Nulla justo tellus, tristique quis ex nec, iaculis tristique metus.<br />\rSed maximus finibus dui sit amet tempor. Nulla ut justo volutpat, iaculis lacus in, volutpat arcu. Suspendisse dapibus arcu ac luctus lobortis. Vivamus ante ante, cursus ut nisl ut, maximus maximus tellus. Maecenas eget orci nec enim maximus vulputate. Nunc egestas, est ac tristique dignissim, nisi ligula feugiat enim, a feugiat massa risus at risus. Praesent facilisis turpis id odio tincidunt, sed tincidunt mi lobortis. Nullam gravida mollis magna ut congue.<br />\rFusce ultrices mauris quis lobortis rutrum. Nunc risus sapien, egestas ut orci a, lobortis viverra est. In elementum elementum leo, quis aliquam purus vulputate ac. Aliquam erat volutpat. Duis ex neque, convallis sit amet sodales et, consectetur et tortor. Donec commodo ligula vitae nulla faucibus, eget bibendum massa blandit. Pellentesque porta placerat nibh, sit amet volutpat felis consequat vitae. Interdum et malesuada fames ac ante ipsum primis in faucibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur non dignissim purus. Etiam eget sapien mattis, semper tortor vitae, sodales augue. Cras posuere ornare posuere. Nulla facilisi. Cras aliquet mi et tortor fringilla, eu eleifend felis cursus.<br />\rDonec in leo facilisis, maximus tortor non, placerat neque. Donec vulputate erat purus, vitae auctor nisi iaculis vitae. Curabitur nisl lectus, dignissim eu convallis id, volutpat ac lectus. Proin bibendum dictum ex ut porta. Morbi leo tortor, fringilla et lectus nec, facilisis lobortis ex. Donec aliquam nec mauris id tincidunt. Cras at nunc odio. Donec eu nisi sit amet massa rutrum vehicula eget quis augue. Maecenas porta ultricies scelerisque. Duis fringilla tempor dui. Praesent nunc est, hendrerit eget viverra in, varius sed ante. Quisque hendrerit felis et purus euismod consequat.<br />\r

please note the <br />. You might want to copy and paste into a code editor to inspect properly.

When running the following code for the .pdf file

$pdfFile = storage_path('app/files/pdf-file.pdf');
$docCounter->setFile($pdfFile);
$pdfWordCount = $docCounter->pdf2text();

the value of $docWordCount is as follows:

""
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ante magna, rutrum quis convallis \n
    sed, porttitor a est. In ac odio ante. Suspendisse potenti. Sed cursus et magna vitae mollis. Cras \n
    vel  tortor  urna.  Pellentesque  diam  purus,  placerat  quis  lacus  eu,  accumsan  facilisis  lectus.  Duis \n
    sodales,  leo  at  sollicitudin  tincidunt,  elit  neque  consequat  metus,  vitae  lacinia  diam  felis  quis \n
    augue. Nunc quis mi ipsum. Nulla et semper elit. Aliquam et sem consectetur, aliquet lectus nec, \n
    fringilla  mi.  Nullam  eu augue  sit  amet  est  vestibulum  egestas  aliquam  vitae  quam.  Aliquam \n
    consectetur nunc  vitae  dignissim  efficitur.  Interdum  et  malesuada fames  ac ante  ipsum  primis in \n
    faucibus. Cras sagittis tortor ante, ac semper urna finibus a. \n
    Nulla facilisi. Vivamus condimentum libero eget lacus suscipit cursus. Proin congue neque nunc, \n
    a  volutpat  orci  viverra  accumsan.  Vestibulum  vulputate  pretium  ipsum.  Aenean  tortor  nisi, \n
    interdum  a  arcu  porttitor,  tempor  mollis  quam.  Integer  in  eros  pretium,  pretium  lacus  at,  dictum \n
    leo.  In  ut  elit  vel  dolor  efficitur  luctus.  Quisque  pellentesque,  est  non  viverra  fringilla,  tellus  mi \n
    gravida est, scelerisque fermentum turpis quam a tortor. Mauris eu placerat dolor. Ut gravida est \n
    aliquet diam luctus, ac ornare justo pretium. Cras a aliquam felis. Class aptent taciti sociosqu ad \n
    litora  torquent  per  conubia  nostra,  per  inceptos  himenaeos.  Sed  molestie  arcu  vel  diam  congue \n
    aliquet.  Maecenas  ullamcorper  velit  id  orci  ullamcorper  ultricies.  Nulla  justo  tellus,  tristique  quis \n
    ex nec, iaculis tristique metus. \n
    Sed  maximus  finibus  dui  sit  amet  tempor.  Nulla  ut  justo  volutpat,  iaculis  lacus  in,  volutpat  arcu. \n
    Suspendisse  dapibus  arcu  ac  luctus  lobortis.  Vivamus  ante  ante,  cursus  ut  nisl  ut,  maximus \n
    maximus tellus. Maecenas eget orci nec enim maximus vulputate. Nunc egestas, est ac tristique \n
    dignissim,  nisi  ligula  feugiat  enim,  a  feugiat  massa  risus  at  risus.  Praesent  facilisis  turpis  id  odio \n
    tincidunt, sed tincidunt mi lobortis. Nullam gravida mollis magna ut congue. \n
    Fusce  ultrices  mauris  quis  lobortis  rutrum.  Nunc  risus  sapien,  egestas  ut  orci  a,  lobortis  viverra \n
    est.  In  elementum  elementum  leo,  quis  aliquam  purus  vulputate  ac.  Aliquam  erat  volutpat.  Duis \n
    ex  neque,  convallis  sit  amet  sodales  et,  consectetur  et  tortor.  Donec  commodo  ligula  vitae  nulla \n
    faucibus,  eget  bibendum  massa  blandit.  Pellentesque  porta  placerat  nibh,  sit  amet  volutpat  felis \n
    consequat  vitae.  Interdum  et  malesuada  fames  ac  ante  ipsum  primis  in  faucibus.  Lorem  ipsum \n
    dolor  sit  amet,  consectetur  adipiscing  elit.  Class  aptent  taciti  sociosqu  ad  litora  torquent  per \n
    conubia  nostra,  per  inceptos  himenaeos.  Curabitur  non  dignissim  purus.  Etiam  eget  sapien \n
    mattis,  semper  tortor  vitae,  sodales  augue.  Cras  posuere  ornare  posuere.  Nulla  facilisi.  Cras \n
    aliquet mi et tortor fringilla, eu eleifend felis cursus. \n
    Donec  in  leo  facilisis,  maximus  tortor  non,  placerat  neque.  Donec  vulputate  erat  purus,  vitae \n
    auctor  nisi  iaculis  vitae.  Curabitur  nisl  lectus,  dignissim  eu  convallis  id,  volutpat  ac  lectus.  Proin \n
    bibendum  dictum  ex  ut  porta.  Morbi  leo  tortor,  fringilla  et  lectus  nec,  facilisis  lobortis  ex.  Donec \n
    aliquam nec mauris id tincidunt. Cras at nunc odio. Donec eu nisi sit amet massa rutrum vehicula \n
    eget  quis  augue.  Maecenas  porta  ultricies  scelerisque.  Duis  fringilla  tempor  dui.  Praesent  nunc \n
    est,  hendrerit  eget  viverra  in,  varius  sed  ante.  Quisque  hendrerit  felis  et  purus  euismod \n
    consequat.
    ""
joeblurton commented 7 years ago

To be honest, my understanding of the regex is pretty limited (as this was a method described here: http://php.net/manual/en/function.str-word-count.php#107363), but I have been having persistent problems with accuracy along these lines - I'm trialing various improvements but thank you for the heads up on this issue. I'll have more of a chance to play around with these tomorrow.

haakym commented 7 years ago

Great stuff.

Regarding regex, I'm in the same boat as you. I've always found this website helpful, I hope it may help you too: http://regexr.com.

Another point I forgot to mention on how the word count is calculated is that the preg_split() is, I assume, splitting text where it would find a space/new line/paragraph etc. into an array then the array count is returned as the word count. When a document being read beings/ends with a space/new line it may add one more element to the array because of this.

Here's a simple example illustrating this using explode...

>>> $str = ',a,b,c,';
=> ",a,b,c,"
>>> $array = explode(',', $str);
=> [
     "",
     "a",
     "b",
     "c",
     "",
   ]
>>> count($array)
=> 5

I think this might be why the pdf word count returns +2 words and starts and ends with ""

joeblurton commented 7 years ago

That makes sense to me. In fact, that's incredibly useful.