【问题标题】:Indexing words of a text [closed]文本的索引词[关闭]
【发布时间】:2011-10-21 12:53:10
【问题描述】:

我有这样的文字

*嗯*我们有一条狗
*ppp* 我们要回家了
*SSS*我们回家了

在此文本中,* 之间的文本是对具有第 nr 页和第 nr 行的书的引用。在这种情况下,我只是将其缩减为三个字母。

我想创建一个以每个单词为键、行号为值的数组:

Array
(
    [we] => Array
    (
        [0]=>*mmm*,
        [1]=>*ppp*,
        [2]=>*SSS*
    )
    [have] => Array
    (
        [0] => *mmm*,
        [1] => *SSS*
    )
)

等等……

其次,我想创建一个数组,其中两个单词作为键,行号作为值

Array
(
    [we have] => array([0] => *mmm*, [1] => *SSS*),
    [have a] => array([0 => *mmm*),
    [a dog] => array([0] => *mmm*),
    [dog we] => array([0] => *mmm*),
    [we are] => array([0] => *ppp*)
)

请注意,当两个单词不在同一行时(如[dog we]),应将第一个单词的引用用作值。

我想我找到了第一个问题的解决方案。我将文本转换为数组 $text = array ([0]=>*mmm*, [1]=>"we", [2]=>"have",等等……

然后:

foreach ($text as $word)
{ 
    if($word[0] == "*")
    {
        $value = $word;
        continue;
    }
    else
    {
        $key = $word;
        if (array_key_exists($key,$dictionary))
        {
            array_push($dictionary[$key], $value);
        }
        else
        {
            $dictionary[$key] = array($value);
        }
    }
    return $dictionary;

为了创建一个包含两个单词的数组,我做了以下操作

foreach ($text as $word)
{ 
    if($word[0] == "*")
    {
        $value = $word;
        continue;
    }
    else
    {
        $key1 = $word;
        $key2 = $text[array_search($key1,$text)+1];
        if ($key2[0] == "*")
        {
            continue;
        }
    else
    {
        $key = $key1.$key2;
        if (array_key_exists($key,$dictionary))
        {
            array_push($dictionary[$key], $value);
        }
        else
        {
            $dictionary[$key] = array($value);
        }
    }
    return $dictionary;
}

由于$key = $key1.$key2;,这不起作用。似乎当密钥为[we have](如我们在mmm 中的文本中)并且稍后密钥应为[we are] 时,程序并没有什么不同。事实上,每次第一个词是“我们”时,他都会自动添加第二个词“拥有”,即使它应该是“是”。所以这意味着在遍历文本的每个单词时,$key1 不会恢复为零,而是每次第一个单词是“我们”时,值都会放在键“我们拥有”下。

任何人对此都有解决方案,或者整个事情可以更简单地完成?

PS 我希望我没有忘记很多 {} 我在没有很好概述的情况下在小屏幕上输入此内容

【问题讨论】:

  • 你能试着减少你的代码吗?您无需检查密钥是否已存在于Array 中,只需编写$dictionary[$key][] = $value 而不是带有array_key_existsarray_push 的if 块。接下来,第一个块看起来不完整,缺少} 或您已经假设的那样。请检查。

标签: php arrays indexing


【解决方案1】:

在下面的代码 sn-p 中,tokenize() 枚举 1-word 标记和 2-word 标记,以及它们的位置,reduce() 通过标记进行聚合。看看它是否适用于你的情况。

<?php
$text = array('*mmm*', 'we', 'have', 'a', 'dog', '*ppp*', 'we', 'are', 'going', 'home', '*SSS*', 'we', 'have', 'gone', 'home');

function tokenize($text, $initPosition) {
  $words = array();
  $position = $initPosition;

  foreach ($text as $value) {
    if ($value[0] === '*') {
      $position = $value;
    } else {
      $words[] = array('token' => $value, 'pos' => $position);
    }   
  }   

  $temp = $words;
  for ($i = 0; $i < count($temp); $i++) {
    if (isset($temp[$i + 1])) {
      $token = $temp[$i]['token'] . ' ' . $temp[$i + 1]['token'];
      $words[] = array('token' => $token, 'pos' => $temp[$i]['pos']);
    }   
  }   
  return $words;
}   

function reduce($words) {
  $dictionary = array();
  foreach ($words as $value) {
    if (isset($dictionary[$value['token']])) {
      $dictionary[$value['token']][] = $value['pos'];
    } else {
      $dictionary[$value['token']] = array();
      $dictionary[$value['token']][] = $value['pos'];
    }   
  }   
  return $dictionary;
}   

$words = tokenize($text, '*mmm*');
$dictionary = reduce($words);
print_r($dictionary);

【讨论】:

  • 这会生成一个数组,其中键等于文本的 1 个单词,但我的问题主要涉及生成一个键等于 2 个单词的数组:Array ( [we have] => array([0 ] => mmm, [1] => SSS), [有一个] => 数组([0 => mmm), [ a dog] => array([0] => mmm), [dog we] => array([0] => mmm), [we are] = > 数组([0] => ppp) )
  • 抱歉之前的评论,它确实有效。谢谢
猜你喜欢
  • 2021-03-21
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
相关资源
最近更新 更多